Author: smh
Date: Thu Mar 21 09:34:41 2013
New Revision: 248572
URL: http://svnweb.freebsd.org/changeset/base/248572

Log:
  Add TRIM support for L2ARC.
  
  This adds TRIM support to cache vdevs. When ARC buffers are removed
  from the L2ARC in arc_hdr_destroy(), arc_release() or l2arc_evict(),
  the size previously occupied by the buffer gets scheduled for TRIMming.
  As always, actual TRIMs are only issued to the L2ARC after
  txg_trim_limit.
  
  Reviewed by:  pjd (mentor)
  Approved by:  pjd (mentor)
  Obtained from:        
https://github.com/dechamps/zfs/commit/31aae373994fd112256607edba7de2359da3e9dc
  MFC after:    2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/trim_map.h
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c   Thu Mar 21 
08:38:03 2013        (r248571)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c   Thu Mar 21 
09:34:41 2013        (r248572)
@@ -130,6 +130,7 @@
 #endif
 #include <sys/callb.h>
 #include <sys/kstat.h>
+#include <sys/trim_map.h>
 #include <zfs_fletcher.h>
 #include <sys/sdt.h>
 
@@ -1691,6 +1692,8 @@ arc_hdr_destroy(arc_buf_hdr_t *hdr)
                }
 
                if (l2hdr != NULL) {
+                       trim_map_free(l2hdr->b_dev->l2ad_vdev, l2hdr->b_daddr,
+                           hdr->b_size);
                        list_remove(l2hdr->b_dev->l2ad_buflist, hdr);
                        ARCSTAT_INCR(arcstat_l2_size, -hdr->b_size);
                        kmem_free(l2hdr, sizeof (l2arc_buf_hdr_t));
@@ -3528,6 +3531,8 @@ arc_release(arc_buf_t *buf, void *tag)
        buf->b_private = NULL;
 
        if (l2hdr) {
+               trim_map_free(l2hdr->b_dev->l2ad_vdev, l2hdr->b_daddr,
+                   hdr->b_size);
                list_remove(l2hdr->b_dev->l2ad_buflist, hdr);
                kmem_free(l2hdr, sizeof (l2arc_buf_hdr_t));
                ARCSTAT_INCR(arcstat_l2_size, -buf_size);
@@ -4442,6 +4447,8 @@ l2arc_write_done(zio_t *zio)
                        list_remove(buflist, ab);
                        abl2 = ab->b_l2hdr;
                        ab->b_l2hdr = NULL;
+                       trim_map_free(abl2->b_dev->l2ad_vdev, abl2->b_daddr,
+                           ab->b_size);
                        kmem_free(abl2, sizeof (l2arc_buf_hdr_t));
                        ARCSTAT_INCR(arcstat_l2_size, -ab->b_size);
                }

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/trim_map.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/trim_map.h  Thu Mar 
21 08:38:03 2013        (r248571)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/trim_map.h  Thu Mar 
21 09:34:41 2013        (r248572)
@@ -36,7 +36,7 @@ extern "C" {
 
 extern void trim_map_create(vdev_t *vd);
 extern void trim_map_destroy(vdev_t *vd);
-extern void trim_map_free(zio_t *zio);
+extern void trim_map_free(vdev_t *vd, uint64_t offset, uint64_t size);
 extern boolean_t trim_map_write_start(zio_t *zio);
 extern void trim_map_write_done(zio_t *zio);
 

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c      Thu Mar 
21 08:38:03 2013        (r248571)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c      Thu Mar 
21 09:34:41 2013        (r248572)
@@ -36,8 +36,8 @@
  * than it would otherwise be as well as ensuring that entire
  * blocks are invalidated by writes.
  */
-#define        TRIM_ZIO_END(zio)       ((zio)->io_offset +             \
-       P2ROUNDUP((zio)->io_size, 1ULL << (zio)->io_vd->vdev_top->vdev_ashift))
+#define        TRIM_ZIO_END(vd, offset, size)  (offset +               \
+       P2ROUNDUP(size, 1ULL << vd->vdev_top->vdev_ashift))
 
 typedef struct trim_map {
        list_t          tm_head;                /* List of segments sorted by 
txg. */
@@ -272,16 +272,15 @@ trim_map_free_locked(trim_map_t *tm, uin
 }
 
 void
-trim_map_free(zio_t *zio)
+trim_map_free(vdev_t *vd, uint64_t offset, uint64_t size)
 {
-       vdev_t *vd = zio->io_vd;
        trim_map_t *tm = vd->vdev_trimmap;
 
        if (zfs_notrim || vd->vdev_notrim || tm == NULL)
                return;
 
        mutex_enter(&tm->tm_lock);
-       trim_map_free_locked(tm, zio->io_offset, TRIM_ZIO_END(zio),
+       trim_map_free_locked(tm, offset, TRIM_ZIO_END(vd, offset, size),
            vd->vdev_spa->spa_syncing_txg);
        mutex_exit(&tm->tm_lock);
 }
@@ -299,7 +298,7 @@ trim_map_write_start(zio_t *zio)
                return (B_TRUE);
 
        start = zio->io_offset;
-       end = TRIM_ZIO_END(zio);
+       end = TRIM_ZIO_END(zio->io_vd, start, zio->io_size);
        tsearch.ts_start = start;
        tsearch.ts_end = end;
 

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c   Thu Mar 21 
08:38:03 2013        (r248571)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c   Thu Mar 21 
09:34:41 2013        (r248572)
@@ -2475,7 +2475,7 @@ zio_vdev_io_start(zio_t *zio)
        }
 
        if (vd->vdev_ops->vdev_op_leaf && zio->io_type == ZIO_TYPE_FREE) {
-               trim_map_free(zio);
+               trim_map_free(vd, zio->io_offset, zio->io_size);
                return (ZIO_PIPELINE_CONTINUE);
        }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to