Received: by oss.sgi.com id ; Sat, 24 Jun 2000 08:49:18 -0700 Received: from vindaloo.ras.ucalgary.ca ([136.159.55.21]:46262 "EHLO vindaloo.ras.ucalgary.ca") by oss.sgi.com with ESMTP id ; Sat, 24 Jun 2000 08:48:57 -0700 Received: (from rgooch@localhost) by vindaloo.ras.ucalgary.ca (8.10.0/8.10.0) id e5OFmiC09138; Sat, 24 Jun 2000 09:48:44 -0600 Date: Sat, 24 Jun 2000 09:48:44 -0600 Message-Id: <200006241548.e5OFmiC09138@vindaloo.ras.ucalgary.ca> From: Richard Gooch To: Philipp Rumpf Cc: Andrew Morton , Philipp Rumpf , Rusty Russell , Keith Owens , Alan Cox , "netdev@oss.sgi.com" Subject: Re: modular net drivers In-Reply-To: <20000624093548.A31621@puffin.external.hp.com> References: <20000623164805.AA5BB8154@halfway> <3954262D.60BDEF41@uow.edu.au> <20000624080106.A25102@fruits.uzix.org> <3954D42A.938A724B@uow.edu.au> <20000624093548.A31621@puffin.external.hp.com> Sender: owner-netdev@oss.sgi.com Precedence: bulk Return-Path: X-Orcpt: rfc822;netdev-outgoing Philipp Rumpf writes: > On Sun, Jun 25, 2000 at 01:30:50AM +1000, Andrew Morton wrote: > > +static volatile int ice_block; > > +static spinlock_t freeze_lock = SPIN_LOCK_UNLOCKED; > > + > > +static int > > +antarctica(void *dummy) > > +{ > > + printk("start antarctica on %d\n", smp_processor_id()); > > + while (ice_block) > > + ; > > + printk("stop antarctica on %d\n", smp_processor_id()); > > + return 0; > > +} > > + > > +static int > > +freeze_other_cpus(void) > > +{ > > + int cpu, retval; > > + > > + if (!spin_trylock(&freeze_lock)) > > + return -EAGAIN; > > + > > + printk("start freeze_other_cpus()\n"); > > + ice_block = 1; > > + for (cpu = 0; cpu < smp_num_cpus - 1; cpu++) { > > + retval = kernel_thread(antarctica, (void *)0, 0); > > + if (retval < 0) > > + goto out_melt; > > + } > > + printk("continue freeze_other_cpus()\n"); > > + return 0; > > +out_melt: > > + ice_block = 0; > > + spin_unlock(&freeze_lock); > > + return retval; > > +} > > You don't guarantee all the other kernel_threads have started executing. > > Basically you need either an atomic_inc or a per-CPU flag somewhere. Or why not use smp_call_function()? Just move it from the i386 tree to the generic tree. Regards, Richard.... Permanent: rgooch@atnf.csiro.au Current: rgooch@ras.ucalgary.ca