svn commit: r348473 - head/sys/netinet/netdump
Mark Johnston
markj at FreeBSD.org
Fri May 31 18:29:13 UTC 2019
Author: markj
Date: Fri May 31 18:29:12 2019
New Revision: 348473
URL: https://svnweb.freebsd.org/changeset/base/348473
Log:
netdump: Buffer pages to avoid calling netdump_send() on each 4KB write.
netdump waits for acknowledgement from the server for each write. When
dumping page table pages, we perform many small writes, limiting
throughput. Use the netdump client's buffer to buffer small contiguous
writes before calling netdump_send() to flush the MAXDUMPPGS-sized
buffer. This results in a significant reduction in the time taken to
complete a netdump.
Submitted by: Sam Gwydir <sam at samgwydir.com>
Reviewed by: cem
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D20317
Modified:
head/sys/netinet/netdump/netdump_client.c
Modified: head/sys/netinet/netdump/netdump_client.c
==============================================================================
--- head/sys/netinet/netdump/netdump_client.c Fri May 31 18:00:44 2019 (r348472)
+++ head/sys/netinet/netdump/netdump_client.c Fri May 31 18:29:12 2019 (r348473)
@@ -130,6 +130,9 @@ static struct {
union kd_ip ndc_client;
union kd_ip ndc_gateway;
uint8_t ndc_af;
+ /* Runtime State */
+ off_t nd_tx_off;
+ size_t nd_buf_len;
} nd_conf;
#define nd_server nd_conf.ndc_server.in4
#define nd_client nd_conf.ndc_client.in4
@@ -945,6 +948,14 @@ netdump_dumper(void *priv __unused, void *virtual,
virtual, (uintmax_t)offset, length);
if (virtual == NULL) {
+ if (nd_conf.nd_buf_len != 0) {
+ error = netdump_send(NETDUMP_VMCORE, nd_conf.nd_tx_off, nd_buf,
+ nd_conf.nd_buf_len);
+ if (error != 0) {
+ dump_failed = 1;
+ }
+ }
+
if (dump_failed != 0)
printf("failed to dump the kernel core\n");
else if (netdump_send(NETDUMP_FINISHED, 0, NULL, 0) != 0)
@@ -957,12 +968,22 @@ netdump_dumper(void *priv __unused, void *virtual,
if (length > sizeof(nd_buf))
return (ENOSPC);
- memmove(nd_buf, virtual, length);
- error = netdump_send(NETDUMP_VMCORE, offset, nd_buf, length);
- if (error != 0) {
- dump_failed = 1;
- return (error);
+ if (nd_conf.nd_buf_len + length > sizeof(nd_buf) ||
+ (nd_conf.nd_buf_len != 0 && nd_conf.nd_tx_off +
+ nd_conf.nd_buf_len != offset)) {
+ error = netdump_send(NETDUMP_VMCORE, nd_conf.nd_tx_off, nd_buf,
+ nd_conf.nd_buf_len);
+ if (error != 0) {
+ dump_failed = 1;
+ return (error);
+ }
+ nd_conf.nd_buf_len = 0;
+ nd_conf.nd_tx_off = offset;
}
+
+ memmove(nd_buf + nd_conf.nd_buf_len, virtual, length);
+ nd_conf.nd_buf_len += length;
+
return (0);
}
More information about the svn-src-all
mailing list