netdev
[Top] [All Lists]

Re: modular net drivers

To: Andrew Morton <andrewm@xxxxxxxxxx>, Philipp Rumpf <prumpf@xxxxxxxx>
Subject: Re: modular net drivers
From: Philipp Rumpf <prumpf@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 24 Jun 2000 09:35:48 -0600
Cc: Rusty Russell <rusty@xxxxxxxxxxxxxxxx>, Keith Owens <kaos@xxxxxxxxxx>, Alan Cox <alan@xxxxxxxxxxxxxxxxxxx>, "netdev@xxxxxxxxxxx" <netdev@xxxxxxxxxxx>
In-reply-to: <3954D42A.938A724B@xxxxxxxxxx>; from Andrew Morton on Sun, Jun 25, 2000 at 01:30:50AM +1000
References: <20000623164805.AA5BB8154@halfway> <3954262D.60BDEF41@xxxxxxxxxx>, <3954262D.60BDEF41@xxxxxxxxxx> <20000624080106.A25102@xxxxxxxxxxxxxxx> <3954D42A.938A724B@xxxxxxxxxx>
Sender: owner-netdev@xxxxxxxxxxx
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.

        Philipp Rumpf

<Prev in Thread] Current Thread [Next in Thread>