All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC] xen/vsprintf: Introduce %pd formatter for domains
@ 2018-08-30 13:06 Andrew Cooper
  2018-08-30 14:18 ` Jan Beulich
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cooper @ 2018-08-30 13:06 UTC (permalink / raw)
  To: Xen-devel
  Cc: Stefano Stabellini, Wei Liu, George Dunlap, Andrew Cooper,
	Tim Deegan, Julien Grall, Jan Beulich

This allows all system domids to be printed by name, rather than special
casing the idle vcpus alone.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: George Dunlap <George.Dunlap@eu.citrix.com>
CC: Jan Beulich <JBeulich@suse.com>
CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
CC: Tim Deegan <tim@xen.org>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Julien Grall <julien.grall@arm.com>

RFC, because this was proposed before but rejected at the time.  I'm looking
to try and turn errors like this:

  (XEN) mm.c:1023:d0v2 pg_owner d32754 l1e_owner d0, but real_pg_owner d0
  (XEN) mm.c:1099:d0v2 Error getting mfn 810020 (pfn 59db1) from L1 entry 8000000810020227 for l1e_owner d0, pg_owner d32754

into the slightly more helpful:

  (XEN) mm.c:1022:d0v2 pg_owner dXEN l1e_owner d0, but real_pg_owner d0
  (XEN) mm.c:1098:d0v2 Error getting mfn 810020 (pfn 59db1) from L1 entry 8000000810020227 for l1e_owner d0, pg_owner dXEN

although even in this case, the former printk has an awkward corner case of a
possibly NULL domain pointer, which can possibly only reasonably be fixed
inside pointer() itself.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Aug 29 16:16:50 2018 +0000
#
# On branch xen-pd
# Your branch is ahead of 'origin/staging' by 1 commit.
#   (use "git push" to publish your local commits)
#
# Changes to be committed:
#	modified:   ../docs/misc/printk-formats.txt
#	modified:   common/vsprintf.c
#
# Untracked files:
#	System.map-after
#	System.map-before
#	dis-after
#	dis-before
#	headers-after
#	headers-before
#	include/asm-x86/asm-macros.h
#	wl-a
#	wl-b
#	xen-after
#	xen-before
#	xen-syms-after
#	xen-syms-before
#
---
 docs/misc/printk-formats.txt |  3 +++
 xen/common/vsprintf.c        | 57 +++++++++++++++++++++++++++++++++++---------
 2 files changed, 49 insertions(+), 11 deletions(-)

diff --git a/docs/misc/printk-formats.txt b/docs/misc/printk-formats.txt
index 525108f..6d2c617 100644
--- a/docs/misc/printk-formats.txt
+++ b/docs/misc/printk-formats.txt
@@ -28,5 +28,8 @@ Symbol/Function pointers:
 
 Domain and vCPU information:
 
+       %pd     Domain from a 'struct domain *d' (printed as d<domid>, but with
+               system domains represented by name, e.g. 'dIDLE')
+
        %pv     Domain and vCPU ID from a 'struct vcpu *' (printed as
                "d<domid>v<vcpuid>")
diff --git a/xen/common/vsprintf.c b/xen/common/vsprintf.c
index f92fb67..918a39d 100644
--- a/xen/common/vsprintf.c
+++ b/xen/common/vsprintf.c
@@ -264,6 +264,41 @@ static char *string(char *str, char *end, const char *s,
     return str;
 }
 
+/* Print a domain as d<num> or d<str> for system domains. */
+static char *print_domain(char *str, char *end, const struct domain *d)
+{
+    const char *name = NULL;
+
+    if ( str < end )
+        *str++ = 'd';
+
+    switch ( d->domain_id )
+    {
+    case DOMID_SELF:    name = "SELF";    break;
+    case DOMID_IO:      name = "IO";      break;
+    case DOMID_XEN:     name = "XEN";     break;
+    case DOMID_COW:     name = "COW";     break;
+    case DOMID_INVALID: name = "INVALID"; break;
+    case DOMID_IDLE:    name = "IDLE";    break;
+    }
+
+    if ( name )
+        return string(str, end, name, -1, -1, 0);
+    else
+        return number(str, end, d->domain_id, 10, -1, -1, 0);
+}
+
+/* Print a vcpu as d<domain-id>v<vcpu-id> */
+static char *print_vcpu(char *str, char *end, const struct vcpu *v)
+{
+    str = print_domain(str, end, v->domain);
+
+    if ( str < end )
+        *str = 'v';
+
+    return number(str + 1, end, v->vcpu_id, 10, -1, -1, 0);
+}
+
 static char *pointer(char *str, char *end, const char **fmt_ptr,
                      const void *arg, int field_width, int precision,
                      int flags)
@@ -273,6 +308,15 @@ 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 'd': /* d<domain-id> from a struct domain */
+    {
+        const struct domain *d = arg;
+
+        ++*fmt_ptr;
+
+        return print_domain(str, end, d);
+    }
+
     case 'h': /* Raw buffer as hex string. */
     {
         const uint8_t *hex_buffer = arg;
@@ -374,17 +418,8 @@ static char *pointer(char *str, char *end, const char **fmt_ptr,
         const struct vcpu *v = arg;
 
         ++*fmt_ptr;
-        if ( unlikely(v->domain->domain_id == DOMID_IDLE) )
-            str = string(str, end, "IDLE", -1, -1, 0);
-        else
-        {
-            if ( str < end )
-                *str = 'd';
-            str = number(str + 1, end, v->domain->domain_id, 10, -1, -1, 0);
-        }
-        if ( str < end )
-            *str = 'v';
-        return number(str + 1, end, v->vcpu_id, 10, -1, -1, 0);
+
+        return print_vcpu(str, end, v);
     }
     }
 
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH RFC] xen/vsprintf: Introduce %pd formatter for domains
  2018-08-30 13:06 [PATCH RFC] xen/vsprintf: Introduce %pd formatter for domains Andrew Cooper
@ 2018-08-30 14:18 ` Jan Beulich
  2018-09-07 11:11   ` Andrew Cooper
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Beulich @ 2018-08-30 14:18 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: Stefano Stabellini, Wei Liu, George Dunlap, Tim Deegan,
	Xen-devel, Julien Grall

>>> On 30.08.18 at 15:06, <andrew.cooper3@citrix.com> wrote:
> This allows all system domids to be printed by name, rather than special
> casing the idle vcpus alone.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: George Dunlap <George.Dunlap@eu.citrix.com>
> CC: Jan Beulich <JBeulich@suse.com>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> CC: Stefano Stabellini <sstabellini@kernel.org>
> CC: Tim Deegan <tim@xen.org>
> CC: Wei Liu <wei.liu2@citrix.com>
> CC: Julien Grall <julien.grall@arm.com>
> 
> RFC, because this was proposed before but rejected at the time.  I'm looking
> to try and turn errors like this:
> 
>   (XEN) mm.c:1023:d0v2 pg_owner d32754 l1e_owner d0, but real_pg_owner d0
>   (XEN) mm.c:1099:d0v2 Error getting mfn 810020 (pfn 59db1) from L1 entry 8000000810020227 for l1e_owner d0, pg_owner d32754
> 
> into the slightly more helpful:
> 
>   (XEN) mm.c:1022:d0v2 pg_owner dXEN l1e_owner d0, but real_pg_owner d0
>   (XEN) mm.c:1098:d0v2 Error getting mfn 810020 (pfn 59db1) from L1 entry 8000000810020227 for l1e_owner d0, pg_owner dXEN
> 
> although even in this case, the former printk has an awkward corner case of a
> possibly NULL domain pointer, which can possibly only reasonably be fixed
> inside pointer() itself.

Or in print_domain(), producing "NULL".

> --- a/docs/misc/printk-formats.txt
> +++ b/docs/misc/printk-formats.txt
> @@ -28,5 +28,8 @@ Symbol/Function pointers:
>  
>  Domain and vCPU information:
>  
> +       %pd     Domain from a 'struct domain *d' (printed as d<domid>, but with
> +               system domains represented by name, e.g. 'dIDLE')

This looks a little awkward - how about d<IDLE> etc?

> --- a/xen/common/vsprintf.c
> +++ b/xen/common/vsprintf.c
> @@ -264,6 +264,41 @@ static char *string(char *str, char *end, const char *s,
>      return str;
>  }
>  
> +/* Print a domain as d<num> or d<str> for system domains. */
> +static char *print_domain(char *str, char *end, const struct domain *d)
> +{
> +    const char *name = NULL;
> +
> +    if ( str < end )
> +        *str++ = 'd';

I would guess you've copied this idiom from somewhere, and if so
it would be good to know where we still have got such broken
construct(s) left: The increment needs to happen outside of the
if(), for snprintf() et al to return a large enough number. See e.g.
string(). Perhaps best to do this like you do ...

> +static char *print_vcpu(char *str, char *end, const struct vcpu *v)
> +{
> +    str = print_domain(str, end, v->domain);
> +
> +    if ( str < end )
> +        *str = 'v';
> +
> +    return number(str + 1, end, v->vcpu_id, 10, -1, -1, 0);

... here.

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH RFC] xen/vsprintf: Introduce %pd formatter for domains
  2018-08-30 14:18 ` Jan Beulich
