Date: Thu, 8 Jan 2009 12:10:11 +0000 (UTC) From: Luigi Rizzo <luigi@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r186893 - in user/luigi/geom_sched/sys: geom geom/sched i386/conf sys Message-ID: <200901081210.n08CABiJ021906@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: luigi Date: Thu Jan 8 12:10:11 2009 New Revision: 186893 URL: http://svn.freebsd.org/changeset/base/186893 Log: 1. restore original structure for struct bio -- now the classification info is stored by g_io_request() in the bio_caller1 field in the first bio of the geom chain. 2. create a DISKLESS configuration for tests Added: user/luigi/geom_sched/sys/i386/conf/DISKLESS user/luigi/geom_sched/sys/i386/conf/DISKLESS.env Modified: user/luigi/geom_sched/sys/geom/geom_io.c user/luigi/geom_sched/sys/geom/sched/g_as.c user/luigi/geom_sched/sys/geom/sched/g_gsched.h user/luigi/geom_sched/sys/geom/sched/g_rr.c user/luigi/geom_sched/sys/geom/sched/gs_as.c user/luigi/geom_sched/sys/geom/sched/gs_rr.c user/luigi/geom_sched/sys/sys/bio.h Modified: user/luigi/geom_sched/sys/geom/geom_io.c ============================================================================== --- user/luigi/geom_sched/sys/geom/geom_io.c Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/geom/geom_io.c Thu Jan 8 12:10:11 2009 (r186893) @@ -172,7 +172,6 @@ g_clone_bio(struct bio *bp) bp2->bio_offset = bp->bio_offset; bp2->bio_data = bp->bio_data; bp2->bio_attribute = bp->bio_attribute; - bp2->bio_thread = bp->bio_thread; bp->bio_children++; } #ifdef KTR @@ -370,9 +369,19 @@ g_io_request(struct bio *bp, struct g_co bp->bio_error = 0; bp->bio_completed = 0; - /* Pass down the thread that issued the bio. */ - if (bp->bio_thread == NULL) - bp->bio_thread = curthread; + /* + * Scheduler support: if this is the first element in the geom + * chain (we know from bp->bio_parent == NULL), store + * the thread that originated the request in bp->bio_caller1, + * which should be unused in this particular entry (at least + * with the code in 7.1/8.0). + */ + if (bp->bio_parent == NULL) { + if (bp->bio_caller1 != NULL) + printf("unexpected bio_caller1 %p\n", bp->bio_caller1); + else + bp->bio_caller1 = (void *)curthread->td_tid; + } KASSERT(!(bp->bio_flags & BIO_ONQUEUE), ("Bio already on queue bp=%p", bp)); Modified: user/luigi/geom_sched/sys/geom/sched/g_as.c ============================================================================== --- user/luigi/geom_sched/sys/geom/sched/g_as.c Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/geom/sched/g_as.c Thu Jan 8 12:10:11 2009 (r186893) @@ -49,7 +49,7 @@ struct g_as_softc { struct g_geom *sc_geom; - struct thread *sc_curthread; + u_long sc_curkey; int sc_status; long sc_batch; @@ -76,7 +76,7 @@ g_as_dispatch(struct g_as_softc *sc) * scheduler starve other threads while an aggressive one * is making continuously new requests. */ - sc->sc_curthread = NULL; + sc->sc_curkey = 0; bio = bioq_takefirst(&sc->sc_bioq); if (bio != NULL) { @@ -130,7 +130,7 @@ g_as_start(void *data, struct bio *bio) * stop the timer and dispatch it, otherwise do nothing. */ if (sc->sc_status == G_AS_NOWAIT || - bio->bio_thread == sc->sc_curthread) { + g_sched_classify(bio) == sc->sc_curkey) { callout_stop(&sc->sc_wait); g_as_dispatch(sc); } @@ -152,7 +152,7 @@ g_as_done(void *data, struct bio *bio) /* * Start waiting for a new request from curthread. */ - sc->sc_curthread = bio->bio_thread; + sc->sc_curkey = g_sched_classify(bio); sc->sc_status = G_AS_WAITING; callout_reset(&sc->sc_wait, G_AS_WAIT_EXPIRE, g_as_wait_timeout, sc); @@ -172,7 +172,7 @@ g_as_init(struct g_geom *geom) sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); sc->sc_geom = geom; - sc->sc_curthread = NULL; + sc->sc_curkey = 0; sc->sc_status = G_AS_NOWAIT; callout_init(&sc->sc_wait, CALLOUT_MPSAFE); Modified: user/luigi/geom_sched/sys/geom/sched/g_gsched.h ============================================================================== --- user/luigi/geom_sched/sys/geom/sched/g_gsched.h Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/geom/sched/g_gsched.h Thu Jan 8 12:10:11 2009 (r186893) @@ -70,6 +70,27 @@ void g_sched_lock(struct g_geom *gp); void g_sched_unlock(struct g_geom *gp); /* + * Lookup the identity of the issuer of the original request. + * In the current implementation we use the curthread of the + * issuer, but different mechanisms may be implemented later + * so we do not make assumptions on the return value which for + * us is just an opaque identifier. + * For the time being we make this inline. + */ +static inline +u_long g_sched_classify(struct bio *bp) +{ + + if (bp == NULL) { + printf("g_sched_classify: NULL bio\n"); + return (0); /* as good as anything */ + } + while (bp->bio_parent != NULL) + bp = bp->bio_parent; + return ((u_long)(bp->bio_caller1)); +} + +/* * Declaration of a scheduler module. */ int g_gsched_modevent(module_t mod, int cmd, void *arg); Modified: user/luigi/geom_sched/sys/geom/sched/g_rr.c ============================================================================== --- user/luigi/geom_sched/sys/geom/sched/g_rr.c Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/geom/sched/g_rr.c Thu Jan 8 12:10:11 2009 (r186893) @@ -58,7 +58,6 @@ struct g_rr_queue { int q_refs; int q_status; u_long q_key; - struct proc *q_proc; struct bio_queue_head q_bioq; unsigned int q_service; @@ -94,13 +93,6 @@ struct g_rr_softc { struct callout sc_wait; }; -static inline u_long -g_rr_key(struct thread *tp) -{ - - return (tp != NULL ? tp->td_tid : 0); -} - /* Return the hash chain for the given key. */ static inline struct g_hash * g_rr_hash(struct g_rr_softc *sc, u_long key) @@ -114,13 +106,11 @@ g_rr_hash(struct g_rr_softc *sc, u_long * it if necessary. */ static struct g_rr_queue * -g_rr_queue_get(struct g_rr_softc *sc, struct thread *tp) +g_rr_queue_get(struct g_rr_softc *sc, u_long key) { struct g_hash *bucket; struct g_rr_queue *qp; - u_long key; - key = g_rr_key(tp); bucket = g_rr_hash(sc, key); LIST_FOREACH(qp, bucket, q_hash) { if (qp->q_key == key) { @@ -136,7 +126,6 @@ g_rr_queue_get(struct g_rr_softc *sc, st qp->q_refs = 2; qp->q_key = key; - qp->q_proc = tp->td_proc; bioq_init(&qp->q_bioq); qp->q_budget = G_RR_DEFAULT_BUDGET; LIST_INSERT_HEAD(bucket, qp, q_hash); @@ -265,7 +254,7 @@ g_rr_start(void *data, struct bio *bp) sc = data; /* Get the queue for the thread that issued the request. */ - qp = g_rr_queue_get(sc, bp->bio_thread); + qp = g_rr_queue_get(sc, g_sched_classify(bp)); if (qp == NULL) { g_io_request(bp, LIST_FIRST(&sc->sc_geom->consumer)); return; Modified: user/luigi/geom_sched/sys/geom/sched/gs_as.c ============================================================================== --- user/luigi/geom_sched/sys/geom/sched/gs_as.c Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/geom/sched/gs_as.c Thu Jan 8 12:10:11 2009 (r186893) @@ -50,7 +50,7 @@ struct gs_as_softc { struct disk *sc_disk; - struct thread *sc_curthread; + u_long sc_curkey; int sc_status; long sc_batch; @@ -83,7 +83,7 @@ gs_as_next(void *data, int force) * scheduler starve other threads while an aggressive one * is making continuously new requests. */ - sc->sc_curthread = NULL; + sc->sc_curkey = NULL; bio = bioq_takefirst(&sc->sc_bioq); if (bio != NULL) { @@ -123,7 +123,7 @@ gs_as_wait_timeout(void *data) mtx_lock(&dp->d_sched_lock); /* - * We were waiting for a new request for curthread, it did + * We were waiting for a new request for curkey, it did * not come, just dispatch the next one. */ if (sc->sc_status == G_AS_WAITING) @@ -148,7 +148,7 @@ gs_as_start(void *data, struct bio *bio) * stop the timer and dispatch it, otherwise do nothing. */ if (sc->sc_status == G_AS_NOWAIT || - bio->bio_thread == sc->sc_curthread) { + g_sched_classify(bio) == sc->sc_curkey) { callout_stop(&sc->sc_wait); sc->sc_status = G_AS_NOWAIT; } @@ -164,7 +164,8 @@ gs_as_done(void *data, struct bio *bio) if (sc->sc_status == G_AS_WAITREQ) { next = bioq_first(&sc->sc_bioq); - if (next != NULL && next->bio_thread == bio->bio_thread) { + if (next != NULL && + g_sched_classify(next) == g_sched_classify(bio)) { /* * Don't wait if the current thread already * has pending requests. This is not complete, @@ -177,11 +178,11 @@ gs_as_done(void *data, struct bio *bio) } /* Start waiting for a new request from curthread. */ - sc->sc_curthread = bio->bio_thread; + sc->sc_curkey = g_sched_classify(bio); sc->sc_status = G_AS_WAITING; callout_reset(&sc->sc_wait, G_AS_WAIT_EXPIRE, gs_as_wait_timeout, sc); - G_SCHED_DEBUG(2, "gs_as: waiting for %p", sc->sc_curthread); + G_SCHED_DEBUG(2, "gs_as: waiting for %lu", sc->sc_curkey); return (0); } @@ -196,7 +197,7 @@ gs_as_init(struct disk *dp) sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); sc->sc_disk = dp; - sc->sc_curthread = NULL; + sc->sc_curkey = 0; sc->sc_status = G_AS_NOWAIT; callout_init(&sc->sc_wait, CALLOUT_MPSAFE); Modified: user/luigi/geom_sched/sys/geom/sched/gs_rr.c ============================================================================== --- user/luigi/geom_sched/sys/geom/sched/gs_rr.c Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/geom/sched/gs_rr.c Thu Jan 8 12:10:11 2009 (r186893) @@ -61,7 +61,6 @@ struct gs_rr_queue { int q_refs; int q_status; u_long q_key; - struct proc *q_proc; struct bio_queue_head q_bioq; unsigned int q_service; @@ -99,13 +98,6 @@ struct gs_rr_softc { struct callout sc_wait; }; -static inline u_long -gs_rr_key(struct thread *tp) -{ - - return (tp != NULL ? tp->td_tid : 0); -} - /* Return the hash chain for the given key. */ static inline struct gs_hash * gs_rr_hash(struct gs_rr_softc *sc, u_long key) @@ -119,13 +111,11 @@ gs_rr_hash(struct gs_rr_softc *sc, u_lon * it if necessary. */ static struct gs_rr_queue * -gs_rr_queue_get(struct gs_rr_softc *sc, struct thread *tp) +gs_rr_queue_get(struct gs_rr_softc *sc, u_long key) { struct gs_hash *bucket; struct gs_rr_queue *qp, *new_qp; - u_long key; - key = gs_rr_key(tp); new_qp = NULL; bucket = gs_rr_hash(sc, key); retry: @@ -159,7 +149,6 @@ retry: new_qp->q_refs = 2; new_qp->q_key = key; - new_qp->q_proc = tp->td_proc; bioq_init(&new_qp->q_bioq); new_qp->q_budget = G_RR_DEFAULT_BUDGET; LIST_INSERT_HEAD(bucket, new_qp, q_hash); @@ -238,7 +227,7 @@ gs_rr_start(void *data, struct bio *bp) sc = data; /* Get the queue for the thread that issued the request. */ - qp = gs_rr_queue_get(sc, bp->bio_thread); + qp = gs_rr_queue_get(sc, g_sched_classify(bp)); if (bioq_first(&qp->q_bioq) == NULL) { /* We're inserting into an empty queue... */ if (qp == sc->sc_active) { Added: user/luigi/geom_sched/sys/i386/conf/DISKLESS ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/luigi/geom_sched/sys/i386/conf/DISKLESS Thu Jan 8 12:10:11 2009 (r186893) @@ -0,0 +1,25 @@ +# +# $FreeBSD: src/sys/i386/conf/DISKLESS,v 1.474.2.14 2008/08/29 18:54:35 jhb Exp $ + +include "GENERIC" +ident DISKLESS + +# Make some environment vars available +env "DISKLESS.env" + +# To statically compile in device wiring instead of /boot/device.hints +hints "GENERIC.hints" # Default places to look for devices. + +# make sure we start with an open firewall +options IPFIREWALL +options IPFIREWALL_DEFAULT_TO_ACCEPT +options IPDIVERT +options DUMMYNET + +# added against GENERIC +options BOOTP +options BOOTP_NFSROOT +options BOOTP_COMPAT +options INCLUDE_CONFIG_FILE # Include this file in kernel +options KDB +options DDB Added: user/luigi/geom_sched/sys/i386/conf/DISKLESS.env ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/luigi/geom_sched/sys/i386/conf/DISKLESS.env Thu Jan 8 12:10:11 2009 (r186893) @@ -0,0 +1,2 @@ +# you can put here env/kenv variables +# machdep.bios.pnp=disable Modified: user/luigi/geom_sched/sys/sys/bio.h ============================================================================== --- user/luigi/geom_sched/sys/sys/bio.h Thu Jan 8 11:09:27 2009 (r186892) +++ user/luigi/geom_sched/sys/sys/bio.h Thu Jan 8 12:10:11 2009 (r186893) @@ -42,7 +42,6 @@ struct disk; struct bio; -struct thread; typedef void bio_task_t(void *); @@ -79,9 +78,6 @@ struct bio { bio_task_t *bio_task; /* Task_queue handler */ void *bio_task_arg; /* Argument to above */ - - struct thread *bio_thread; /* Thread that issued the request */ - #ifdef DIAGNOSTIC void *_bio_caller1; void *_bio_caller2;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901081210.n08CABiJ021906>