All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
@ 2015-02-18 11:47 Vaishali Thakkar
  2015-02-18 12:33 ` [Outreachy kernel] " Preeti U Murthy
  0 siblings, 1 reply; 7+ messages in thread
From: Vaishali Thakkar @ 2015-02-18 11:47 UTC (permalink / raw)
  To: outreachy-kernel

This patch introduces the use of function put_unaligned_le16.

This is done using Coccinelle and semantic patch used is as follows:

@a@
typedef u16, __le16, uint16_t;
{u16,__le16,uint16_t} e16;
identifier tmp;
expression ptr;
expression y,e;
type T;
@@

- tmp = cpu_to_le16(y);

<+... when != tmp
(
- memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
+ put_unaligned_le16(y,ptr);
|
- memcpy(ptr, (T)&tmp, ...);
+ put_unaligned_le16(y,ptr);
)
...+>
? tmp = e

@@ type T; identifier a.tmp; @@

- T tmp;
...when != tmp

Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
with changes header file is added too.

Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
---
Changes since v1:
	-Use of variable tim_bitmap_le is removed
	-Variable tim_bitmap_le is removed
	-To be compatible with changes header file is added
	-Commit log is edited

 drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
index da19145..e65ee6e 100644
--- a/drivers/staging/rtl8188eu/core/rtw_ap.c
+++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
@@ -23,6 +23,7 @@
 #include <drv_types.h>
 #include <wifi.h>
 #include <ieee80211.h>
+#include <asm/unaligned.h>
 
 #ifdef CONFIG_88EU_AP_MODE
 
@@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
 	if (true) {
 		u8 *p, *dst_ie, *premainder_ie = NULL;
 		u8 *pbackup_remainder_ie = NULL;
-		__le16 tim_bitmap_le;
 		uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
 
-		tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
-
 		p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
 		if (p != NULL && tim_ielen > 0) {
 			tim_ielen += 2;
@@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
 			*dst_ie++ = 0;
 
 		if (tim_ielen == 4) {
-			*dst_ie++ = *(u8 *)&tim_bitmap_le;
+			*dst_ie++ = pstapriv->tim_bitmap & 0xff;
 		} else if (tim_ielen == 5) {
-			memcpy(dst_ie, &tim_bitmap_le, 2);
+			put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
 			dst_ie += 2;
 		}
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Outreachy kernel] [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
  2015-02-18 11:47 [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16 Vaishali Thakkar
@ 2015-02-18 12:33 ` Preeti U Murthy
  2015-02-18 13:21   ` Vaishali Thakkar
  0 siblings, 1 reply; 7+ messages in thread
From: Preeti U Murthy @ 2015-02-18 12:33 UTC (permalink / raw)
  To: Vaishali Thakkar, outreachy-kernel

Hi Vaishali,

On 02/18/2015 05:17 PM, Vaishali Thakkar wrote:
> This patch introduces the use of function put_unaligned_le16.

Why is the use of put_unaligned_le16 better than memcpy here ?
Can this be figured out?

Regards
Preeti U Murthy
> 
> This is done using Coccinelle and semantic patch used is as follows:
> 
> @a@
> typedef u16, __le16, uint16_t;
> {u16,__le16,uint16_t} e16;
> identifier tmp;
> expression ptr;
> expression y,e;
> type T;
> @@
> 
> - tmp = cpu_to_le16(y);
> 
> <+... when != tmp
> (
> - memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
> + put_unaligned_le16(y,ptr);
> |
> - memcpy(ptr, (T)&tmp, ...);
> + put_unaligned_le16(y,ptr);
> )
> ...+>
> ? tmp = e
> 
> @@ type T; identifier a.tmp; @@
> 
> - T tmp;
> ...when != tmp
> 
> Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
> with changes header file is added too.
> 
> Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
> ---
> Changes since v1:
> 	-Use of variable tim_bitmap_le is removed
> 	-Variable tim_bitmap_le is removed
> 	-To be compatible with changes header file is added
> 	-Commit log is edited
> 
>  drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
> index da19145..e65ee6e 100644
> --- a/drivers/staging/rtl8188eu/core/rtw_ap.c
> +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
> @@ -23,6 +23,7 @@
>  #include <drv_types.h>
>  #include <wifi.h>
>  #include <ieee80211.h>
> +#include <asm/unaligned.h>
> 
>  #ifdef CONFIG_88EU_AP_MODE
> 
> @@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
>  	if (true) {
>  		u8 *p, *dst_ie, *premainder_ie = NULL;
>  		u8 *pbackup_remainder_ie = NULL;
> -		__le16 tim_bitmap_le;
>  		uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
> 
> -		tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
> -
>  		p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
>  		if (p != NULL && tim_ielen > 0) {
>  			tim_ielen += 2;
> @@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
>  			*dst_ie++ = 0;
> 
>  		if (tim_ielen == 4) {
> -			*dst_ie++ = *(u8 *)&tim_bitmap_le;
> +			*dst_ie++ = pstapriv->tim_bitmap & 0xff;
>  		} else if (tim_ielen == 5) {
> -			memcpy(dst_ie, &tim_bitmap_le, 2);
> +			put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
>  			dst_ie += 2;
>  		}
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Outreachy kernel] [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
  2015-02-18 12:33 ` [Outreachy kernel] " Preeti U Murthy
