lkml.org 
[lkml]   [2013]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] usb: gadget: f_fs: remove loop from I/O function
    Date
    From: Michal Nazarewicz <mina86@mina86.com>

    When endpoint changes (due to it being disabled or alt setting changed),
    mimic the action as if the change happened after the request has been
    queued, instead of retrying with the new endpoint.

    Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
    ---
    drivers/usb/gadget/f_fs.c | 94 +++++++++++++++++++++--------------------------
    1 file changed, 41 insertions(+), 53 deletions(-)

    diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c
    index 44cf775..f875f26 100644
    --- a/drivers/usb/gadget/f_fs.c
    +++ b/drivers/usb/gadget/f_fs.c
    @@ -754,74 +754,61 @@ static ssize_t ffs_epfile_io(struct file *file,
    {
    struct ffs_epfile *epfile = file->private_data;
    struct ffs_ep *ep;
    - char *data = NULL;
    ssize_t ret;
    + char *data;
    int halt;

    - goto first_try;
    - do {
    - spin_unlock_irq(&epfile->ffs->eps_lock);
    - mutex_unlock(&epfile->mutex);
    + /* Are we still active? */
    + if (WARN_ON(epfile->ffs->state != FFS_ACTIVE)) {
    + ret = -ENODEV;
    + goto error;
    + }

    -first_try:
    - /* Are we still active? */
    - if (WARN_ON(epfile->ffs->state != FFS_ACTIVE)) {
    - ret = -ENODEV;
    + /* Wait for endpoint to be enabled */
    + ep = epfile->ep;
    + if (!ep) {
    + if (file->f_flags & O_NONBLOCK) {
    + ret = -EAGAIN;
    goto error;
    }

    - /* Wait for endpoint to be enabled */
    - ep = epfile->ep;
    - if (!ep) {
    - if (file->f_flags & O_NONBLOCK) {
    - ret = -EAGAIN;
    - goto error;
    - }
    -
    - if (wait_event_interruptible(epfile->wait,
    - (ep = epfile->ep))) {
    - ret = -EINTR;
    - goto error;
    - }
    - }
    -
    - /* Do we halt? */
    - halt = !read == !epfile->in;
    - if (halt && epfile->isoc) {
    - ret = -EINVAL;
    + if (wait_event_interruptible(epfile->wait, (ep = epfile->ep))) {
    + ret = -EINTR;
    goto error;
    }
    + }

    - /* Allocate & copy */
    - if (!halt && !data) {
    - data = kzalloc(len, GFP_KERNEL);
    - if (unlikely(!data))
    - return -ENOMEM;
    + /* Do we halt? */
    + halt = !read == !epfile->in;
    + if (halt && epfile->isoc) {
    + ret = -EINVAL;
    + goto error;
    + }

    - if (!read &&
    - unlikely(__copy_from_user(data, buf, len))) {
    - ret = -EFAULT;
    - goto error;
    - }
    - }
    + /* Allocate & copy */
    + if (!halt) {
    + data = kmalloc(len, GFP_KERNEL);
    + if (unlikely(!data))
    + return -ENOMEM;

    - /* We will be using request */
    - ret = ffs_mutex_lock(&epfile->mutex,
    - file->f_flags & O_NONBLOCK);
    - if (unlikely(ret))
    + if (!read && unlikely(copy_from_user(data, buf, len))) {
    + ret = -EFAULT;
    goto error;
    + }
    + }

    - /*
    - * We're called from user space, we can use _irq rather then
    - * _irqsave
    - */
    - spin_lock_irq(&epfile->ffs->eps_lock);
    + /* We will be using request */
    + ret = ffs_mutex_lock(&epfile->mutex, file->f_flags & O_NONBLOCK);
    + if (unlikely(ret))
    + goto error;
    + spin_lock_irq(&epfile->ffs->eps_lock);

    - /*
    - * While we were acquiring mutex endpoint got disabled
    - * or changed?
    - */
    - } while (unlikely(epfile->ep != ep));
    + /* While we were acquiring mutex endpoint got disabled or changed. */
    + if (epfile->ep != ep) {
    + ret = -ESHUTDOWN;
    + spin_unlock_irq(&epfile->ffs->eps_lock);
    + goto error_unlock;
    + }

    /* Halt */
    if (unlikely(halt)) {
    @@ -856,6 +843,7 @@ first_try:
    }
    }

    +error_unlock:
    mutex_unlock(&epfile->mutex);
    error:
    kfree(data);
    --
    1.8.3.2

    \
     
     \ /
      Last update: 2013-11-10 18:01    [W:4.090 / U:26.624 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site