[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC] xen/vsprintf: Introduce %pd formatter for domains



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@xxxxxxxxxx>
---
CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Tim Deegan <tim@xxxxxxx>
CC: Wei Liu <wei.liu2@xxxxxxxxxx>
CC: Julien Grall <julien.grall@xxxxxxx>

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@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®.