[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.