[patch] geli: TRIM passthru

Fusselbär

Makefile Voyeur
Habe aufgeschnappt, dass da was im Gang ist für TRIM durch geli durchreichen:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=198863
Ich warte darauf gespannt und voller Vorfreude, dass es sich im FreeBSD CURRENT Zweig bewährt und später in den FreeBSD 10er Zweig einfließen kann. Oder FreeBSD 11 released wird. Je nach dem, was zuerst eintritt. :)

Dankeschön an Matthew D. Fuller, Fabian Keil, Steven Hartland, John-Mark Gurney, Pawel Jakub Dawidek und alle Tester.
 
Das ist ja einfach nur saugeil:
Code:
geli list
Geom name: ada0p4.eli
State: ACTIVE
EncryptionAlgorithm: AES-CBC
KeyLength: 128
Crypto: software
Version: 3
UsedKey: 0
Flags: SINGLE-KEY, NATIVE-BYTE-ORDER, BOOT, DELETE
KeysAllocated: 0
KeysTotal: 1
Providers:
1. Name: ada0p4.eli
   Mediasize: 116869033984 (109G)
   Sectorsize: 4096
   Mode: r1w1e1
Consumers:
1. Name: ada0p4
   Mediasize: 116869038080 (109G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 2571191296
   Mode: r1w1e1

Geom name: ada0p3.eli
State: ACTIVE
EncryptionAlgorithm: AES-XTS
KeyLength: 128
Crypto: software
Version: 7
Flags: ONETIME, W-DETACH, W-OPEN, DELETE
KeysAllocated: 3
KeysTotal: 3
Providers:
1. Name: ada0p3.eli
   Mediasize: 9013559296 (8.4G)
   Sectorsize: 4096
   Mode: r1w1e0
Consumers:
1. Name: ada0p3
   Mediasize: 9013559296 (8.4G)                                                                                                                                                                                                                                              
   Sectorsize: 512                                                                                                                                                                                                                                                           
   Stripesize: 0                                                                                                                                                                                                                                                             
   Stripeoffset: 2147566592                                                                                                                                                                                                                                                  
   Mode: r1w1e1

Das patched auf meinem FreeBSD 10.1-STABLE amd64 r280698M.
"DELETE" bei den Flags zeigt an, dass die die geli TRIM passthru Funktion eingeschaltet ist.
Matthew D. Fuller hat auch noch einen Patch to swapon for fstab auto-ELI eingereicht. Damit reicht in der /etc/fstab der trim Eintrag für swapon's automatic .eli.

Mit:
Code:
geli configure -t /dev/ada0p4.eli
... ließ sich das auf ada0p4.eli einschalten.

Ich konnte es nicht abwarten. :)
Dankeschön Matthew D. Fuller. Meine alte SSD hat nun rund 16943 Betriebsstunden. Die konnte das gut gebrauchen. Läuft hier mit KDE als Desktop für die tägliche Nutzung. :cool:
 
Weil in einem anderen Thread eine Frage zu TRIM für SSDs auftauchte, hole ich mal den geli TRIM passthru Patch wieder in Erinnerung.

Mittlerweile hat Pawel Jakub Dawidek einen RFC zum geli TRIM passthru Patch gepostet:
http://lists.freebsd.org/pipermail/freebsd-geom/2015-July/006160.html
Der Patch wurde noch mal überarbeitet wobei nun die -t und -T Schalter zum ein- und auschalten von TRIM vertauschte Rollen haben. Default soll eingeschaltetes TRIM sein, -t soll nun TRIM abschalten.
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=198863
Ich verwende bislang auf meinen FreeBSD Desktop System noch den geli TRIM passthru Patch vom März. Der tut es bei mir. Meine alte SSD hat nun rund 18278 Betriebsstunden. :)
 
wenn sie nun nurnoch per default 4k alignment machen würden, dann könnte man schon fast einfach drauflosinstallieren ;)
 
Wegen dem hindurchreichen von TRIM durch geli nochmal.
Es gab vor einigen Tagen eine kleine Änderung in stable/10/sbin/swapon/swapon.c:
https://svnweb.freebsd.org/base?view=revision&revision=295121
Daher müssten dann auch Patches für das hindurchreichen von TRIM durch geli angepasst werden.
Ich habe da jetzt mal dies hier ausprobiert:
Code:
--- sbin/swapon/swapon.c.orig   2016-03-21 03:32:00.718265403 +0100                                                                                                                                                                                                          
+++ sbin/swapon/swapon.c        2016-03-21 04:00:36.976241487 +0100                                                                                                                                                                                                          
@@ -313,7 +313,7 @@                                                                                                                                                                                                                                                          
swap_on_geli_args(const char *mntops)                                                                                                                                                                                                                                       
{                                                                                                                                                                                                                                                                           
        const char *aalgo, *ealgo, *keylen_str, *sectorsize_str;                                                                                                                                                                                                             
-       const char *aflag, *eflag, *lflag, *sflag;                                                                                                                                                                                                                           
+       const char *aflag, *eflag, *lflag, *Tflag, *sflag;                                                                                                                                                                                                                   
        char *p, *args, *token, *string, *ops;                                                                                                                                                                                                                               
        int pagesize;                                                                                                                                                                                                                                                        
        size_t pagesize_len;                                                                                                                                                                                                                                                 
@@ -321,7 +321,7 @@                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                             
        /* Use built-in defaults for geli(8). */                                                                                                                                                                                                                             
        aalgo = ealgo = keylen_str = "";                                                                                                                                                                                                                                     
-       aflag = eflag = lflag = "";                                                                                                                                                                                                                                          
+       aflag = eflag = lflag = Tflag = "";                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                             
        /* We will always specify sectorsize. */                                                                                                                                                                                                                             
        sflag = " -s ";                                                                                                                                                                                                                                                      
@@ -365,6 +365,8 @@                                                                                                                                                                                                                                                          
                                        free(ops);                                                                                                                                                                                                                           
                                        return (NULL);                                                                                                                                                                                                                       
                                }                                                                                                                                                                                                                                            
