On Wed, Apr 25, 2012 at 2:19 PM, Oliver Neukum <[email protected]> wrote:
>> @@ -546,8 +557,13 @@ static void __usbhid_submit_report(struct
>> hid_device *hid, struct hid_report *re
>> * no race because this is called under
>> * spinlock
>> */
>> - if (time_after(jiffies, usbhid->last_out + HZ * 5))
>> +
>> + if (time_after(jiffies, usbhid->last_out + HZ * 5) &&
>> + !usbhid->urbout->unlinked) {
>> + spin_unlock(&usbhid->lock);
>> usb_unlink_urb(usbhid->urbout);
>> + spin_lock(&usbhid->lock);
>> + }
>> }
>> return;
>> }
>
> Same objection. You are just making the race unlikelier. The flag
> needs to be set under a lock you hold while checking time_after().
urb->unlinked is checked with holding both the two lockes, but set with
holding the unlink lock or the lock or both, looks it is enough to
avoid the race, isn't it?
> We'd be back at the original proposal.
Introducing a new flag to describe 'unlinked' is still OK, but
borrowing urb->unlinked is better, the bad is that it is private.
Thanks,
--
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html