Messages in this thread |  | | Date | Fri, 20 Sep 2013 00:21:25 -0500 | From | Daniel Santos <> | Subject | Re: [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
|  |