Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Jan 2015 16:36:40 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r276983 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201501111636.t0BGael1016733@svn.freebsd.org>

index | next in thread | raw e-mail

Author: mav
Date: Sun Jan 11 16:36:39 2015
New Revision: 276983
URL: https://svnweb.freebsd.org/changeset/base/276983

Log:
  When aggregating TRIM segments, move the new one to the list end.
  
  New segment at the list head may block all TRIM requests until txg of that
  segment can be processed.  On my random I/O tests this change reduce peak
  TRIM list length from 650 to 450 segments.  Hopefully it should reduce TRIM
  burstiness when list processing is unblocked.
  
  MFC after:	2 weeks

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

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	Sun Jan 11 16:15:31 2015	(r276982)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c	Sun Jan 11 16:36:39 2015	(r276983)
@@ -244,17 +244,23 @@ trim_map_segment_add(trim_map_t *tm, uin
 		ts_after->ts_start = ts_before->ts_start;
 		ts_after->ts_txg = txg;
 		ts_after->ts_time = time;
+		list_remove(&tm->tm_head, ts_after);
+		list_insert_tail(&tm->tm_head, ts_after);
 		kmem_free(ts_before, sizeof (*ts_before));
 	} else if (merge_before) {
 		TRIM_MAP_SINC(tm, end - ts_before->ts_end);
 		ts_before->ts_end = end;
 		ts_before->ts_txg = txg;
 		ts_before->ts_time = time;
+		list_remove(&tm->tm_head, ts_before);
+		list_insert_tail(&tm->tm_head, ts_before);
 	} else if (merge_after) {
 		TRIM_MAP_SINC(tm, ts_after->ts_start - start);
 		ts_after->ts_start = start;
 		ts_after->ts_txg = txg;
 		ts_after->ts_time = time;
+		list_remove(&tm->tm_head, ts_after);
+		list_insert_tail(&tm->tm_head, ts_after);
 	} else {
 		TRIM_MAP_SINC(tm, end - start);
 		TRIM_MAP_QINC(tm);


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501111636.t0BGael1016733>