Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 May 2016 22:12:47 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Alfred Perlstein <bright@mu.org>
Cc:        geom@freebsd.org, arch@freebsd.org
Subject:   Re: Removing Giant asserts from geom
Message-ID:  <20160519191247.GQ89104@kib.kiev.ua>
In-Reply-To: <573DEA73.4080408@mu.org>
References:  <20160519105634.GO89104@kib.kiev.ua> <573DEA73.4080408@mu.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, May 19, 2016 at 09:31:47AM -0700, Alfred Perlstein wrote:
> It seems like it should be the opposite, the DROP_GIANTs should be 
> turned into mtx_assert(&Giant, MA_NOTOWNED) as giant is removed from the 
> tree.
> 
> Meaning Giant should be pushed further back until it is eliminated. 
> Doing as this patch proposes hides that we still have callers holding 
> Giant which is not good.
Did you read the third paragraph of my email ?

FWIW, the assumed model of the kernel locking which must be in somebody
mind when talking about 'pushing back Giant' is not true for last 5-6
years for our kernel in general, and for the VFS in particular.

> 
> -Alfred
> 
> 
> On 5/19/16 3:56 AM, Konstantin Belousov wrote:
> > I propose to remove asserts
> > 		mtx_assert(&Giant, MA_NOTOWNED);
> > from the geom KPI.  The asserts do not serve any purposes, at least not
> > in the current kernel.  They might provided some agenda in the 5.x days,
> > but now they only force filesystems to add cruft to satisfy GEOM KPI
> > requirements.
> >
> > As an example, consider DROP_GIANT/PICKUP_GIANT in the ffs code. VFS is
> > currently Giant-free, including the mount and unmount path, UFS/FFS are
> > also Giant-free, but mount and unmount paths have to do the Giant dance
> > to allow root mount to proceed. This is because startup is executed with
> > the Giant owned by the thread0.
^^^^

