On Fri 2024-10-25 19:46:55, Ira Weiny wrote: > The use of struct range in the CXL subsystem is growing. In particular, > the addition of Dynamic Capacity devices uses struct range in a number > of places which are reported in debug and error messages. > > To wit requiring the printing of the start/end fields in each print > became cumbersome. Dan Williams mentions in [1] that it might be time > to have a print specifier for struct range similar to struct resource > > A few alternatives were considered including '%par', '%r', and '%pn'. > %pra follows that struct range is similar to struct resource (%p[rR]) > but needs to be different. Based on discussions with Petr and Andy > '%pra' was chosen.[2] > > Andy also suggested to keep the range prints similar to struct resource > though combined code. Add hex_range() to handle printing for both > pointer types. > > Finally introduce DEFINE_RANGE() as a parallel to DEFINE_RES_*() and use > it in the tests. > > --- a/lib/vsprintf.c > +++ b/lib/vsprintf.c > @@ -2229,6 +2264,15 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode, > return widen_string(buf, buf - buf_start, end, spec); > } > > +static noinline_for_stack > +char *resource_or_range(const char *fmt, char *buf, char *end, void *ptr, > + struct printf_spec spec) > +{ > + if (*fmt == 'r' && fmt[1] == 'a') This function is called only when (*fmt == 'r'). We do not need to check it here. Otherwise, this function should trigger an error when (*fmt != 'r'). > + return range_string(buf, end, ptr, spec, fmt); > + return resource_string(buf, end, ptr, spec, fmt); > +} > + > int __init no_hash_pointers_enable(char *str) > { > if (no_hash_pointers) > @@ -2277,6 +2321,7 @@ char *rust_fmt_argument(char *buf, char *end, void *ptr); > * - 'Bb' as above with module build ID (for use in backtraces) > * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref] > * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201] > + * - 'ra' For struct ranges, e.g., [range 0x0000000000000000 - 0x00000000000000ff] The range is printed without the space ' ' around the dash '-'. I mean that this should be: * - 'ra' For struct ranges, e.g., [range 0x0000000000000000-0x00000000000000ff] > * - 'b[l]' For a bitmap, the number of bits is determined by the field > * width which must be explicitly specified either as part of the > * format string '%32b[l]' or through '%*b[l]', [l] selects Otherwise, the patch looks good. I am sorry for the late reply. I had vacation... The problems are rather cosmetic and could be fixed by a followup patch later. Best Regards, Petr