+                       } else if ((p = strstr(token, "notrim")) == token) {                                                                                                                                                                                                 
+                               Tflag = " -T ";                                                                                                                                                                                                                              
                        } else if (strcmp(token, "sw") != 0) {                                                                                                                                                                                                               
                                warnx("Invalid option: %s", token);
                                free(ops);
@@ -387,8 +389,8 @@
                sectorsize_str = p;
        }
-       (void)asprintf(&args, "%s%s%s%s%s%s%s%s -d",
-           aflag, aalgo, eflag, ealgo, lflag, keylen_str,
+        (void)asprintf(&args, "%s%s%s%s%s%s%s%s%s -d",
+            aflag, aalgo, eflag, ealgo, lflag, keylen_str, Tflag,
            sflag, sectorsize_str);
        free(ops);
Für das patchen von fstab.5 hat sich nichts geändert:
Code:
--- share/man/man5/fstab.5.orig 2016-03-21 03:31:56.242258537 +0100
+++ share/man/man5/fstab.5      2016-03-21 03:32:10.193262784 +0100
@@ -246,6 +246,7 @@
.Dq ealgo ,
.Dq aalgo ,
.Dq keylen ,
+.Dq notrim ,
and
.Dq sectorsize
options may be passed to control those
Für das patchen von geli.8, geom_eli.c, g_eli.c, g_eli.h und g_eli_ctl.c verwende ich diesen Patch:
https://bz-attachments.freebsd.org/attachment.cgi?id=158599
... aus diesem Eintrag auf dem FreeBSD Bugzilla:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=198863
Besprochen wurde das damals in diesem Thread:
http://lists.freebsd.org/pipermail/freebsd-geom/2015-July/006160.html
 
Da gab es ja kürzlich eine Änderung im 10er STABLE Zweig im sbin/swapon/swapon.c:
https://svnweb.freebsd.org/base/stable/10/sbin/swapon/swapon.c?r1=316097&r2=316096&pathrev=316097
Damit der Patch für swapon wieder geht eine kleine Anpassung:
Code:
--- sbin/swapon/swapon.c.orig   2017-04-02 20:21:36.497748000 +0200                                                                                                                                                                                                          
+++ sbin/swapon/swapon.c        2017-04-03 12:58:29.128084000 +0200                                                                                                                                                                                                          
@@ -317,7 +317,7 @@                                                                                                                                                                                                                                                          
swap_on_geli_args(const char *mntops)                                                                                                                                                                                                                                       
{                                                                                                                                                                                                                                                                           
        const char *aalgo, *ealgo, *keylen_str, *sectorsize_str;                                                                                                                                                                                                             
-       const char *aflag, *eflag, *lflag, *sflag;                                                                                                                                                                                                                           
+       const char *aflag, *eflag, *lflag, *Tflag, *sflag;                                                                                                                                                                                                                   
        char *p, *args, *token, *string, *ops;                                                                                                                                                                                                                               
        int pagesize;                                                                                                                                                                                                                                                        
        size_t pagesize_len;                                                                                                                                                                                                                                                 
@@ -325,7 +325,7 @@                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                             
        /* Use built-in defaults for geli(8). */                                                                                                                                                                                                                             
        aalgo = ealgo = keylen_str = "";                                                                                                                                                                                                                                     
-       aflag = eflag = lflag = "";                                                                                                                                                                                                                                          
+       aflag = eflag = lflag = Tflag = "";                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                             
        /* We will always specify sectorsize. */
        sflag = " -s ";
@@ -369,6 +369,8 @@
                                        free(ops);
                                        return (NULL);
                                }
+                        } else if ((p = strstr(token, "notrim")) == token) {
+                                Tflag = " -T ";
                        } else if (strcmp(token, "late") == 0) {
                                /* ignore known option */
                        } else if (strcmp(token, "noauto") == 0) {
@@ -395,8 +397,8 @@
                sectorsize_str = p;
        }
-       (void)asprintf(&args, "%s%s%s%s%s%s%s%s -d",
-           aflag, aalgo, eflag, ealgo, lflag, keylen_str,
+        (void)asprintf(&args, "%s%s%s%s%s%s%s%s%s -d",
+            aflag, aalgo, eflag, ealgo, lflag, keylen_str, Tflag,
            sflag, sectorsize_str);
        free(ops);
 
Zurück
Oben