@ 2015-02-18 13:21   ` Vaishali Thakkar
  2015-02-18 17:19     ` Jes Sorensen
  0 siblings, 1 reply; 7+ messages in thread
From: Vaishali Thakkar @ 2015-02-18 13:21 UTC (permalink / raw)
  To: Preeti U Murthy; +Cc: outreachy-kernel

On Wed, Feb 18, 2015 at 6:03 PM, Preeti U Murthy
<preeti@linux.vnet.ibm.com> wrote:
> Hi Vaishali,

Hello Preeti,

> On 02/18/2015 05:17 PM, Vaishali Thakkar wrote:
>> This patch introduces the use of function put_unaligned_le16.
>
> Why is the use of put_unaligned_le16 better than memcpy here ?
> Can this be figured out?

As per the definition of put_unaligned_* functions (Here:
http://lxr.free-electrons.com/source/arch/c6x/include/asm/unaligned.h#L34)
, we can use
put_unaligned_* functions in following kind of cases:

Whenever we have two lines like these:

__le16 tmp = cpu_to_le16(y);
    memcpy(ptr, &tmp, sizeof(tmp));

We can go for using put_unaligned_* functions instead:

    put_unaligned_le16(y, ptr);

This change can be applied for all put_unaligned-* functions
[ little endian and big endian] listed in this header file.

This is my understanding about these functions. Bob suggested me these
functions at first place. I worked on solving such bugs using
Coccinelle considering
many different cases and wrote semantic patch for solving all those
bugs. Though I
had some endianness issue for some cases, and I am working on it. It
may be possible
that I am missing something. If it is such a case, then it would be
good if you can correct
me. If you want me to be more specific in change log then also I can go for v3.

Thank You

> Regards
> Preeti U Murthy
>>
>> This is done using Coccinelle and semantic patch used is as follows:
>>
>> @a@
>> typedef u16, __le16, uint16_t;
>> {u16,__le16,uint16_t} e16;
>> identifier tmp;
>> expression ptr;
>> expression y,e;
>> type T;
>> @@
>>
>> - tmp = cpu_to_le16(y);
>>
>> <+... when != tmp
>> (
>> - memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
>> + put_unaligned_le16(y,ptr);
>> |
>> - memcpy(ptr, (T)&tmp, ...);
>> + put_unaligned_le16(y,ptr);
>> )
>> ...+>
>> ? tmp = e
>>
>> @@ type T; identifier a.tmp; @@
>>
>> - T tmp;
>> ...when != tmp
>>
>> Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
>> with changes header file is added too.
>>
>> Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
>> ---
>> Changes since v1:
>>       -Use of variable tim_bitmap_le is removed
>>       -Variable tim_bitmap_le is removed
>>       -To be compatible with changes header file is added
>>       -Commit log is edited
>>
>>  drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
>>  1 file changed, 3 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
>> index da19145..e65ee6e 100644
>> --- a/drivers/staging/rtl8188eu/core/rtw_ap.c
>> +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
>> @@ -23,6 +23,7 @@
>>  #include <drv_types.h>
>>  #include <wifi.h>
>>  #include <ieee80211.h>
>> +#include <asm/unaligned.h>
>>
>>  #ifdef CONFIG_88EU_AP_MODE
>>
>> @@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
>>       if (true) {
>>               u8 *p, *dst_ie, *premainder_ie = NULL;
>>               u8 *pbackup_remainder_ie = NULL;
>> -             __le16 tim_bitmap_le;
>>               uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
>>
>> -             tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
>> -
>>               p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
>>               if (p != NULL && tim_ielen > 0) {
>>                       tim_ielen += 2;
>> @@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
>>                       *dst_ie++ = 0;
>>
>>               if (tim_ielen == 4) {
>> -                     *dst_ie++ = *(u8 *)&tim_bitmap_le;
>> +                     *dst_ie++ = pstapriv->tim_bitmap & 0xff;
>>               } else if (tim_ielen == 5) {
>> -                     memcpy(dst_ie, &tim_bitmap_le, 2);
>> +                     put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
>>                       dst_ie += 2;
>>               }
>>
>



-- 
Vaishali


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Outreachy kernel] [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
  2015-02-18 13:21   ` Vaishali Thakkar
@ 2015-02-18 17:19     ` Jes Sorensen
  2015-02-18 18:20       ` Vaishali Thakkar
  2015-02-19  3:03       ` Preeti U Murthy
  0 siblings, 2 replies; 7+ messages in thread
From: Jes Sorensen @ 2015-02-18 17:19 UTC (permalink / raw)
  To: Vaishali Thakkar, Preeti U Murthy; +Cc: outreachy-kernel

On 02/18/15 08:21, Vaishali Thakkar wrote:
> On Wed, Feb 18, 2015 at 6:03 PM, Preeti U Murthy
> <preeti@linux.vnet.ibm.com> wrote:
>> Hi Vaishali,
> 
> Hello Preeti,
> 
>> On 02/18/2015 05:17 PM, Vaishali Thakkar wrote:
>>> This patch introduces the use of function put_unaligned_le16.
>>
>> Why is the use of put_unaligned_le16 better than memcpy here ?
>> Can this be figured out?
> 
> As per the definition of put_unaligned_* functions (Here:
> http://lxr.free-electrons.com/source/arch/c6x/include/asm/unaligned.h#L34)
> , we can use
> put_unaligned_* functions in following kind of cases:
> 
> Whenever we have two lines like these:
> 
> __le16 tmp = cpu_to_le16(y);
>     memcpy(ptr, &tmp, sizeof(tmp));
> 
> We can go for using put_unaligned_* functions instead:
> 
>     put_unaligned_le16(y, ptr);
> 
> This change can be applied for all put_unaligned-* functions
> [ little endian and big endian] listed in this header file.
> 
> This is my understanding about these functions. Bob suggested me these
> functions at first place. I worked on solving such bugs using
> Coccinelle considering
> many different cases and wrote semantic patch for solving all those
> bugs. Though I
> had some endianness issue for some cases, and I am working on it. It
> may be possible
> that I am missing something. If it is such a case, then it would be
> good if you can correct
> me. If you want me to be more specific in change log then also I can go for v3.

Just a comment on this - playing with byte ordering macros and then
memcpy() is always risky, and prone to hide errors which are hard to
track down. The use of put_unaligned_le16() makes it very clear what is
happening in the code, so it is a good solution to apply here.

Cheers,
Jes

> Thank You
> 
>> Regards
>> Preeti U Murthy
>>>
>>> This is done using Coccinelle and semantic patch used is as follows:
>>>
>>> @a@
>>> typedef u16, __le16, uint16_t;
>>> {u16,__le16,uint16_t} e16;
>>> identifier tmp;
>>> expression ptr;
>>> expression y,e;
>>> type T;
>>> @@
>>>
>>> - tmp = cpu_to_le16(y);
>>>
>>> <+... when != tmp
>>> (
>>> - memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
>>> + put_unaligned_le16(y,ptr);
>>> |
>>> - memcpy(ptr, (T)&tmp, ...);
>>> + put_unaligned_le16(y,ptr);
>>> )
>>> ...+>
>>> ? tmp = e
>>>
>>> @@ type T; identifier a.tmp; @@
>>>
>>> - T tmp;
>>> ...when != tmp
>>>
>>> Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
>>> with changes header file is added too.
>>>
>>> Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
>>> ---
>>> Changes since v1:
>>>       -Use of variable tim_bitmap_le is removed
>>>       -Variable tim_bitmap_le is removed
>>>       -To be compatible with changes header file is added
>>>       -Commit log is edited
>>>
>>>  drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
>>>  1 file changed, 3 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>> index da19145..e65ee6e 100644
>>> --- a/drivers/staging/rtl8188eu/core/rtw_ap.c
>>> +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>> @@ -23,6 +23,7 @@
>>>  #include <drv_types.h>
>>>  #include <wifi.h>
>>>  #include <ieee80211.h>
>>> +#include <asm/unaligned.h>
>>>
>>>  #ifdef CONFIG_88EU_AP_MODE
>>>
>>> @@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
>>>       if (true) {
>>>               u8 *p, *dst_ie, *premainder_ie = NULL;
>>>               u8 *pbackup_remainder_ie = NULL;
>>> -             __le16 tim_bitmap_le;
>>>               uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
>>>
>>> -             tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
>>> -
>>>               p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
>>>               if (p != NULL && tim_ielen > 0) {
>>>                       tim_ielen += 2;
>>> @@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
>>>                       *dst_ie++ = 0;
>>>
>>>               if (tim_ielen == 4) {
>>> -                     *dst_ie++ = *(u8 *)&tim_bitmap_le;
>>> +                     *dst_ie++ = pstapriv->tim_bitmap & 0xff;
>>>               } else if (tim_ielen == 5) {
>>> -                     memcpy(dst_ie, &tim_bitmap_le, 2);
>>> +                     put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
>>>                       dst_ie += 2;
>>>               }
>>>
>>
> 
> 
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Outreachy kernel] [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
  2015-02-18 17:19     ` Jes Sorensen
@ 2015-02-18 18:20       ` Vaishali Thakkar
  2015-02-19  3:03       ` Preeti U Murthy
  1 sibling, 0 replies; 7+ messages in thread
From: Vaishali Thakkar @ 2015-02-18 18:20 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Preeti U Murthy, outreachy-kernel

On Wed, Feb 18, 2015 at 10:49 PM, Jes Sorensen <jes.sorensen@gmail.com> wrote:
> On 02/18/15 08:21, Vaishali Thakkar wrote:
>> On Wed, Feb 18, 2015 at 6:03 PM, Preeti U Murthy
>> <preeti@linux.vnet.ibm.com> wrote:
>>> Hi Vaishali,
>>
>> Hello Preeti,
>>
>>> On 02/18/2015 05:17 PM, Vaishali Thakkar wrote:
>>>> This patch introduces the use of function put_unaligned_le16.
>>>
>>> Why is the use of put_unaligned_le16 better than memcpy here ?
>>> Can this be figured out?
>>
>> As per the definition of put_unaligned_* functions (Here:
>> http://lxr.free-electrons.com/source/arch/c6x/include/asm/unaligned.h#L34)
>> , we can use
>> put_unaligned_* functions in following kind of cases:
>>
>> Whenever we have two lines like these:
>>
>> __le16 tmp = cpu_to_le16(y);
>>     memcpy(ptr, &tmp, sizeof(tmp));
>>
>> We can go for using put_unaligned_* functions instead:
>>
>>     put_unaligned_le16(y, ptr);
>>
>> This change can be applied for all put_unaligned-* functions
>> [ little endian and big endian] listed in this header file.
>>
>> This is my understanding about these functions. Bob suggested me these
>> functions at first place. I worked on solving such bugs using
>> Coccinelle considering
>> many different cases and wrote semantic patch for solving all those
>> bugs. Though I
>> had some endianness issue for some cases, and I am working on it. It
>> may be possible
>> that I am missing something. If it is such a case, then it would be
>> good if you can correct
>> me. If you want me to be more specific in change log then also I can go for v3.
>
> Just a comment on this - playing with byte ordering macros and then
> memcpy() is always risky, and prone to hide errors which are hard to
> track down. The use of put_unaligned_le16() makes it very clear what is
> happening in the code, so it is a good solution to apply here.

Yes. This makes sense. Thanks for the comment.

> Cheers,
> Jes
>
>> Thank You
>>
>>> Regards
>>> Preeti U Murthy
>>>>
>>>> This is done using Coccinelle and semantic patch used is as follows:
>>>>
>>>> @a@
>>>> typedef u16, __le16, uint16_t;
>>>> {u16,__le16,uint16_t} e16;
>>>> identifier tmp;
>>>> expression ptr;
>>>> expression y,e;
>>>> type T;
>>>> @@
>>>>
>>>> - tmp = cpu_to_le16(y);
>>>>
>>>> <+... when != tmp
>>>> (
>>>> - memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
>>>> + put_unaligned_le16(y,ptr);
>>>> |
>>>> - memcpy(ptr, (T)&tmp, ...);
>>>> + put_unaligned_le16(y,ptr);
>>>> )
>>>> ...+>
>>>> ? tmp = e
>>>>
>>>> @@ type T; identifier a.tmp; @@
>>>>
>>>> - T tmp;
>>>> ...when != tmp
>>>>
>>>> Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
>>>> with changes header file is added too.
>>>>
>>>> Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
>>>> ---
>>>> Changes since v1:
>>>>       -Use of variable tim_bitmap_le is removed
>>>>       -Variable tim_bitmap_le is removed
>>>>       -To be compatible with changes header file is added
>>>>       -Commit log is edited
>>>>
>>>>  drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
>>>>  1 file changed, 3 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>> index da19145..e65ee6e 100644
>>>> --- a/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>> +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>> @@ -23,6 +23,7 @@
>>>>  #include <drv_types.h>
>>>>  #include <wifi.h>
>>>>  #include <ieee80211.h>
>>>> +#include <asm/unaligned.h>
>>>>
>>>>  #ifdef CONFIG_88EU_AP_MODE
>>>>
>>>> @@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
>>>>       if (true) {
>>>>               u8 *p, *dst_ie, *premainder_ie = NULL;
>>>>               u8 *pbackup_remainder_ie = NULL;
>>>> -             __le16 tim_bitmap_le;
>>>>               uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
>>>>
>>>> -             tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
>>>> -
>>>>               p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
>>>>               if (p != NULL && tim_ielen > 0) {
>>>>                       tim_ielen += 2;
>>>> @@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
>>>>                       *dst_ie++ = 0;
>>>>
>>>>               if (tim_ielen == 4) {
>>>> -                     *dst_ie++ = *(u8 *)&tim_bitmap_le;
>>>> +                     *dst_ie++ = pstapriv->tim_bitmap & 0xff;
>>>>               } else if (tim_ielen == 5) {
>>>> -                     memcpy(dst_ie, &tim_bitmap_le, 2);
>>>> +                     put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
>>>>                       dst_ie += 2;
>>>>               }
>>>>
>>>
>>
>>
>>
>



-- 
Vaishali


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Outreachy kernel] [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
  2015-02-18 17:19     ` Jes Sorensen
  2015-02-18 18:20       ` Vaishali Thakkar
@ 2015-02-19  3:03       ` Preeti U Murthy
  2015-02-19  3:10         ` Vaishali Thakkar
  1 sibling, 1 reply; 7+ messages in thread
From: Preeti U Murthy @ 2015-02-19  3:03 UTC (permalink / raw)
  To: Jes Sorensen, Vaishali Thakkar; +Cc: outreachy-kernel

Hi Vaishali,

On 02/18/2015 10:49 PM, Jes Sorensen wrote:
> On 02/18/15 08:21, Vaishali Thakkar wrote:
>> On Wed, Feb 18, 2015 at 6:03 PM, Preeti U Murthy
>> <preeti@linux.vnet.ibm.com> wrote:
>>> Hi Vaishali,
>>
>> Hello Preeti,
>>
>>> On 02/18/2015 05:17 PM, Vaishali Thakkar wrote:
>>>> This patch introduces the use of function put_unaligned_le16.
>>>
>>> Why is the use of put_unaligned_le16 better than memcpy here ?
>>> Can this be figured out?
>>
>> As per the definition of put_unaligned_* functions (Here:
>> http://lxr.free-electrons.com/source/arch/c6x/include/asm/unaligned.h#L34)
>> , we can use
>> put_unaligned_* functions in following kind of cases:
>>
>> Whenever we have two lines like these:
>>
>> __le16 tmp = cpu_to_le16(y);
>>     memcpy(ptr, &tmp, sizeof(tmp));
>>
>> We can go for using put_unaligned_* functions instead:
>>
>>     put_unaligned_le16(y, ptr);
>>
>> This change can be applied for all put_unaligned-* functions
>> [ little endian and big endian] listed in this header file.
>>
>> This is my understanding about these functions. Bob suggested me these
>> functions at first place. I worked on solving such bugs using
>> Coccinelle considering
>> many different cases and wrote semantic patch for solving all those
>> bugs. Though I
>> had some endianness issue for some cases, and I am working on it. It
>> may be possible
>> that I am missing something. If it is such a case, then it would be
>> good if you can correct
>> me. If you want me to be more specific in change log then also I can go for v3.
> 
> Just a comment on this - playing with byte ordering macros and then
> memcpy() is always risky, and prone to hide errors which are hard to
> track down. The use of put_unaligned_le16() makes it very clear what is
> happening in the code, so it is a good solution to apply here.

Sorry I was ambiguous in pointing out my expectation in my comment. Yes
I was looking for a clearer changelog thats all. Including Jes's above
comment in your changelog would clarify the purpose of this patch.

Regards
Preeti u Murthy
> 
> Cheers,
> Jes
> 
>> Thank You
>>
>>> Regards
>>> Preeti U Murthy
>>>>
>>>> This is done using Coccinelle and semantic patch used is as follows:
>>>>
>>>> @a@
>>>> typedef u16, __le16, uint16_t;
>>>> {u16,__le16,uint16_t} e16;
>>>> identifier tmp;
>>>> expression ptr;
>>>> expression y,e;
>>>> type T;
>>>> @@
>>>>
>>>> - tmp = cpu_to_le16(y);
>>>>
>>>> <+... when != tmp
>>>> (
>>>> - memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
>>>> + put_unaligned_le16(y,ptr);
>>>> |
>>>> - memcpy(ptr, (T)&tmp, ...);
>>>> + put_unaligned_le16(y,ptr);
>>>> )
>>>> ...+>
>>>> ? tmp = e
>>>>
>>>> @@ type T; identifier a.tmp; @@
>>>>
>>>> - T tmp;
>>>> ...when != tmp
>>>>
>>>> Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
>>>> with changes header file is added too.
>>>>
>>>> Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
>>>> ---
>>>> Changes since v1:
>>>>       -Use of variable tim_bitmap_le is removed
>>>>       -Variable tim_bitmap_le is removed
>>>>       -To be compatible with changes header file is added
>>>>       -Commit log is edited
>>>>
>>>>  drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
>>>>  1 file changed, 3 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>> index da19145..e65ee6e 100644
>>>> --- a/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>> +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>> @@ -23,6 +23,7 @@
>>>>  #include <drv_types.h>
>>>>  #include <wifi.h>
>>>>  #include <ieee80211.h>
>>>> +#include <asm/unaligned.h>
>>>>
>>>>  #ifdef CONFIG_88EU_AP_MODE
>>>>
>>>> @@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
>>>>       if (true) {
>>>>               u8 *p, *dst_ie, *premainder_ie = NULL;
>>>>               u8 *pbackup_remainder_ie = NULL;
>>>> -             __le16 tim_bitmap_le;
>>>>               uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
>>>>
>>>> -             tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
>>>> -
>>>>               p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
>>>>               if (p != NULL && tim_ielen > 0) {
>>>>                       tim_ielen += 2;
>>>> @@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
>>>>                       *dst_ie++ = 0;
>>>>
>>>>               if (tim_ielen == 4) {
>>>> -                     *dst_ie++ = *(u8 *)&tim_bitmap_le;
>>>> +                     *dst_ie++ = pstapriv->tim_bitmap & 0xff;
>>>>               } else if (tim_ielen == 5) {
>>>> -                     memcpy(dst_ie, &tim_bitmap_le, 2);
>>>> +                     put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
>>>>                       dst_ie += 2;
>>>>               }
>>>>
>>>
>>
>>
>>
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Outreachy kernel] [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16
  2015-02-19  3:03       ` Preeti U Murthy
@ 2015-02-19  3:10         ` Vaishali Thakkar
  0 siblings, 0 replies; 7+ messages in thread
From: Vaishali Thakkar @ 2015-02-19  3:10 UTC (permalink / raw)
  To: Preeti U Murthy; +Cc: Jes Sorensen, outreachy-kernel

On Thu, Feb 19, 2015 at 8:33 AM, Preeti U Murthy
<preeti@linux.vnet.ibm.com> wrote:
> Hi Vaishali,

Hello Preeti

> On 02/18/2015 10:49 PM, Jes Sorensen wrote:
>> On 02/18/15 08:21, Vaishali Thakkar wrote:
>>> On Wed, Feb 18, 2015 at 6:03 PM, Preeti U Murthy
>>> <preeti@linux.vnet.ibm.com> wrote:
>>>> Hi Vaishali,
>>>
>>> Hello Preeti,
>>>
>>>> On 02/18/2015 05:17 PM, Vaishali Thakkar wrote:
>>>>> This patch introduces the use of function put_unaligned_le16.
>>>>
>>>> Why is the use of put_unaligned_le16 better than memcpy here ?
>>>> Can this be figured out?
>>>
>>> As per the definition of put_unaligned_* functions (Here:
>>> http://lxr.free-electrons.com/source/arch/c6x/include/asm/unaligned.h#L34)
>>> , we can use
>>> put_unaligned_* functions in following kind of cases:
>>>
>>> Whenever we have two lines like these:
>>>
>>> __le16 tmp = cpu_to_le16(y);
>>>     memcpy(ptr, &tmp, sizeof(tmp));
>>>
>>> We can go for using put_unaligned_* functions instead:
>>>
>>>     put_unaligned_le16(y, ptr);
>>>
>>> This change can be applied for all put_unaligned-* functions
>>> [ little endian and big endian] listed in this header file.
>>>
>>> This is my understanding about these functions. Bob suggested me these
>>> functions at first place. I worked on solving such bugs using
>>> Coccinelle considering
>>> many different cases and wrote semantic patch for solving all those
>>> bugs. Though I
>>> had some endianness issue for some cases, and I am working on it. It
>>> may be possible
>>> that I am missing something. If it is such a case, then it would be
>>> good if you can correct
>>> me. If you want me to be more specific in change log then also I can go for v3.
>>
>> Just a comment on this - playing with byte ordering macros and then
>> memcpy() is always risky, and prone to hide errors which are hard to
>> track down. The use of put_unaligned_le16() makes it very clear what is
>> happening in the code, so it is a good solution to apply here.
>
> Sorry I was ambiguous in pointing out my expectation in my comment. Yes
> I was looking for a clearer changelog thats all. Including Jes's above
> comment in your changelog would clarify the purpose of this patch.

Yes. I got your point and it makes sense too. I will add Jes's comment
in next version and will keep my change log short and clear.

Thank You

> Regards
> Preeti u Murthy
>>
>> Cheers,
>> Jes
>>
>>> Thank You
>>>
>>>> Regards
>>>> Preeti U Murthy
>>>>>
>>>>> This is done using Coccinelle and semantic patch used is as follows:
>>>>>
>>>>> @a@
>>>>> typedef u16, __le16, uint16_t;
>>>>> {u16,__le16,uint16_t} e16;
>>>>> identifier tmp;
>>>>> expression ptr;
>>>>> expression y,e;
>>>>> type T;
>>>>> @@
>>>>>
>>>>> - tmp = cpu_to_le16(y);
>>>>>
>>>>> <+... when != tmp
>>>>> (
>>>>> - memcpy(ptr, (T)&tmp, \(2\|sizeof(u16)\|sizeof(__le16)\|sizeof(uint16_t)\|sizeof(e16)\));
>>>>> + put_unaligned_le16(y,ptr);
>>>>> |
>>>>> - memcpy(ptr, (T)&tmp, ...);
>>>>> + put_unaligned_le16(y,ptr);
>>>>> )
>>>>> ...+>
>>>>> ? tmp = e
>>>>>
>>>>> @@ type T; identifier a.tmp; @@
>>>>>
>>>>> - T tmp;
>>>>> ...when != tmp
>>>>>
>>>>> Here, use of variable tim_bitmap_le and variable itself is removed. To be compatible
>>>>> with changes header file is added too.
>>>>>
>>>>> Signed-off-by: Vaishali Thakkar <vthakkar1994@gmail.com>
>>>>> ---
>>>>> Changes since v1:
>>>>>       -Use of variable tim_bitmap_le is removed
>>>>>       -Variable tim_bitmap_le is removed
>>>>>       -To be compatible with changes header file is added
>>>>>       -Commit log is edited
>>>>>
>>>>>  drivers/staging/rtl8188eu/core/rtw_ap.c | 8 +++-----
>>>>>  1 file changed, 3 insertions(+), 5 deletions(-)
>>>>>
>>>>> diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>>> index da19145..e65ee6e 100644
>>>>> --- a/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>>> +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c
>>>>> @@ -23,6 +23,7 @@
>>>>>  #include <drv_types.h>
>>>>>  #include <wifi.h>
>>>>>  #include <ieee80211.h>
>>>>> +#include <asm/unaligned.h>
>>>>>
>>>>>  #ifdef CONFIG_88EU_AP_MODE
>>>>>
>>>>> @@ -78,11 +79,8 @@ static void update_BCNTIM(struct adapter *padapter)
>>>>>       if (true) {
>>>>>               u8 *p, *dst_ie, *premainder_ie = NULL;
>>>>>               u8 *pbackup_remainder_ie = NULL;
>>>>> -             __le16 tim_bitmap_le;
>>>>>               uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
>>>>>
>>>>> -             tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
>>>>> -
>>>>>               p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
>>>>>               if (p != NULL && tim_ielen > 0) {
>>>>>                       tim_ielen += 2;
>>>>> @@ -137,9 +135,9 @@ static void update_BCNTIM(struct adapter *padapter)
>>>>>                       *dst_ie++ = 0;
>>>>>
>>>>>               if (tim_ielen == 4) {
>>>>> -                     *dst_ie++ = *(u8 *)&tim_bitmap_le;
>>>>> +                     *dst_ie++ = pstapriv->tim_bitmap & 0xff;
>>>>>               } else if (tim_ielen == 5) {
>>>>> -                     memcpy(dst_ie, &tim_bitmap_le, 2);
>>>>> +                     put_unaligned_le16(pstapriv->tim_bitmap, dst_ie);
>>>>>                       dst_ie += 2;
>>>>>               }
>>>>>
>>>>
>>>
>>>
>>>
>>
>



-- 
Vaishali


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-02-19  3:10 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-18 11:47 [PATCH v2] Staging: rtl8188eu: Use put_unaligned_le16 Vaishali Thakkar
2015-02-18 12:33 ` [Outreachy kernel] " Preeti U Murthy
2015-02-18 13:21   ` Vaishali Thakkar
2015-02-18 17:19     ` Jes Sorensen
2015-02-18 18:20       ` Vaishali Thakkar
2015-02-19  3:03       ` Preeti U Murthy
2015-02-19  3:10         ` Vaishali Thakkar

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.