Move the static buffers from send_msg_no_fragmentation() and
send_msg_fragmented() into the netconsole_target structure. This
simplifies the code by:
- Eliminating redundant static buffers
- Centralizing buffer management in the target structure
- Reducing memory usage by 1KB (one buffer instead of two)

The buffer in netconsole_target is protected by target_list_lock,
maintaining the same synchronization semantics as the original code.

Suggested-by: Jakub Kicinski <k...@kernel.org>
Signed-off-by: Breno Leitao <lei...@debian.org>
---
 drivers/net/netconsole.c | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index 
86ab4a42769a49eebe5dd6f01dafafc6c86ec54f..1a78704681184673f5c1ba8ae665e46751384293
 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -137,6 +137,8 @@ struct netconsole_target {
        bool                    extended;
        bool                    release;
        struct netpoll          np;
+       /* protected by target_list_lock */
+       char                    buf[MAX_PRINT_CHUNK];
 };
 
 #ifdef CONFIG_NETCONSOLE_DYNAMIC
@@ -1117,7 +1119,6 @@ static void send_msg_no_fragmentation(struct 
netconsole_target *nt,
                                      int msg_len,
                                      int release_len)
 {
-       static char buf[MAX_PRINT_CHUNK]; /* protected by target_list_lock */
        const char *userdata = NULL;
        const char *release;
 
@@ -1128,18 +1129,18 @@ static void send_msg_no_fragmentation(struct 
netconsole_target *nt,
        if (release_len) {
                release = init_utsname()->release;
 
-               scnprintf(buf, MAX_PRINT_CHUNK, "%s,%s", release, msg);
+               scnprintf(nt->buf, MAX_PRINT_CHUNK, "%s,%s", release, msg);
                msg_len += release_len;
        } else {
-               memcpy(buf, msg, msg_len);
+               memcpy(nt->buf, msg, msg_len);
        }
 
        if (userdata)
-               msg_len += scnprintf(&buf[msg_len],
+               msg_len += scnprintf(&nt->buf[msg_len],
                                     MAX_PRINT_CHUNK - msg_len,
                                     "%s", userdata);
 
-       send_udp(nt, buf, msg_len);
+       send_udp(nt, nt->buf, msg_len);
 }
 
 static void append_release(char *buf)
@@ -1150,7 +1151,7 @@ static void append_release(char *buf)
        scnprintf(buf, MAX_PRINT_CHUNK, "%s,", release);
 }
 
-static void send_fragmented_body(struct netconsole_target *nt, char *buf,
+static void send_fragmented_body(struct netconsole_target *nt,
                                 const char *msgbody, int header_len,
                                 int msgbody_len)
 {
@@ -1181,7 +1182,7 @@ static void send_fragmented_body(struct netconsole_target 
*nt, char *buf,
                int this_offset = 0;
                int this_chunk = 0;
 
-               this_header += scnprintf(buf + this_header,
+               this_header += scnprintf(nt->buf + this_header,
                                         MAX_PRINT_CHUNK - this_header,
                                         ",ncfrag=%d/%d;", offset,
                                         body_len);
@@ -1192,7 +1193,8 @@ static void send_fragmented_body(struct netconsole_target 
*nt, char *buf,
                                         MAX_PRINT_CHUNK - this_header);
                        if (WARN_ON_ONCE(this_chunk <= 0))
                                return;
-                       memcpy(buf + this_header, msgbody + offset, this_chunk);
+                       memcpy(nt->buf + this_header, msgbody + offset,
+                              this_chunk);
                        this_offset += this_chunk;
                }
 
@@ -1226,13 +1228,13 @@ static void send_fragmented_body(struct 
netconsole_target *nt, char *buf,
                                 */
                                return;
 
-                       memcpy(buf + this_header + this_offset,
+                       memcpy(nt->buf + this_header + this_offset,
                               userdata + sent_userdata,
                               this_chunk);
                        this_offset += this_chunk;
                }
 
-               send_udp(nt, buf, this_header + this_offset);
+               send_udp(nt, nt->buf, this_header + this_offset);
                offset += this_offset;
        }
 }
@@ -1242,7 +1244,6 @@ static void send_msg_fragmented(struct netconsole_target 
*nt,
                                int msg_len,
                                int release_len)
 {
-       static char buf[MAX_PRINT_CHUNK]; /* protected by target_list_lock */
        int header_len, msgbody_len;
        const char *msgbody;
 
@@ -1260,16 +1261,16 @@ static void send_msg_fragmented(struct 
netconsole_target *nt,
         * "ncfrag=<byte-offset>/<total-bytes>"
         */
        if (release_len)
-               append_release(buf);
+               append_release(nt->buf);
 
        /* Copy the header into the buffer */
-       memcpy(buf + release_len, msg, header_len);
+       memcpy(nt->buf + release_len, msg, header_len);
        header_len += release_len;
 
        /* for now on, the header will be persisted, and the msgbody
         * will be replaced
         */
-       send_fragmented_body(nt, buf, msgbody, header_len, msgbody_len);
+       send_fragmented_body(nt, msgbody, header_len, msgbody_len);
 }
 
 /**

-- 
2.43.5


Reply via email to