Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966014AbbDWOb7 (ORCPT ); Thu, 23 Apr 2015 10:31:59 -0400 Received: from mail-wi0-f178.google.com ([209.85.212.178]:35536 "EHLO mail-wi0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757828AbbDWObx (ORCPT ); Thu, 23 Apr 2015 10:31:53 -0400 MIME-Version: 1.0 In-Reply-To: <1429798012-21916-3-git-send-email-johan@kernel.org> References: <1429798012-21916-1-git-send-email-johan@kernel.org> <1429798012-21916-3-git-send-email-johan@kernel.org> Date: Thu, 23 Apr 2015 16:31:51 +0200 Message-ID: Subject: Re: [PATCH v2 2/3] USB: ehci-tegra: fix inefficient copy of unaligned buffers From: Frans Klaver To: Johan Hovold Cc: Greg Kroah-Hartman , Felipe Balbi , Alan Stern , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Stephen Warren , Thierry Reding , Alexandre Courbot , linux-tegra@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1968 Lines: 52 On Thu, Apr 23, 2015 at 4:06 PM, Johan Hovold wrote: > Make sure only to copy any actual data rather than the whole buffer, > when releasing the temporary buffer used for unaligned non-isochronous > transfers. > > Compile-tested only. > > Signed-off-by: Johan Hovold > --- > drivers/usb/host/ehci-tegra.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c > index ff9af29b4e9f..4031b372008e 100644 > --- a/drivers/usb/host/ehci-tegra.c > +++ b/drivers/usb/host/ehci-tegra.c > @@ -304,6 +304,7 @@ struct dma_aligned_buffer { > static void free_dma_aligned_buffer(struct urb *urb) > { > struct dma_aligned_buffer *temp; > + size_t length; > > if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER)) > return; > @@ -311,9 +312,14 @@ static void free_dma_aligned_buffer(struct urb *urb) > temp = container_of(urb->transfer_buffer, > struct dma_aligned_buffer, data); > > - if (usb_urb_dir_in(urb)) > - memcpy(temp->old_xfer_buffer, temp->data, > - urb->transfer_buffer_length); > + if (usb_urb_dir_in(urb)) { > + if (usb_pipeisoc(urb->pipe)) > + length = urb->transfer_buffer_length; > + else > + length = urb->actual_length; > + > + memcpy(temp->old_xfer_buffer, temp->data, length); > + } > urb->transfer_buffer = temp->old_xfer_buffer; > kfree(temp->kmalloc_ptr); Out of curiosity: any reason not to declare that length variable inside this new compound? Thanks, Frans -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/