lkml.org 
[lkml]   [2011]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/16] [media] ec168: get rid of on stack dma buffers
    Date
    usb_control_msg initiates (and waits for completion of) a dma transfer using
    the supplied buffer. That buffer thus has to be seperately allocated on
    the heap.

    In lib/dma_debug.c the function check_for_stack even warns about it:
    WARNING: at lib/dma-debug.c:866 check_for_stack

    Note: This change is tested to compile only, as I don't have the hardware.

    Signed-off-by: Florian Mickler <florian@mickler.org>
    ---
    drivers/media/dvb/dvb-usb/ec168.c | 18 +++++++++++++++---
    1 files changed, 15 insertions(+), 3 deletions(-)

    diff --git a/drivers/media/dvb/dvb-usb/ec168.c b/drivers/media/dvb/dvb-usb/ec168.c
    index 52f5d4f..1ba3e5d 100644
    --- a/drivers/media/dvb/dvb-usb/ec168.c
    +++ b/drivers/media/dvb/dvb-usb/ec168.c
    @@ -36,7 +36,9 @@ static int ec168_rw_udev(struct usb_device *udev, struct ec168_req *req)
    int ret;
    unsigned int pipe;
    u8 request, requesttype;
    - u8 buf[req->size];
    + u8 *buf;
    +
    +

    switch (req->cmd) {
    case DOWNLOAD_FIRMWARE:
    @@ -72,6 +74,12 @@ static int ec168_rw_udev(struct usb_device *udev, struct ec168_req *req)
    goto error;
    }

    + buf = kmalloc(req->size, GFP_KERNEL);
    + if (!buf) {
    + ret = -ENOMEM;
    + goto error;
    + }
    +
    if (requesttype == (USB_TYPE_VENDOR | USB_DIR_OUT)) {
    /* write */
    memcpy(buf, req->data, req->size);
    @@ -84,13 +92,13 @@ static int ec168_rw_udev(struct usb_device *udev, struct ec168_req *req)
    msleep(1); /* avoid I2C errors */

    ret = usb_control_msg(udev, pipe, request, requesttype, req->value,
    - req->index, buf, sizeof(buf), EC168_USB_TIMEOUT);
    + req->index, buf, req->size, EC168_USB_TIMEOUT);

    ec168_debug_dump(request, requesttype, req->value, req->index, buf,
    req->size, deb_xfer);

    if (ret < 0)
    - goto error;
    + goto err_dealloc;
    else
    ret = 0;

    @@ -98,7 +106,11 @@ static int ec168_rw_udev(struct usb_device *udev, struct ec168_req *req)
    if (!ret && requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
    memcpy(req->data, buf, req->size);

    + kfree(buf);
    return ret;
    +
    +err_dealloc:
    + kfree(buf);
    error:
    deb_info("%s: failed:%d\n", __func__, ret);
    return ret;
    --
    1.7.4.rc3


    \
     
     \ /
      Last update: 2011-03-15 09:57    [W:0.044 / U:148.176 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site