Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Feb 2018 05:43:50 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r329814 - head/sys/cam
Message-ID:  <201802220543.w1M5hobv068907@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Thu Feb 22 05:43:50 2018
New Revision: 329814
URL: https://svnweb.freebsd.org/changeset/base/329814

Log:
  Note when we tick.
  
  To help implement a policy of 'queue all trims until next I/O sched
  tick' policy to help coalesce them, note when we tick so we can do
  something special on the first call after the tick to get more work.
  
  Sponsored by: Netflix

Modified:
  head/sys/cam/cam_iosched.c

Modified: head/sys/cam/cam_iosched.c
==============================================================================
--- head/sys/cam/cam_iosched.c	Thu Feb 22 05:43:45 2018	(r329813)
+++ head/sys/cam/cam_iosched.c	Thu Feb 22 05:43:50 2018	(r329814)
@@ -60,6 +60,19 @@ static MALLOC_DEFINE(M_CAMSCHED, "CAM I/O Scheduler",
     "CAM I/O Scheduler buffers");
 
 /*
+ * Trim or similar currently pending completion. Should only be set for
+ * those drivers wishing only one Trim active at a time.
+ */
+#define CAM_IOSCHED_FLAG_TRIM_ACTIVE	(1ul << 0)
+			/* Callout active, and needs to be torn down */
+#define CAM_IOSCHED_FLAG_CALLOUT_ACTIVE (1ul << 1)
+			/* Timer has just ticked */
+#define CAM_IOSCHED_FLAG_TICK		(1ul << 2)
+
+			/* Periph drivers set these flags to indicate work */
+#define CAM_IOSCHED_FLAG_WORK_FLAGS	((0xffffu) << 16)
+
+/*
  * Default I/O scheduler for FreeBSD. This implementation is just a thin-vineer
  * over the bioq_* interface, with notions of separate calls for normal I/O and
  * for trims.
@@ -574,6 +587,7 @@ cam_iosched_ticker(void *arg)
 	cam_iosched_limiter_tick(&isc->write_stats);
 	cam_iosched_limiter_tick(&isc->trim_stats);
 
+	isc->flags |= CAM_IOSCHED_FLAGS_TICK;
 	cam_iosched_schedule(isc, isc->periph);
 
 	/*
@@ -701,17 +715,6 @@ cam_iosched_cl_maybe_steer(struct control_loop *clp)
 }
 #endif
 
-/*
- * Trim or similar currently pending completion. Should only be set for
- * those drivers wishing only one Trim active at a time.
- */
-#define CAM_IOSCHED_FLAG_TRIM_ACTIVE	(1ul << 0)
-			/* Callout active, and needs to be torn down */
-#define CAM_IOSCHED_FLAG_CALLOUT_ACTIVE (1ul << 1)
-
-			/* Periph drivers set these flags to indicate work */
-#define CAM_IOSCHED_FLAG_WORK_FLAGS	((0xffffu) << 16)
-
 #ifdef CAM_IOSCHED_DYNAMIC
 static void
 cam_iosched_io_metric_update(struct cam_iosched_softc *isc,
@@ -1322,6 +1325,10 @@ struct bio *
 cam_iosched_next_bio(struct cam_iosched_softc *isc)
 {
 	struct bio *bp;
+	bool wastick;
+	
+	wastick = !!(isc->flags & CAM_IOSCHED_FLAGS_TICK);
+	isc->flags &= ~CAM_IOSCHED_FLAGS_TICK;
 
 	/*
 	 * See if we have a trim that can be scheduled. We can only send one



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