cvs commit: src/sys/dev/sound/pci/hda hdac.c
Matthew Dillon
dillon at apollo.backplane.com
Tue Jun 26 09:57:04 PDT 2007
:On Tue, Jun 26, 2007 at 03:00:02PM +0300, Hasso Tepper wrote:
:> Joerg Sonnenberger wrote:
:> > You run the callout_stop twice?
:>
:> I asked in intial submit mail whether it's correct just to use
:> callout_stop() instead of callout_drain() - we don't have the latter. No
:> feedback except "go, commit".
:
:callout_stop is interlocking itself against the processing, so no
:callout_drain is needed.
:
:Joerg
I looked at the code more closely. The callout code is all
cpu-localized but it isn't 100% SMP safe. It has SMP code to
handle cross-cpu removal but the CALLOUT_PENDING check is just
not safe.
It is a very small window never likely to occur during a detach, but
I think I need to move up the globaldata pointer test. What do you
think about this?
-Matt
Matthew Dillon
<dillon at backplane.com>
Index: kern_timeout.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_timeout.c,v
retrieving revision 1.25
diff -u -p -r1.25 kern_timeout.c
--- kern_timeout.c 30 Apr 2007 07:18:54 -0000 1.25
+++ kern_timeout.c 26 Jun 2007 16:51:36 -0000
@@ -482,14 +482,6 @@ }
#endif
crit_enter_gd(gd);
- /*
- * Don't attempt to delete a callout that's not on the queue.
- */
- if ((c->c_flags & CALLOUT_PENDING) == 0) {
- c->c_flags &= ~CALLOUT_ACTIVE;
- crit_exit_gd(gd);
- return (0);
- }
#ifdef SMP
if ((tgd = c->c_gd) != gd) {
/*
@@ -503,7 +495,14 @@ seq = lwkt_send_ipiq(tgd, (void *)call
lwkt_wait_ipiq(tgd, seq);
} else
#endif
- {
+ if ((c->c_flags & CALLOUT_PENDING) == 0) {
+ /*
+ * Don't attempt to delete a callout that's not on the queue.
+ */
+ c->c_flags &= ~CALLOUT_ACTIVE;
+ crit_exit_gd(gd);
+ return (0);
+ } else {
/*
* If the callout is owned by the same CPU we can
* process it directly, but if we are racing our helper
More information about the Commits
mailing list