On Wed, May 23, 2012 at 10:44 PM, loody <miloody@xxxxxxxxx> wrote: > take multi-core system for example, it is possible your completion > handler execute at the same time, except you add a spin lock for > activating your completion function. > That's the reason I'm asking in first place. But if that is true, then it seems to me some drivers wouldn't be working (unlikely, right?) You can take a look at pwc completion for instance: static void pwc_isoc_handler(struct urb *urb) { [snip] if (pdev->fill_buf == NULL) pdev->fill_buf = pwc_get_next_fill_buf(pdev); --- As you can see, there is no lock here (though there is lock to get the next fill_buf) and pdev->fill_buf is obviously not local. On the other hand, em28xx has a tighter locking scheme: static void em28xx_irq_callback(struct urb *urb) { [snip] /* Copy data from URB */ spin_lock(&dev->slock); dev->isoc_ctl.isoc_copy(dev, urb); spin_unlock(&dev->slock); --- Currently, I'm running a three core (yes three!) streaming at a high rate and I'm following pwc locking (per queue). So far no races found (phew). As a sidenote, em28xx locking can be improved for a very simple reason: it's locking code instead of data. Unfortunately, I don't own that hardware to fix and test such a patch. _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies