<div dir="ltr"><div dir="ltr">On Tue, Aug 15, 2023 at 10:41 AM <<a href="mailto:crash-utility-request@redhat.com">crash-utility-request@redhat.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Date: Mon, 14 Aug 2023 09:41:12 -0400<br>
From: Rafael Aquini <<a href="mailto:aquini@redhat.com" target="_blank">aquini@redhat.com</a>><br>
To: <a href="mailto:crash-utility@redhat.com" target="_blank">crash-utility@redhat.com</a><br>
Cc: <a href="mailto:raquini@redhat.com" target="_blank">raquini@redhat.com</a><br>
Subject: [Crash-utility] [PATCH] deduplicate kernel_version open-coded<br>
        parser<br>
Message-ID: <<a href="mailto:20230814134112.232436-1-aquini@redhat.com" target="_blank">20230814134112.232436-1-aquini@redhat.com</a>><br>
<br>
The code that parses kernel version from OSRELEASE/UTSRELEASE strings<br>
and populates the global kernel table is duplicated across the codebase<br>
for no good reason. This commit consolidates all the duplicated parsing<br>
code into a single method to remove the unnecessary duplicated code.<br>
<br></blockquote><div><br></div><div>Thank you for the patch, Rafael.</div><div><br></div><div>And this looks good to me, so:  Ack.</div><div><br></div><div>Thanks.</div><div>Lianbo</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Signed-off-by: Rafael Aquini <<a href="mailto:aquini@redhat.com" target="_blank">aquini@redhat.com</a>><br>
---<br>
 arm64.c   | 27 +++----------------<br>
 defs.h    |  2 ++<br>
 kernel.c  | 77 ++++++++++++++++++++++++++-----------------------------<br>
 riscv64.c | 25 ++----------------<br>
 4 files changed, 43 insertions(+), 88 deletions(-)<br>
