RE: [PATCH] Add support for usbfs zerocopy.

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

 



From: Steinar H. Gunderson [mailto:sesse@xxxxxxxxxx]
> Sent: 26 November 2015 00:19

There is still a problem with this code, not sure how to fix it.

...
> +static void dec_usb_memory_use_count(struct usb_memory *usbm, int *count)
> +{
> +	struct usb_dev_state *ps = usbm->ps;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&ps->lock, flags);
> +	--*count;
> +	if (usbm->urb_use_count == 0 && usbm->vma_use_count == 0) {
...
> +		module_put(THIS_MODULE);
> +	} else {
> +		spin_unlock_irqrestore(&ps->lock, flags);
> +	}
> +}
...
> +static void usbdev_vm_close(struct vm_area_struct *vma)
> +{
> +	struct usb_memory *usbm = vma->vm_private_data;
> +
> +	dec_usb_memory_use_count(usbm, &usbm->vma_use_count);
> +}

If the last reference to the module is for an mmap request
(which is the only reason to reference count the module here)
then the module_put() in dec_usb_memory_use_count()) returns
back into freed memory.

There isn't much the module can do about it either apart
from using kthread_run() to call module_put_and_exit()
and even that is somewhat racy (a sleep in the kthread
is probably enough).

The only real solution is for mmap() itself to take the
reference on the module.

	David


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux