[SLOF] [PATCH] Fix remaining compiler warnings in sloffs.c
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Tue Aug 9 16:45:42 AEST 2016
Thomas Huth <thuth at redhat.com> writes:
> On 09.08.2016 04:16, Nikunj A Dadhania wrote:
>> Segher Boessenkool <segher at kernel.crashing.org> writes:
>>
>>> On Mon, Aug 08, 2016 at 02:45:35PM +0530, Nikunj A Dadhania wrote:
>>>>>>> In the end, we just might want to add -fno-strict-aliasing to the
>>>>>>> HOSTCFLAGS, just like we already did it in make.rules for the normal
>>>>>>> CFLAGS, and call it a day.
>>>>>>
>>>>>> Or you could fix the problems. SLOF used to work with -fstrict-aliasing,
>>>>>> and it was a nice performance win.
>>>>>
>>>>> That's a question for Nikunj who committed that change a couple of years
>>>>> ago ...
>>>>> (see http://git.qemu.org/?p=SLOF.git;a=commitdiff;h=7eca6a5e56f468)
>>>>
>>>> I remember that we had a discussion on this and BenH had suggested that
>>>> we cannot re-audit all the code for correctness with strict-aliasing. So
>>>> disable it.
>>>
>>> That's what -Wstrict-aliasing is for (needs -fstrict-aliasing active as
>>> well, to work).
>>>
>>> Rewriting the code to make it better can be quite a bit of work, of
>>> course. But you could e.g. only use -fno-strict-aliasing on those files
>>> where -Wstrict-aliasing warns.
>>
>> I think this is what is needed. I have to test this well, as I am not
>> exactly sure what was the way we were hitting this.
>>
>> diff --git a/clients/net-snk/app/netlib/ipv4.c b/clients/net-snk/app/netlib/ipv4.c
>> index 3a1a789..157d71c 100644
>> --- a/clients/net-snk/app/netlib/ipv4.c
>> +++ b/clients/net-snk/app/netlib/ipv4.c
>> @@ -547,7 +547,7 @@ static void fill_udp_checksum(struct iphdr *ipv4_hdr)
>> unsigned i;
>> unsigned long checksum = 0;
>> struct iphdr ip_hdr;
>> - char *ptr;
>> + uint16_t *ptr;
>> udp_hdr_t *udp_hdr;
>>
>> udp_hdr = (udp_hdr_t *) (ipv4_hdr + 1);
>> @@ -559,13 +559,13 @@ static void fill_udp_checksum(struct iphdr *ipv4_hdr)
>> ip_hdr.ip_len = udp_hdr->uh_ulen;
>> ip_hdr.ip_p = ipv4_hdr->ip_p;
>>
>> - ptr = (char*) udp_hdr;
>> - for (i = 0; i < udp_hdr->uh_ulen; i+=2)
>> - checksum += *((uint16_t*) &ptr[i]);
>> + ptr = (uint16_t*) udp_hdr;
>> + for (i = 0; i < udp_hdr->uh_ulen; i++)
>
> Don't you need to rather check for " i < udp_hdr->uh_ulen / 2" now?
Right, missed that. And I think we need to take care for odd length as
well.
i < (udp_hdr->uh_ulen + 1)/ 2
>> + checksum += ptr[i];
>>
>> - ptr = (char*) &ip_hdr;
>> - for (i = 0; i < sizeof(struct iphdr); i+=2)
>> - checksum += *((uint16_t*) &ptr[i]);
>> + ptr = (uint16_t*) &ip_hdr;
>> + for (i = 0; i < sizeof(struct iphdr); i++)
>> + checksum += ptr[i];
>
> Dito, the limit should be divided by 2 now?
Sure.
Regards,
Nikunj
More information about the SLOF
mailing list