> >
> > Giant asserts are even more ridiculous in the geom code since geom cdev
> > geom.ctl is marked as needing Giant. And there are vestiges of Giant
> > around calls to add geom kthreads, which is not need by KPI. Not to note
> > that Giant is already held there due to startup protocol.
> >
> > Any objections ?
> >
> > diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c
> > index 403d0b6..422883d 100644
> > --- a/sys/geom/eli/g_eli.c
> > +++ b/sys/geom/eli/g_eli.c
> > @@ -1229,7 +1229,6 @@ g_eli_shutdown_pre_sync(void *arg, int howto)
> >   	int error;
> >   
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
> >   		sc = gp->softc;
> > @@ -1245,7 +1244,6 @@ g_eli_shutdown_pre_sync(void *arg, int howto)
> >   		}
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   static void
> > diff --git a/sys/geom/geom.h b/sys/geom/geom.h
> > index bf70d0b..7c1d714 100644
> > --- a/sys/geom/geom.h
> > +++ b/sys/geom/geom.h
> > @@ -369,7 +369,6 @@ g_free(void *ptr)
> >   
> >   #define g_topology_lock() 					\
> >   	do {							\
> > -		mtx_assert(&Giant, MA_NOTOWNED);		\
> >   		sx_xlock(&topology_lock);			\
> >   	} while (0)
> >   
> > diff --git a/sys/geom/geom_event.c b/sys/geom/geom_event.c
> > index 2ded638..3c2ee49 100644
> > --- a/sys/geom/geom_event.c
> > +++ b/sys/geom/geom_event.c
> > @@ -83,7 +83,6 @@ g_waitidle(void)
> >   {
> >   
> >   	g_topology_assert_not();
> > -	mtx_assert(&Giant, MA_NOTOWNED);
> >   
> >   	mtx_lock(&g_eventlock);
> >   	while (!TAILQ_EMPTY(&g_events))
> > diff --git a/sys/geom/geom_kern.c b/sys/geom/geom_kern.c
> > index dbced0f..9f3f120 100644
> > --- a/sys/geom/geom_kern.c
> > +++ b/sys/geom/geom_kern.c
> > @@ -90,7 +90,6 @@ static void
> >   g_up_procbody(void *arg)
> >   {
> >   
> > -	mtx_assert(&Giant, MA_NOTOWNED);
> >   	thread_lock(g_up_td);
> >   	sched_prio(g_up_td, PRIBIO);
> >   	thread_unlock(g_up_td);
> > @@ -103,7 +102,6 @@ static void
> >   g_down_procbody(void *arg)
> >   {
> >   
> > -	mtx_assert(&Giant, MA_NOTOWNED);
> >   	thread_lock(g_down_td);
> >   	sched_prio(g_down_td, PRIBIO);
> >   	thread_unlock(g_down_td);
> > @@ -116,7 +114,6 @@ static void
> >   g_event_procbody(void *arg)
> >   {
> >   
> > -	mtx_assert(&Giant, MA_NOTOWNED);
> >   	thread_lock(g_event_td);
> >   	sched_prio(g_event_td, PRIBIO);
> >   	thread_unlock(g_event_td);
> > @@ -147,14 +144,12 @@ g_init(void)
> >   	g_io_init();
> >   	g_event_init();
> >   	g_ctl_init();
> > -	mtx_lock(&Giant);
> >   	kproc_kthread_add(g_event_procbody, NULL, &g_proc, &g_event_td,
> >   	    RFHIGHPID, 0, "geom", "g_event");
> >   	kproc_kthread_add(g_up_procbody, NULL, &g_proc, &g_up_td,
> >   	    RFHIGHPID, 0, "geom", "g_up");
> >   	kproc_kthread_add(g_down_procbody, NULL, &g_proc, &g_down_td,
> >   	    RFHIGHPID, 0, "geom", "g_down");
> > -	mtx_unlock(&Giant);
> >   	EVENTHANDLER_REGISTER(shutdown_pre_sync, geom_shutdown, NULL,
> >   		SHUTDOWN_PRI_FIRST);
> >   }
> > diff --git a/sys/geom/geom_mbr.c b/sys/geom/geom_mbr.c
> > index 86ee860..a811e35 100644
> > --- a/sys/geom/geom_mbr.c
> > +++ b/sys/geom/geom_mbr.c
> > @@ -190,7 +190,6 @@ g_mbr_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct thr
> >   	case DIOCSMBR: {
> >   		if (!(fflag & FWRITE))
> >   			return (EPERM);
> > -		DROP_GIANT();
> >   		g_topology_lock();
> >   		cp = LIST_FIRST(&gp->consumer);
> >   		if (cp->acw == 0) {
> > @@ -205,7 +204,6 @@ g_mbr_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct thr
> >   		if (opened)
> >   			g_access(cp, 0, -1 , 0);
> >   		g_topology_unlock();
> > -		PICKUP_GIANT();
> >   		return(error);
> >   	}
> >   	default:
> > diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c
> > index 42c9962..f4435cb 100644
> > --- a/sys/geom/geom_pc98.c
> > +++ b/sys/geom/geom_pc98.c
> > @@ -176,7 +176,6 @@ g_pc98_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct th
> >   	case DIOCSPC98: {
> >   		if (!(fflag & FWRITE))
> >   			return (EPERM);
> > -		DROP_GIANT();
> >   		g_topology_lock();
> >   		cp = LIST_FIRST(&gp->consumer);
> >   		if (cp->acw == 0) {
> > @@ -191,7 +190,6 @@ g_pc98_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct th
> >   		if (opened)
> >   			g_access(cp, 0, -1 , 0);
> >   		g_topology_unlock();
> > -		PICKUP_GIANT();
> >   		return(error);
> >   	}
> >   	default:
> > diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c
> > index 54a99bf..8517991 100644
> > --- a/sys/geom/geom_subr.c
> > +++ b/sys/geom/geom_subr.c
> > @@ -247,9 +247,7 @@ g_modevent(module_t mod, int type, void *data)
> >   		break;
> >   	case MOD_UNLOAD:
> >   		g_trace(G_T_TOPOLOGY, "g_modevent(%s, UNLOAD)", mp->name);
> > -		DROP_GIANT();
> >   		error = g_unload_class(mp);
> > -		PICKUP_GIANT();
> >   		if (error == 0) {
> >   			KASSERT(LIST_EMPTY(&mp->geom),
> >   			    ("Unloaded class (%s) still has geom", mp->name));
> > diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c
> > index 871bd8e4..0678003 100644
> > --- a/sys/geom/journal/g_journal.c
> > +++ b/sys/geom/journal/g_journal.c
> > @@ -2697,7 +2697,6 @@ g_journal_shutdown(void *arg, int howto __unused)
> >   	if (panicstr != NULL)
> >   		return;
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
> >   		if (gp->softc == NULL)
> > @@ -2706,7 +2705,6 @@ g_journal_shutdown(void *arg, int howto __unused)
> >   		g_journal_destroy(gp->softc);
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   /*
> > @@ -2725,7 +2723,6 @@ g_journal_lowmem(void *arg, int howto __unused)
> >   
> >   	g_journal_stats_low_mem++;
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	LIST_FOREACH(gp, &mp->geom, geom) {
> >   		sc = gp->softc;
> > @@ -2756,7 +2753,6 @@ g_journal_lowmem(void *arg, int howto __unused)
> >   			break;
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   static void g_journal_switcher(void *arg);
> > @@ -2871,7 +2867,6 @@ g_journal_do_switch(struct g_class *classp)
> >   	char *mountpoint;
> >   	int error, save;
> >   
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	LIST_FOREACH(gp, &classp->geom, geom) {
> >   		sc = gp->softc;
> > @@ -2886,7 +2881,6 @@ g_journal_do_switch(struct g_class *classp)
> >   		mtx_unlock(&sc->sc_mtx);
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   
> >   	mtx_lock(&mountlist_mtx);
> >   	TAILQ_FOREACH(mp, &mountlist, mnt_list) {
> > @@ -2901,11 +2895,9 @@ g_journal_do_switch(struct g_class *classp)
> >   			continue;
> >   		/* mtx_unlock(&mountlist_mtx) was done inside vfs_busy() */
> >   
> > -		DROP_GIANT();
> >   		g_topology_lock();
> >   		sc = g_journal_find_device(classp, mp->mnt_gjprovider);
> >   		g_topology_unlock();
> > -		PICKUP_GIANT();
> >   
> >   		if (sc == NULL) {
> >   			GJ_DEBUG(0, "Cannot find journal geom for %s.",
> > @@ -2984,7 +2976,6 @@ next:
> >   
> >   	sc = NULL;
> >   	for (;;) {
> > -		DROP_GIANT();
> >   		g_topology_lock();
> >   		LIST_FOREACH(gp, &g_journal_class.geom, geom) {
> >   			sc = gp->softc;
> > @@ -3000,7 +2991,6 @@ next:
> >   			sc = NULL;
> >   		}
> >   		g_topology_unlock();
> > -		PICKUP_GIANT();
> >   		if (sc == NULL)
> >   			break;
> >   		mtx_assert(&sc->sc_mtx, MA_OWNED);
> > diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c
> > index 91f1367..379f615 100644
> > --- a/sys/geom/mirror/g_mirror.c
> > +++ b/sys/geom/mirror/g_mirror.c
> > @@ -3310,7 +3310,6 @@ g_mirror_shutdown_post_sync(void *arg, int howto)
> >   	int error;
> >   
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	g_mirror_shutdown = 1;
> >   	LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
> > @@ -3329,7 +3328,6 @@ g_mirror_shutdown_post_sync(void *arg, int howto)
> >   		g_topology_lock();
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   static void
> > diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c
> > index eafccc8..61375ef 100644
> > --- a/sys/geom/mountver/g_mountver.c
> > +++ b/sys/geom/mountver/g_mountver.c
> > @@ -611,12 +611,10 @@ g_mountver_shutdown_pre_sync(void *arg, int howto)
> >   	struct g_geom *gp, *gp2;
> >   
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2)
> >   		g_mountver_destroy(gp, 1);
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   static void
> > diff --git a/sys/geom/raid/g_raid.c b/sys/geom/raid/g_raid.c
> > index 4885319..e590e35 100644
> > --- a/sys/geom/raid/g_raid.c
> > +++ b/sys/geom/raid/g_raid.c
> > @@ -2462,7 +2462,6 @@ g_raid_shutdown_post_sync(void *arg, int howto)
> >   	struct g_raid_volume *vol;
> >   
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	g_raid_shutdown = 1;
> >   	LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
> > @@ -2477,7 +2476,6 @@ g_raid_shutdown_post_sync(void *arg, int howto)
> >   		g_topology_lock();
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   static void
> > diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c
> > index a2ffe53..9b3c483 100644
> > --- a/sys/geom/raid3/g_raid3.c
> > +++ b/sys/geom/raid3/g_raid3.c
> > @@ -3543,7 +3543,6 @@ g_raid3_shutdown_post_sync(void *arg, int howto)
> >   	int error;
> >   
> >   	mp = arg;
> > -	DROP_GIANT();
> >   	g_topology_lock();
> >   	g_raid3_shutdown = 1;
> >   	LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
> > @@ -3562,7 +3561,6 @@ g_raid3_shutdown_post_sync(void *arg, int howto)
> >   		g_topology_lock();
> >   	}
> >   	g_topology_unlock();
> > -	PICKUP_GIANT();
> >   }
> >   
> >   static void
> > _______________________________________________
> > freebsd-arch@freebsd.org mailing list
> > https://lists.freebsd.org/mailman/listinfo/freebsd-arch
> > To unsubscribe, send any mail to "freebsd-arch-unsubscribe@freebsd.org"
> >



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