diff mbox

[v2,05/11] rsi: Remove unnecessary buffer allocation

Message ID 1494336614-2107-6-git-send-email-amit.karwar@redpinesignals.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show

Commit Message

Amitkumar Karwar May 9, 2017, 1:30 p.m. UTC
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>

In functions usb read register and usb write register, dynamic allocation
of 4 bytes is used. This is removed as it is unncessary for local variable
and for such small data.

Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)

Comments

Kalle Valo May 11, 2017, 6:28 p.m. UTC | #1
Amitkumar Karwar <amitkarwar@gmail.com> writes:

> From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
>
> In functions usb read register and usb write register, dynamic allocation
> of 4 bytes is used. This is removed as it is unncessary for local variable
> and for such small data.
>
> Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
> ---
>  drivers/net/wireless/rsi/rsi_91x_usb.c | 18 ++++--------------
>  1 file changed, 4 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
> index 73b01a8..8eb7407 100644
> --- a/drivers/net/wireless/rsi/rsi_91x_usb.c
> +++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
> @@ -157,12 +157,8 @@ static int rsi_usb_reg_read(struct usb_device *usbdev,
>  			    u16 *value,
>  			    u16 len)
>  {
> -	u8 *buf;
> -	int status = -ENOMEM;
> -
> -	buf  = kmalloc(0x04, GFP_KERNEL);
> -	if (!buf)
> -		return status;
> +	u8 buf[4];
> +	int status;
>  
>  	status = usb_control_msg(usbdev,
>  				 usb_rcvctrlpipe(usbdev, 0),

Recently I got a patch to orinoco_usb which did exactly the opposite
(unless I'm missing something):

https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git/commit/?id=2f6ae79cb04bb7f9b4be3f1c32b6fda35bf976bc

The documentation for usb_control_msg() does not mention anything if
it's possible to use stack memory, but AFAIU it's not possible to use
stack memory with DMA. Can anyone clarify?
Arend Van Spriel May 12, 2017, 8:28 a.m. UTC | #2
On 5/11/2017 8:28 PM, Kalle Valo wrote:
> Amitkumar Karwar <amitkarwar@gmail.com> writes:
> 
>> From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
>>
>> In functions usb read register and usb write register, dynamic allocation
>> of 4 bytes is used. This is removed as it is unncessary for local variable
>> and for such small data.
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
>> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
>> ---
>>   drivers/net/wireless/rsi/rsi_91x_usb.c | 18 ++++--------------
>>   1 file changed, 4 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
>> index 73b01a8..8eb7407 100644
>> --- a/drivers/net/wireless/rsi/rsi_91x_usb.c
>> +++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
>> @@ -157,12 +157,8 @@ static int rsi_usb_reg_read(struct usb_device *usbdev,
>>   			    u16 *value,
>>   			    u16 len)
>>   {
>> -	u8 *buf;
>> -	int status = -ENOMEM;
>> -
>> -	buf  = kmalloc(0x04, GFP_KERNEL);
>> -	if (!buf)
>> -		return status;
>> +	u8 buf[4];
>> +	int status;
>>   
>>   	status = usb_control_msg(usbdev,
>>   				 usb_rcvctrlpipe(usbdev, 0),
> 
> Recently I got a patch to orinoco_usb which did exactly the opposite
> (unless I'm missing something):
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git/commit/?id=2f6ae79cb04bb7f9b4be3f1c32b6fda35bf976bc
> 
> The documentation for usb_control_msg() does not mention anything if
> it's possible to use stack memory, but AFAIU it's not possible to use
> stack memory with DMA. Can anyone clarify?

After private message I sent to Kalle here my public response :-p
According to Greg this has been a USB core requirement for a long, long 
time (see below).

Regards,
Arend

[1] http://marc.info/?l=linux-kernel&m=149391173014176&w=2

-------- Forwarded Message --------
Subject: Re: [PATCH] i2c: i2c-tiny-usb: fix buffer not being DMA capable
Date: Thu, 4 May 2017 08:27:09 -0700
From: Greg KH <gregkh@linuxfoundation.org>
To: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
CC: Sebastian Reichel <sre@kernel.org>, Till Harbaum <till@harbaum.org>, 
Wolfram Sang <wsa@the-dreams.de>, linux-i2c@vger.kernel.org, 
linux-kernel@vger.kernel.org, # Kernel 4 . 9+ <stable@vger.kernel.org>

On Thu, May 04, 2017 at 02:56:32PM +0200, Sebastian Reichel wrote:
 > The i2c-tiny-usb driver generates the following trace and fails to
 > read or write data on a v4.9 or newer kernels. This patch avoids the
 > problem by allocating a DMA capable buffer for data transfer.

[snip]

This has been a USB core requirement since the 2.2 days, it's only since
4.9 that most people have started to notice this.  So backporting it to
anything that it can go to is best to have happen :)

 > Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
 > ---
 >  drivers/i2c/busses/i2c-tiny-usb.c | 19 +++++++++++++++----
 >  1 file changed, 15 insertions(+), 4 deletions(-)
Amitkumar Karwar May 16, 2017, 10:06 a.m. UTC | #3
On Fri, May 12, 2017 at 1:58 PM, Arend van Spriel
<arend.vanspriel@broadcom.com> wrote:
> On 5/11/2017 8:28 PM, Kalle Valo wrote:
>>
>> Amitkumar Karwar <amitkarwar@gmail.com> writes:
>>
>>> From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
>>>
>>> In functions usb read register and usb write register, dynamic allocation
>>> of 4 bytes is used. This is removed as it is unncessary for local
>>> variable
>>> and for such small data.
>>>
>>> Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
>>> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
>>> ---
>>>   drivers/net/wireless/rsi/rsi_91x_usb.c | 18 ++++--------------
>>>   1 file changed, 4 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c
>>> b/drivers/net/wireless/rsi/rsi_91x_usb.c
>>> index 73b01a8..8eb7407 100644
>>> --- a/drivers/net/wireless/rsi/rsi_91x_usb.c
>>> +++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
>>> @@ -157,12 +157,8 @@ static int rsi_usb_reg_read(struct usb_device
>>> *usbdev,
>>>                             u16 *value,
>>>                             u16 len)
>>>   {
>>> -       u8 *buf;
>>> -       int status = -ENOMEM;
>>> -
>>> -       buf  = kmalloc(0x04, GFP_KERNEL);
>>> -       if (!buf)
>>> -               return status;
>>> +       u8 buf[4];
>>> +       int status;
>>>         status = usb_control_msg(usbdev,
>>>                                  usb_rcvctrlpipe(usbdev, 0),
>>
>>
>> Recently I got a patch to orinoco_usb which did exactly the opposite
>> (unless I'm missing something):
>>
>>
>> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git/commit/?id=2f6ae79cb04bb7f9b4be3f1c32b6fda35bf976bc
>>
>> The documentation for usb_control_msg() does not mention anything if
>> it's possible to use stack memory, but AFAIU it's not possible to use
>> stack memory with DMA. Can anyone clarify?
>
>
> After private message I sent to Kalle here my public response :-p
> According to Greg this has been a USB core requirement for a long, long time
> (see below).
>

Thanks Arend.
I have dropped this patch in V3 series.

Regards,
Amitkumar Karwar
diff mbox

Patch

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 73b01a8..8eb7407 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -157,12 +157,8 @@  static int rsi_usb_reg_read(struct usb_device *usbdev,
 			    u16 *value,
 			    u16 len)
 {
-	u8 *buf;
-	int status = -ENOMEM;
-
-	buf  = kmalloc(0x04, GFP_KERNEL);
-	if (!buf)
-		return status;
+	u8 buf[4];
+	int status;
 
 	status = usb_control_msg(usbdev,
 				 usb_rcvctrlpipe(usbdev, 0),
@@ -179,7 +175,6 @@  static int rsi_usb_reg_read(struct usb_device *usbdev,
 			"%s: Reg read failed with error code :%d\n",
 			__func__, status);
 	}
-	kfree(buf);
 
 	return status;
 }
@@ -199,12 +194,8 @@  static int rsi_usb_reg_write(struct usb_device *usbdev,
 			     u16 value,
 			     u16 len)
 {
-	u8 *usb_reg_buf;
-	int status = -ENOMEM;
-
-	usb_reg_buf  = kmalloc(0x04, GFP_KERNEL);
-	if (!usb_reg_buf)
-		return status;
+	u8 usb_reg_buf[4];
+	int status;
 
 	usb_reg_buf[0] = (value & 0x00ff);
 	usb_reg_buf[1] = (value & 0xff00) >> 8;
@@ -225,7 +216,6 @@  static int rsi_usb_reg_write(struct usb_device *usbdev,
 			"%s: Reg write failed with error code :%d\n",
 			__func__, status);
 	}
-	kfree(usb_reg_buf);
 
 	return status;
 }