[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/6] xen/vsprintf: Introduce %*pb[l] for printing bitmaps
>>> On 06.09.18 at 14:08, <andrew.cooper3@xxxxxxxxxx> wrote: > The format identifier is consistent with Linux. The code is adapted from > bitmap_scn{,list}printf() but cleaned up. Irrespective of this I'm somewhat worried by ... > --- a/docs/misc/printk-formats.txt > +++ b/docs/misc/printk-formats.txt > @@ -13,6 +13,14 @@ Raw buffer as hex string: > Up to 64 characters. Buffer length expected via the field_width > paramter. i.e. printk("%*ph", 8, buffer); > > +Bitmaps (e.g. cpumask/nodemask): > + > + %*pb 4321 > + %*pbl 0,5,8-9,14 > + > + Print a bitmap as either a hex string, or a range list. Bitmap length > + (in bits) expected via the field_width parameter. ... the l suffix here. It's not very likely that someone might mean to follow %pb by l, but it's syntactically ambiguous. Since the 'l' qualifier is so far meaningless for %p, why can't we use that instead, making usages look like %*lpb? > --- a/xen/common/vsprintf.c > +++ b/xen/common/vsprintf.c > @@ -264,6 +264,88 @@ static char *string(char *str, char *end, const char > *s, > return str; > } > > +/* Print a bitmap as '0-3,6-15' */ > +static char *print_bitmap_list(char *str, char *end, > + const unsigned long *bitmap, int nr_bits) > +{ > + /* current bit is 'cur', most recently seen range is [rbot, rtop] */ > + int cur, rbot, rtop; Including the nr_bits parameter - which of these really have to be plain (i.e. signed) int? > +/* Print a bitmap as a comma separated hex string. */ > +static char *print_bitmap_string(char *str, char *end, > + const unsigned long *bitmap, int nr_bits) > +{ > + const unsigned int CHUNKSZ = 32; > + unsigned int chunksz; > + int i; Same question here, despite ... > + bool first = true; > + > + chunksz = nr_bits & (CHUNKSZ - 1); > + if ( chunksz == 0 ) > + chunksz = CHUNKSZ; > + > + /* > + * First iteration copes with the trailing partial word if nr_bits isn't > a > + * round multiple of CHUNKSZ. All subsequent iterations work on a > + * complete CHUNKSZ block. > + */ > + for ( i = ROUNDUP(nr_bits, CHUNKSZ) - CHUNKSZ; i >= 0; i -= CHUNKSZ ) ... this, which obviously would need adjustment if changed (and where hence it is at least worthwhile to consider leaving it the way it is). > @@ -273,6 +355,21 @@ static char *pointer(char *str, char *end, const char > **fmt_ptr, > /* Custom %p suffixes. See XEN_ROOT/docs/misc/printk-formats.txt */ > switch ( fmt[1] ) > { > + case 'b': /* Bitmap as hex, or list */ > + ++*fmt_ptr; > + > + if ( field_width < 0 ) > + return str; > + > + if ( fmt[2] == 'l' ) > + { > + ++*fmt_ptr; With the suffixing approach an anomaly will result here when the "field_width < 0" path is taken above, leaving *fmt_ptr point at the 'l'. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |