Re: [PATCH] NMI request/release, version 4

From: Dipankar Sarma (dipankar@gamebox.net)
Date: Thu Oct 24 2002 - 02:41:03 EST


On Wed, Oct 23, 2002 at 04:53:34PM -0500, Corey Minyard wrote:
> >After local_irq_count() went away, the idle CPU check was broken
> >and that meant that if you had an idle CPU, it could hold up RCU
> >grace period completion.
> >
> Ah, much better. That seems to fix it.

Great! Do you have any latency numbers ? Just curious.

>
> >It might just be simpler to use completions instead -
> >
> > call_rcu(&(handler->rcu), free_nmi_handler, handler);
> > init_completion(&handler->completion);
> > spin_unlock_irqrestore(&nmi_handler_lock, flags);
> > wait_for_completion(&handler->completion);
> >
> >and do
> >
> > complete(&handler->completion);
> >
> >in the the RCU callback.
> >
> I was working under the assumption that the spinlocks were needed. But
> now I see that there are spinlocks in wait_for_completion. You did get
> init_completion() and call_rcu() backwards, they would need to be the
> opposite order, I think.

AFAICS, the ordering of call_rcu() and init_completion should not matter
because the CPU that is executing them would not have gone
through a quiescent state and thus the RCU callback cannot happen.
Only after a context swtich in wait_for_completion(), the callback
is possible.

>
> >Also, now I think your original idea of "Don't do this!" :) was right.
> >Waiting until an nmi handler is seen unlinked could make a task
> >block for a long time if another task re-installs it. You should
> >probably just fail installation of a busy handler (checked under
> >lock).
> >
> Since just about all of these will be in modules at unload time, I'm
> thinking that the way it is now is better. Otherwise, someone will mess
> it up. IMHO, it's much more likely that someone doesn't handle the
> callback correctly than someone reused the value before the call that
> releases it returns. I'd prefer to leave it the way it is now.

Oh, I didn't mean the part about waiting in release_nmi() until
the release is complete (RCU callback done). That is absolutely
necessary. I was talking about looping until the handler is
not busy any more. I think it is safe to just do a wait_for_completion()
and return in release_nmi().

Thanks
Dipankar

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Oct 31 2002 - 22:00:22 EST