diff options
| author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2010-03-05 10:47:37 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-06 17:53:07 -0800 | 
| commit | 4da0b66c6e9ea7ba78a19f9f186779826d89f8b0 (patch) | |
| tree | 467fe1886f35dd199a7ba8b95ed5a06e2bfe83f3 | |
| parent | b89dc5d6b0981c1096ccffbf8f4413c7bb1bcc0a (diff) | |
vsprintf: move %pR resource printf_specs off the stack
This adds separate I/O and memory specs, so we don't have to change the
field width in a shared spec, which then lets us make all the specs const
and static, since they never change.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | lib/vsprintf.c | 45 | 
1 files changed, 24 insertions, 21 deletions
| diff --git a/lib/vsprintf.c b/lib/vsprintf.c index a900d136e643..0d461c7c14db 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -597,22 +597,29 @@ static char *resource_string(char *buf, char *end, struct resource *res,  #ifndef MEM_RSRC_PRINTK_SIZE  #define MEM_RSRC_PRINTK_SIZE	10  #endif -	struct printf_spec hex_spec = { +	static const struct printf_spec io_spec = {  		.base = 16, +		.field_width = IO_RSRC_PRINTK_SIZE,  		.precision = -1,  		.flags = SPECIAL | SMALL | ZEROPAD,  	}; -	struct printf_spec dec_spec = { +	static const struct printf_spec mem_spec = { +		.base = 16, +		.field_width = MEM_RSRC_PRINTK_SIZE, +		.precision = -1, +		.flags = SPECIAL | SMALL | ZEROPAD, +	}; +	static const struct printf_spec dec_spec = {  		.base = 10,  		.precision = -1,  		.flags = 0,  	}; -	struct printf_spec str_spec = { +	static const struct printf_spec str_spec = {  		.field_width = -1,  		.precision = 10,  		.flags = LEFT,  	}; -	struct printf_spec flag_spec = { +	static const struct printf_spec flag_spec = {  		.base = 16,  		.precision = -1,  		.flags = SPECIAL | SMALL, @@ -628,35 +635,31 @@ static char *resource_string(char *buf, char *end, struct resource *res,  		     2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];  	char *p = sym, *pend = sym + sizeof(sym); -	int size = -1, addr = 0;  	int decode = (fmt[0] == 'R') ? 1 : 0; - -	if (res->flags & IORESOURCE_IO) { -		size = IO_RSRC_PRINTK_SIZE; -		addr = 1; -	} else if (res->flags & IORESOURCE_MEM) { -		size = MEM_RSRC_PRINTK_SIZE; -		addr = 1; -	} +	const struct printf_spec *specp;  	*p++ = '['; -	if (res->flags & IORESOURCE_IO) +	if (res->flags & IORESOURCE_IO) {  		p = string(p, pend, "io  ", str_spec); -	else if (res->flags & IORESOURCE_MEM) +		specp = &io_spec; +	} else if (res->flags & IORESOURCE_MEM) {  		p = string(p, pend, "mem ", str_spec); -	else if (res->flags & IORESOURCE_IRQ) +		specp = &mem_spec; +	} else if (res->flags & IORESOURCE_IRQ) {  		p = string(p, pend, "irq ", str_spec); -	else if (res->flags & IORESOURCE_DMA) +		specp = &dec_spec; +	} else if (res->flags & IORESOURCE_DMA) {  		p = string(p, pend, "dma ", str_spec); -	else { +		specp = &dec_spec; +	} else {  		p = string(p, pend, "??? ", str_spec); +		specp = &mem_spec;  		decode = 0;  	} -	hex_spec.field_width = size; -	p = number(p, pend, res->start, addr ? hex_spec : dec_spec); +	p = number(p, pend, res->start, *specp);  	if (res->start != res->end) {  		*p++ = '-'; -		p = number(p, pend, res->end, addr ? hex_spec : dec_spec); +		p = number(p, pend, res->end, *specp);  	}  	if (decode) {  		if (res->flags & IORESOURCE_MEM_64) | 
