Date: Mon, 26 Aug 2013 10:32:37 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254903 - projects/camlock/sys/geom Message-ID: <201308261032.r7QAWbPr080408@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Mon Aug 26 10:32:36 2013 New Revision: 254903 URL: http://svnweb.freebsd.org/changeset/base/254903 Log: Declare GEOM direct dispatch support for geom_slice.c unless hotspots are used. In general case hotspots may cause any of direct dispatch problems. Fortunately they are used very rarely. Modified: projects/camlock/sys/geom/geom_slice.c Modified: projects/camlock/sys/geom/geom_slice.c ============================================================================== --- projects/camlock/sys/geom/geom_slice.c Mon Aug 26 10:27:15 2013 (r254902) +++ projects/camlock/sys/geom/geom_slice.c Mon Aug 26 10:32:36 2013 (r254903) @@ -396,8 +396,10 @@ g_slice_config(struct g_geom *gp, u_int pp->stripeoffset = pp2->stripeoffset + offset; if (pp->stripesize > 0) pp->stripeoffset %= pp->stripesize; - if (gsp->nhotspot == 0) + if (gsp->nhotspot == 0) { pp->flags |= pp2->flags & G_PF_ACCEPT_UNMAPPED; + pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; + } if (0 && bootverbose) printf("GEOM: Configure %s, start %jd length %jd end %jd\n", pp->name, (intmax_t)offset, (intmax_t)length, @@ -430,16 +432,20 @@ g_slice_conf_hot(struct g_geom *gp, u_in { struct g_slicer *gsp; struct g_slice_hot *gsl, *gsl2; + struct g_consumer *cp; struct g_provider *pp; g_trace(G_T_TOPOLOGY, "g_slice_conf_hot(%s, idx: %d, off: %jd, len: %jd)", gp->name, idx, (intmax_t)offset, (intmax_t)length); g_topology_assert(); gsp = gp->softc; - /* Deny unmapped I/O if hotspots are used. */ + /* Deny unmapped I/O and direct dispatch if hotspots are used. */ if (gsp->nhotspot == 0) { LIST_FOREACH(pp, &gp->provider, provider) - pp->flags &= ~G_PF_ACCEPT_UNMAPPED; + pp->flags &= ~(G_PF_ACCEPT_UNMAPPED | + G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE); + LIST_FOREACH(cp, &gp->consumer, consumer) + cp->flags &= ~(G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE); } gsl = gsp->hotspot; if(idx >= gsp->nhotspot) { @@ -511,6 +517,7 @@ g_slice_new(struct g_class *mp, u_int sl if (gp->class->destroy_geom == NULL) gp->class->destroy_geom = g_slice_destroy_geom; cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error == 0) error = g_access(cp, 1, 0, 0);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308261032.r7QAWbPr080408>