<br>
diff --git a/arm64.c b/arm64.c<br>
index 67b1a22..39d5f04 100644<br>
--- a/arm64.c<br>
+++ b/arm64.c<br>
@@ -834,35 +834,14 @@ static struct kernel_va_range_handler kernel_va_range_handlers[] = {<br>
 static unsigned long arm64_get_kernel_version(void)<br>
 {<br>
        char *string;<br>
-       char buf[BUFSIZE];<br>
-       char *p1, *p2;<br>
<br>
        if (THIS_KERNEL_VERSION)<br>
                return THIS_KERNEL_VERSION;<br>
<br>
-       string = pc->read_vmcoreinfo("OSRELEASE");<br>
-       if (string) {<br>
-               strcpy(buf, string);<br>
-<br>
-               p1 = p2 = buf;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[0] = atoi(p1);<br>
-<br>
-               p1 = ++p2;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[1] = atoi(p1);<br>
-<br>
-               p1 = ++p2;<br>
-               while ((*p2 >= '0') && (*p2 <= '9'))<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[2] = atoi(p1);<br>
+       if ((string = pc->read_vmcoreinfo("OSRELEASE"))) {<br>
+               parse_kernel_version(string);<br>
+               free(string);<br>
        }<br>
-       free(string);<br>
        return THIS_KERNEL_VERSION;<br>
 }<br>
<br>
diff --git a/defs.h b/defs.h<br>
index 5ee60f1..1925148 100644<br>
--- a/defs.h<br>
+++ b/defs.h<br>
@@ -6032,6 +6032,8 @@ void clone_bt_info(struct bt_info *, struct bt_info *, struct task_context *);<br>
 void dump_kernel_table(int);<br>
 void dump_bt_info(struct bt_info *, char *where);<br>
 void dump_log(int);<br>
+void parse_kernel_version(char *);<br>
+<br>
 #define LOG_LEVEL(v) ((v) & 0x07)<br>
 #define SHOW_LOG_LEVEL (0x1)<br>
 #define SHOW_LOG_DICT  (0x2)<br>
diff --git a/kernel.c b/kernel.c<br>
index 2114700..988206b 100644<br>
--- a/kernel.c<br>
+++ b/kernel.c<br>
@@ -104,6 +104,38 @@ static void check_vmcoreinfo(void);<br>
 static int is_pvops_xen(void);<br>
 static int get_linux_banner_from_vmlinux(char *, size_t);<br>
<br>
+/*<br>
+ * popuplate the global kernel table (kt) with kernel version<br>
+ * information parsed from UTSNAME/OSRELEASE string<br>
+ */<br>
+void<br>
+parse_kernel_version(char *str)<br>
+{<br>
+       char *p1, *p2, separator;<br>
+<br>
+       p1 = p2 = str;<br>
+       while (*p2 != '.' && *p2 != '\0')<br>
+               p2++;<br>
+<br>
+       *p2 = NULLCHAR;<br>
+       kt->kernel_version[0] = atoi(p1);<br>
+       p1 = ++p2;<br>
+       while (*p2 != '.' && *p2 != '-' && *p2 != '\0')<br>
+               p2++;<br>
+<br>
+       separator = *p2;<br>
+       *p2 = NULLCHAR;<br>
+       kt->kernel_version[1] = atoi(p1);<br>
+<br>
+       if (separator == '.') {<br>
+               p1 = ++p2;<br>
+               while ((*p2 >= '0') && (*p2 <= '9'))<br>
+                       p2++;<br>
+<br>
+               *p2 = NULLCHAR;<br>
+               kt->kernel_version[2] = atoi(p1);<br>
+       }<br>
+}<br>
<br>
 /*<br>
  *  Gather a few kernel basics.<br>
@@ -112,7 +144,7 @@ void<br>
 kernel_init()<br>
 {<br>
        int i, c;<br>
-       char *p1, *p2, buf[BUFSIZE];<br>
+       char buf[BUFSIZE];<br>
        struct syment *sp1, *sp2;<br>
        char *rqstruct;<br>
        char *rq_timestamp_name = NULL;<br>
@@ -270,28 +302,7 @@ kernel_init()<br>
        if (buf[64])<br>
                buf[64] = NULLCHAR;<br>
        if (ascii_string(kt->utsname.release)) {<br>
-               char separator;<br>
-<br>
-               p1 = p2 = buf;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[0] = atoi(p1);<br>
-               p1 = ++p2;<br>
-               while (*p2 != '.' && *p2 != '-' && *p2 != '\0')<br>
-                       p2++;<br>
-               separator = *p2;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[1] = atoi(p1);<br>
-               *p2 = separator;<br>
-               if (*p2 == '.') {<br>
-                       p1 = ++p2;<br>
-                       while ((*p2 >= '0') && (*p2 <= '9'))<br>
-                               p2++;<br>
-                       *p2 = NULLCHAR;<br>
-                       kt->kernel_version[2] = atoi(p1);<br>
-               } else<br>
-                       kt->kernel_version[2] = 0;<br>
+               parse_kernel_version(buf);<br>
<br>
                if (CRASHDEBUG(1))<br>
                        fprintf(fp, "base kernel version: %d.%d.%d\n",<br>
@@ -10973,8 +10984,6 @@ void<br>
 get_log_from_vmcoreinfo(char *file)<br>
 {<br>
        char *string;<br>
-       char buf[BUFSIZE];<br>
-       char *p1, *p2;<br>
        struct vmcoreinfo_data *vmc = &kt->vmcoreinfo;<br>
<br>
        if (!(pc->flags2 & VMCOREINFO))<br>
@@ -10986,22 +10995,8 @@ get_log_from_vmcoreinfo(char *file)<br>
        if ((string = pc->read_vmcoreinfo("OSRELEASE"))) {<br>
                if (CRASHDEBUG(1))<br>
                        fprintf(fp, "OSRELEASE: %s\n", string);<br>
-               strcpy(buf, string);<br>
-               p1 = p2 = buf;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[0] = atoi(p1);<br>
-               p1 = ++p2;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[1] = atoi(p1);<br>
-               p1 = ++p2;<br>
-               while ((*p2 >= '0') && (*p2 <= '9'))<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[2] = atoi(p1);<br>
+<br>
+               parse_kernel_version(string);<br>
<br>
                if (CRASHDEBUG(1))<br>
                        fprintf(fp, "base kernel version: %d.%d.%d\n",<br>
diff --git a/riscv64.c b/riscv64.c<br>
index 6b9a688..066cf2c 100644<br>
--- a/riscv64.c<br>
+++ b/riscv64.c<br>
@@ -259,33 +259,12 @@ riscv64_processor_speed(void)<br>
 static unsigned long riscv64_get_kernel_version(void)<br>
 {<br>
        char *string;<br>
-       char buf[BUFSIZE];<br>
-       char *p1, *p2;<br>
<br>
        if (THIS_KERNEL_VERSION)<br>
                return THIS_KERNEL_VERSION;<br>
<br>
-       string = pc->read_vmcoreinfo("OSRELEASE");<br>
-       if (string) {<br>
-               strcpy(buf, string);<br>
-<br>
-               p1 = p2 = buf;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[0] = atoi(p1);<br>
-<br>
-               p1 = ++p2;<br>
-               while (*p2 != '.')<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[1] = atoi(p1);<br>
-<br>
-               p1 = ++p2;<br>
-               while ((*p2 >= '0') && (*p2 <= '9'))<br>
-                       p2++;<br>
-               *p2 = NULLCHAR;<br>
-               kt->kernel_version[2] = atoi(p1);<br>
+       if ((string = pc->read_vmcoreinfo("OSRELEASE"))) {<br>
+               parse_kernel_version(string);<br>
                free(string);<br>
        }<br>
        return THIS_KERNEL_VERSION;<br>
-- <br>
2.41.0<br>
</blockquote></div></div>