Re: [Q] USB urb completion handler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux