svn commit: r275947 - in head/sys: geom/sched modules/geom/geom_sched/gs_sched

Warner Losh imp at FreeBSD.org
Sat Dec 20 00:04:04 UTC 2014


Author: imp
Date: Sat Dec 20 00:04:01 2014
New Revision: 275947
URL: https://svnweb.freebsd.org/changeset/base/275947

Log:
  Remove support for FreeBSD 7 and really old FreeBSD 8. The classifiers
  have been in the base for a while, so the gymnastics here aren't
  needed. In addition, the bugs in subr_disk.c have been fixed since
  2009, so there's no need for an identical copy of it in the tree
  anymore. There's really no need to binary patch g_io_request, so let's
  get rid of the code (not compiled in anymore) lest others think it is
  a good idea.

Deleted:
  head/sys/geom/sched/subr_disk.c
Modified:
  head/sys/geom/sched/README
  head/sys/geom/sched/g_sched.c
  head/sys/geom/sched/g_sched.h
  head/sys/geom/sched/gs_rr.c
  head/sys/modules/geom/geom_sched/gs_sched/Makefile

Modified: head/sys/geom/sched/README
==============================================================================
--- head/sys/geom/sched/README	Fri Dec 19 23:24:54 2014	(r275946)
+++ head/sys/geom/sched/README	Sat Dec 20 00:04:01 2014	(r275947)
@@ -39,37 +39,17 @@ with cvs, and lets cvs progress when com
 
 To try it out:
 
-1. USERS OF FREEBSD 7, PLEASE READ CAREFULLY THE FOLLOWING:
-
-    On loading, this module patches one kernel function (g_io_request())
-    so that I/O requests ("bio's") carry a classification tag, useful
-    for scheduling purposes.
-
-    ON FREEBSD 7, the tag is stored in an existing (though rarely used)
-    field of the "struct bio", a solution which makes this module
-    incompatible with other modules using it, such as ZFS and gjournal.
-    Additionally, g_io_request() is patched in-memory to add a call
-    to the function that initializes this field (i386/amd64 only;
-    for other architectures you need to manually patch sys/geom/geom_io.c).
-    See details in the file g_sched.c.
-
-    On FreeBSD 8.0 and above, the above trick is not necessary,
-    as the struct bio contains dedicated fields for the classifier,
-    and hooks for request classifiers.
-
-    If you don't like the above, don't run this code.
-
-2. PLEASE MAKE SURE THAT THE DISK THAT YOU WILL BE USING FOR TESTS
+1. PLEASE MAKE SURE THAT THE DISK THAT YOU WILL BE USING FOR TESTS
    DOES NOT CONTAIN PRECIOUS DATA.
     This is experimental code, so we make no guarantees, though
     I am routinely using it on my desktop and laptop.
 
-3. EXTRACT AND BUILD THE PROGRAMS
+2. EXTRACT AND BUILD THE PROGRAMS
     A 'make install' in the directory should work (with root privs),
     or you can even try the binary modules.
     If you want to build the modules yourself, look at the Makefile.
 
-4. LOAD THE MODULE, CREATE A GEOM NODE, RUN TESTS
+3. LOAD THE MODULE, CREATE A GEOM NODE, RUN TESTS
 
     The scheduler's module must be loaded first:
 

Modified: head/sys/geom/sched/g_sched.c
==============================================================================
--- head/sys/geom/sched/g_sched.c	Fri Dec 19 23:24:54 2014	(r275946)
+++ head/sys/geom/sched/g_sched.c	Sat Dec 20 00:04:01 2014	(r275947)
@@ -346,17 +346,8 @@ static inline u_long
 g_sched_classify(struct bio *bp)
 {
 
-#if __FreeBSD_version > 800098
 	/* we have classifier fields in the struct bio */
-#define HAVE_BIO_CLASSIFIER
 	return ((u_long)bp->bio_classifier1);
-#else
-#warning old version!!!
-	while (bp->bio_parent != NULL)
-		bp = bp->bio_parent;
-
-	return ((u_long)bp->bio_caller1);
-#endif
 }
 
 /* Return the hash chain for the given key. */
@@ -705,7 +696,7 @@ g_gsched_global_init(void)
 		G_SCHED_DEBUG(0, "Initializing global data.");
 		mtx_init(&me.gs_mtx, "gsched", NULL, MTX_DEF);
 		LIST_INIT(&me.gs_scheds);
-		gs_bioq_init(&me.gs_pending);
+		bioq_init(&me.gs_pending);
 		me.gs_initialized = 1;
 	}
 }
@@ -914,7 +905,7 @@ g_sched_temporary_start(struct bio *bio)
 
 	mtx_lock(&me.gs_mtx);
 	me.gs_npending++;
-	gs_bioq_disksort(&me.gs_pending, bio);
+	bioq_disksort(&me.gs_pending, bio);
 	mtx_unlock(&me.gs_mtx);
 }
 
@@ -923,7 +914,7 @@ g_sched_flush_pending(g_start_t *start)
 {
 	struct bio *bp;
 
-	while ((bp = gs_bioq_takefirst(&me.gs_pending)))
+	while ((bp = bioq_takefirst(&me.gs_pending)))
 		start(bp);
 }
 
@@ -1365,161 +1356,7 @@ g_sched_destroy_geom(struct gctl_req *re
  * to the issuer of a request in bp->bio_classifier1 as soon
  * as the bio is posted to the geom queue (and not later, because
  * requests are managed by the g_down thread afterwards).
- *
- * On older versions of the system (but this code is not used
- * in any existing release), we [ab]use the caller1 field in the
- * root element of the bio tree to store the classification info.
- * The marking is done at the beginning of g_io_request()
- * and only if we find that the field is NULL.
- *
- * To avoid rebuilding the kernel, this module will patch the
- * initial part of g_io_request() so it jumps to some hand-coded
- * assembly that does the marking and then executes the original
- * body of g_io_request().
- *
- * fake_ioreq[] is architecture-specific machine code
- * that implements the above. CODE_SIZE, STORE_SIZE etc.
- * are constants used in the patching routine. Look at the
- * code in g_ioreq_patch() for the details.
- */
-
-#ifndef HAVE_BIO_CLASSIFIER
-/*
- * Support for old FreeBSD versions
- */
-#if defined(__i386__)
-#define	CODE_SIZE	29
-#define	STORE_SIZE	5
-#define	EPILOGUE	5
-#define	SIZE		(CODE_SIZE + STORE_SIZE + EPILOGUE)
-
-static u_char fake_ioreq[SIZE] = {
-	0x8b, 0x44, 0x24, 0x04,		/* mov bp, %eax */
-	/* 1: */
-	0x89, 0xc2,			/* mov %eax, %edx # edx = bp */
-	0x8b, 0x40, 0x64,		/* mov bp->bio_parent, %eax */
-	0x85, 0xc0,			/* test %eax, %eax */
-	0x75, 0xf7,			/* jne 1b */
-	0x8b, 0x42, 0x30,		/* mov bp->bp_caller1, %eax */
-	0x85, 0xc0,			/* test %eax, %eax */
-	0x75, 0x09,			/* jne 2f */
-	0x64, 0xa1, 0x00, 0x00,		/* mov %fs:0, %eax */
-	0x00, 0x00,
-	0x89, 0x42, 0x30,		/* mov %eax, bp->bio_caller1 */
-	/* 2: */
-        0x55, 0x89, 0xe5, 0x57, 0x56,
-	0xe9, 0x00, 0x00, 0x00, 0x00,	/* jmp back... */
-};
-#elif defined(__amd64)
-#define	CODE_SIZE	38
-#define	STORE_SIZE	6
-#define	EPILOGUE	5
-#define	SIZE		(CODE_SIZE + STORE_SIZE + EPILOGUE)
-
-static u_char fake_ioreq[SIZE] = {
-	0x48, 0x89, 0xf8,		/* mov bp, %rax */
-	/* 1: */
-	0x48, 0x89, 0xc2,		/* mov %rax, %rdx # rdx = bp */
-	0x48, 0x8b, 0x82, 0xa8,		/* mov bp->bio_parent, %rax */
-	0x00, 0x00, 0x00,
-	0x48, 0x85, 0xc0,		/* test %rax, %rax */
-	0x75, 0xf1,			/* jne 1b */
-	0x48, 0x83, 0x7a, 0x58,		/* cmp $0, bp->bp_caller1 */
-	0x00,
-	0x75, 0x0d,			/* jne 2f */
-	0x65, 0x48, 0x8b, 0x04,		/* mov %gs:0, %rax */
-	0x25, 0x00, 0x00, 0x00,
-	0x00,
-	0x48, 0x89, 0x42, 0x58,		/* mov %rax, bp->bio_caller1 */
-	/* 2: */
-	0x55, 0x48, 0x89, 0xe5, 0x41, 0x56,
-	0xe9, 0x00, 0x00, 0x00, 0x00,	/* jmp back... */
-};
-#else /* neither x86 nor amd64 */
-static void
-g_new_io_request(struct bio *bp, struct g_consumer *cp)
-{
-	struct bio *top = bp;
-
-        /*
-         * bio classification: if bio_caller1 is available in the
-         * root of the 'struct bio' tree, store there the thread id
-         * of the thread that originated the request.
-         * More sophisticated classification schemes can be used.
-         */
-	while (top->bio_parent)
-		top = top->bio_parent;
-
-	if (top->bio_caller1 == NULL)
-		top->bio_caller1 = curthread;
-}
-
-#error please add the code above in g_new_io_request() to the beginning of \
-	/sys/geom/geom_io.c::g_io_request(), and remove this line.
-#endif /* end of arch-specific code */
-
-static int
-g_ioreq_patch(void)
-{
-	u_char *original;
-	u_long ofs;
-	int found;
-
-	if (me.gs_patched)
-		return (-1);
-
-	original = (u_char *)g_io_request;
-
-	found = !bcmp(original, fake_ioreq + CODE_SIZE, STORE_SIZE);
-	if (!found)
-		return (-1);
-
-	/* Jump back to the original + STORE_SIZE. */
-	ofs = (original + STORE_SIZE) - (fake_ioreq + SIZE);
-	bcopy(&ofs, fake_ioreq + CODE_SIZE + STORE_SIZE + 1, 4);
-
-	/* Patch the original address with a jump to the trampoline. */
-	*original = 0xe9;     /* jump opcode */
-	ofs = fake_ioreq - (original + 5);
-	bcopy(&ofs, original + 1, 4);
-
-	me.gs_patched = 1;
-
-	return (0);
-}
-
-/*
- * Restore the original code, this is easy.
  */
-static void
-g_ioreq_restore(void)
-{
-	u_char *original;
-
-	if (me.gs_patched) {
-		original = (u_char *)g_io_request;
-		bcopy(fake_ioreq + CODE_SIZE, original, STORE_SIZE);
-		me.gs_patched = 0;
-	}
-}
-
-static inline void
-g_classifier_ini(void)
-{
-
-	g_ioreq_patch();
-}
-
-static inline void
-g_classifier_fini(void)
-{
-
-	g_ioreq_restore();
-}
-
-/*--- end of support code for older FreeBSD versions */
-
-#else /* HAVE_BIO_CLASSIFIER */
 
 /*
  * Classifier support for recent FreeBSD versions: we use
@@ -1552,7 +1389,6 @@ g_classifier_fini(void)
 
 	g_unregister_classifier(&g_sched_classifier);
 }
-#endif /* HAVE_BIO_CLASSIFIER */
 
 static void
 g_sched_init(struct g_class *mp)

Modified: head/sys/geom/sched/g_sched.h
==============================================================================
--- head/sys/geom/sched/g_sched.h	Fri Dec 19 23:24:54 2014	(r275946)
+++ head/sys/geom/sched/g_sched.h	Sat Dec 20 00:04:01 2014	(r275947)
@@ -120,19 +120,6 @@ struct g_sched_softc {
 #define	G_SCHED_PROXYING	1
 #define	G_SCHED_FLUSHING	2
 
-/*
- * Temporary- our own version of the disksort, because the
- * version in 7.x and 8.x before march 2009 is buggy.
- */
-void gs_bioq_init(struct bio_queue_head *);
-void gs_bioq_remove(struct bio_queue_head *, struct bio *);
-void gs_bioq_flush(struct bio_queue_head *, struct devstat *, int);
-void gs_bioq_insert_head(struct bio_queue_head *, struct bio *);
-void gs_bioq_insert_tail(struct bio_queue_head *, struct bio *);
-struct bio *gs_bioq_first(struct bio_queue_head *);
-struct bio *gs_bioq_takefirst(struct bio_queue_head *);
-void gs_bioq_disksort(struct bio_queue_head *, struct bio *);
-
 #endif	/* _KERNEL */
 
 #endif	/* _G_SCHED_H_ */

Modified: head/sys/geom/sched/gs_rr.c
==============================================================================
--- head/sys/geom/sched/gs_rr.c	Fri Dec 19 23:24:54 2014	(r275946)
+++ head/sys/geom/sched/gs_rr.c	Sat Dec 20 00:04:01 2014	(r275947)
@@ -315,7 +315,7 @@ g_rr_init_class(void *data, void *priv)
 	struct g_rr_softc *sc = data;
 	struct g_rr_queue *qp = priv;
 
-	gs_bioq_init(&qp->q_bioq);
+	bioq_init(&qp->q_bioq);
 
 	/*
 	 * Set the initial parameters for the client:
@@ -350,7 +350,7 @@ g_rr_fini_class(void *data, void *priv)
 {
 	struct g_rr_queue *qp = priv;
 
-	KASSERT(gs_bioq_first(&qp->q_bioq) == NULL,
+	KASSERT(bioq_first(&qp->q_bioq) == NULL,
 			("released nonempty queue"));
 	qp->q_sc->sc_nqueues--;
 	me.queues--;
@@ -438,7 +438,7 @@ g_rr_next(void *data, int force)
 		qp->q_flags &= ~G_FLAG_COMPLETED;
 	}
 
-	bp = gs_bioq_takefirst(&qp->q_bioq);	/* surely not NULL */
+	bp = bioq_takefirst(&qp->q_bioq);	/* surely not NULL */
 	qp->q_service += bp->bio_length;	/* charge the service */
 
 	/*
@@ -456,7 +456,7 @@ g_rr_next(void *data, int force)
 	 *    on read or writes (e.g., anticipate only on reads).
 	 */
 	expired = g_rr_queue_expired(qp);	/* are we expired ? */
-	next = gs_bioq_first(&qp->q_bioq);	/* do we have one more ? */
+	next = bioq_first(&qp->q_bioq);	/* do we have one more ? */
  	if (expired) {
 		sc->sc_active = NULL;
 		/* Either requeue or release reference. */
@@ -538,7 +538,7 @@ g_rr_start(void *data, struct bio *bp)
 	if (qp == NULL)
 		return (-1); /* allocation failed, tell upstream */
 
-	if (gs_bioq_first(&qp->q_bioq) == NULL) {
+	if (bioq_first(&qp->q_bioq) == NULL) {
 		/*
 		 * We are inserting into an empty queue.
 		 * Reset its state if it is sc_active,
@@ -560,7 +560,7 @@ g_rr_start(void *data, struct bio *bp)
 
 	/* Inherit the reference returned by g_rr_queue_get(). */
 	bp->bio_caller1 = qp;
-	gs_bioq_disksort(&qp->q_bioq, bp);
+	bioq_disksort(&qp->q_bioq, bp);
 
 	return (0);
 }

Modified: head/sys/modules/geom/geom_sched/gs_sched/Makefile
==============================================================================
--- head/sys/modules/geom/geom_sched/gs_sched/Makefile	Fri Dec 19 23:24:54 2014	(r275946)
+++ head/sys/modules/geom/geom_sched/gs_sched/Makefile	Sat Dec 20 00:04:01 2014	(r275947)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 KMOD=   geom_sched
-SRCS=   g_sched.c subr_disk.c
+SRCS=   g_sched.c
 
 # ../Makefile.inc automatically included
 .include <bsd.kmod.mk>


More information about the svn-src-head mailing list