* [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.