@ 2018-09-07 11:11   ` Andrew Cooper
  0 siblings, 0 replies; 3+ messages in thread
From: Andrew Cooper @ 2018-09-07 11:11 UTC (permalink / raw)
  To: Jan Beulich
  Cc: Stefano Stabellini, Wei Liu, Konrad Rzeszutek Wilk,
	George Dunlap, Tim Deegan, Xen-devel, Julien Grall

On 30/08/18 15:18, Jan Beulich wrote:
>>>> On 30.08.18 at 15:06, <andrew.cooper3@citrix.com> wrote:
>> This allows all system domids to be printed by name, rather than special
>> casing the idle vcpus alone.
>>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
>> ---
>> CC: George Dunlap <George.Dunlap@eu.citrix.com>
>> CC: Jan Beulich <JBeulich@suse.com>
>> CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> CC: Stefano Stabellini <sstabellini@kernel.org>
>> CC: Tim Deegan <tim@xen.org>
>> CC: Wei Liu <wei.liu2@citrix.com>
>> CC: Julien Grall <julien.grall@arm.com>
>>
>> RFC, because this was proposed before but rejected at the time.  I'm looking
>> to try and turn errors like this:
>>
>>   (XEN) mm.c:1023:d0v2 pg_owner d32754 l1e_owner d0, but real_pg_owner d0
>>   (XEN) mm.c:1099:d0v2 Error getting mfn 810020 (pfn 59db1) from L1 entry 8000000810020227 for l1e_owner d0, pg_owner d32754
>>
>> into the slightly more helpful:
>>
>>   (XEN) mm.c:1022:d0v2 pg_owner dXEN l1e_owner d0, but real_pg_owner d0
>>   (XEN) mm.c:1098:d0v2 Error getting mfn 810020 (pfn 59db1) from L1 entry 8000000810020227 for l1e_owner d0, pg_owner dXEN
>>
>> although even in this case, the former printk has an awkward corner case of a
>> possibly NULL domain pointer, which can possibly only reasonably be fixed
>> inside pointer() itself.
> Or in print_domain(), producing "NULL".

Sounds like a good plan.

>
>> --- a/docs/misc/printk-formats.txt
>> +++ b/docs/misc/printk-formats.txt
>> @@ -28,5 +28,8 @@ Symbol/Function pointers:
>>  
>>  Domain and vCPU information:
>>  
>> +       %pd     Domain from a 'struct domain *d' (printed as d<domid>, but with
>> +               system domains represented by name, e.g. 'dIDLE')
> This looks a little awkward - how about d<IDLE> etc?

A sample looks like:

dIDLEv0 dIO dXEN dCOW
d<IDLE>v0 d<IO> d<XEN> d<COW>

Another alternative would be:

d[IDLE]v0 d[IO] d[XEN] d[COW]

Which I think I prefer to angle brackets.

>
>> --- a/xen/common/vsprintf.c
>> +++ b/xen/common/vsprintf.c
>> @@ -264,6 +264,41 @@ static char *string(char *str, char *end, const char *s,
>>      return str;
>>  }
>>  
>> +/* Print a domain as d<num> or d<str> for system domains. */
>> +static char *print_domain(char *str, char *end, const struct domain *d)
>> +{
>> +    const char *name = NULL;
>> +
>> +    if ( str < end )
>> +        *str++ = 'd';
> I would guess you've copied this idiom from somewhere, and if so
> it would be good to know where we still have got such broken
> construct(s) left:

No - serves me write from trying to code from memory.  Fixed.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-09-07 11:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-30 13:06 [PATCH RFC] xen/vsprintf: Introduce %pd formatter for domains Andrew Cooper
2018-08-30 14:18 ` Jan Beulich
2018-09-07 11:11   ` Andrew Cooper

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.