<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>