lkml.org 
[lkml]   [2013]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 5/5] lib: Add error string support to printks

On 09/19/2013 08:07 PM, Joe Perches wrote:
> On Wed, 2013-09-18 at 20:27 -0500, Daniel Santos wrote:
>> if I use ERR_PTR() on a signed int on a x86_64 where pointer
>> is 64 bits and int is 32, wouldn't that mean a signed conversion
>> instruction where the sign bit has to be moved from bit 31 to 63?
> No. It's cast to long
>
> static inline void * __must_check ERR_PTR(long error)
> {
> return (void *) error;
> }

Yes, but it is that cast from int to long that costs us a signed extend
instruction on platforms where sizeof(int) != sizeof(long). This
example should demonstrate the issue:

extern void funca(void *ptr);

static inline void * ERR_PTR(long error)
{
return (void *) error;
}

void funcb(int i)
{
funca(ERR_PTR(i));
}

void funcc(long l)
{
funca(ERR_PTR(l));
}

And here is the generated code on x86_64 with -O2:

0000000000000000 <funcb>:
return (void *) error;
}

void funcb(int i)
{
funca(ERR_PTR(i));
0: 48 63 ff movslq %edi,%rdi
3: e9 00 00 00 00 jmpq 8 <funcb+0x8>
4: R_X86_64_PC32 funca-0x4
8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
f: 00

0000000000000010 <funcc>:
}

void funcc(long l)
{
funca(ERR_PTR(l));
10: e9 00 00 00 00 jmpq 15 <funcc+0x5>
11: R_X86_64_PC32 funca-0x4


So on x86_64 this movslq is 3 bytes of text, plus register pollution for
each time you convert an int to a pointer. I don't know the precise
number of cases where error numbers are passed to printk as ints, but I
presume it is enough that this could add several kilobytes of text.
Either way, for a popular function like vsnprintf, it's better to take a
moderate bloat in the function than a little bloat at many call sites,
especially when it's not performance critical.

>> Either way, %pE does seem to make a lot of sense for conditions where we
>> already have a pointer that we would otherwise use PTR_ERR() to convert,
>> but it just seems klunky to use it on an int, to have it treated like a
>> pointer and then re-interpreted as an int. Maybe we can add %pE as well
>> as %dE and leave [ioxXu] out of it?
> I think having just one way to format is better.
>
Yeah, I do agree, I just don't see how to do it without introducing
unnecessary bloat.

Daniel


\
 
 \ /
  Last update: 2013-09-20 07:41    [W:0.066 / U:30.384 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site