livedump: add event handler hooks

Add three hooks to the livedump process: before, after, and for each
block of dumped data. This allows, for example, quiescing the system
before the dump begins or protecting data of interest to ensure its
consistency in the final output.

Reviewed by:	markj, kib (previous version)
Reviewed by:	debdrup (manpages)
Reviewed by:	Pau Amma <pauamma@gundo.com> (manpages)
MFC after:	3 weeks
Sponsored by:	Juniper Networks, Inc.
Sponsored by:	Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D34067
This commit is contained in:
Mitchell Horne 2022-01-06 15:40:16 -04:00
parent c9114f9f86
commit eb9d205fa6
3 changed files with 27 additions and 1 deletions

View File

@ -318,8 +318,14 @@ Callbacks invoked after a linker file has been successfully unloaded.
Callbacks invoked before a linker file is about to be unloaded.
These callbacks may be used to return an error and prevent the unload from
proceeding.
.It Vt livedumper_start
Callback invoked before beginning a kernel dump of the live system.
.It Vt livedumper_dump
Callback invoked for each dumped block of data during a live kernel dump.
.It Vt livedumper_finish
Callback invoked once a live kernel dump has completed.
.It Vt lle_event
Callback invoked when an link layer event has happened.
Callback invoked when a link layer event has happened.
.It Vt nmbclusters_change
Callback invoked when the number of mbuf clusters has changed.
.It Vt nmbufs_change

View File

@ -31,6 +31,7 @@
#include <sys/conf.h>
#include <sys/caprights.h>
#include <sys/disk.h>
#include <sys/eventhandler.h>
#include <sys/fcntl.h>
#include <sys/file.h>
#include <sys/kerneldump.h>
@ -111,9 +112,15 @@ livedump_start(int fd, int flags, uint8_t compression)
rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
EVENTHANDLER_INVOKE(livedumper_start, &error);
if (error != 0)
goto out;
dump_savectx();
error = minidumpsys(livedi, true);
EVENTHANDLER_INVOKE(livedumper_finish);
out:
VOP_UNLOCK(vp);
vn_rangelock_unlock(vp, rl_cookie);
sx_xunlock(&livedump_sx);
@ -162,6 +169,10 @@ vnode_dump(void *arg, void *virtual, vm_offset_t physical __unused,
MPASS(vp != NULL);
ASSERT_VOP_LOCKED(vp, __func__);
EVENTHANDLER_INVOKE(livedumper_dump, virtual, offset, length, &error);
if (error != 0)
return (error);
/* Done? */
if (virtual == NULL)
return (0);

View File

@ -164,6 +164,15 @@ extern int do_minidump;
int livedump_start(int, int, uint8_t);
/* Live minidump events */
typedef void (*livedump_start_fn)(void *arg, int *errorp);
typedef void (*livedump_dump_fn)(void *arg, void *virtual, off_t offset,
size_t len, int *errorp);
typedef void (*livedump_finish_fn)(void *arg);
EVENTHANDLER_DECLARE(livedumper_start, livedump_start_fn);
EVENTHANDLER_DECLARE(livedumper_dump, livedump_dump_fn);
EVENTHANDLER_DECLARE(livedumper_finish, livedump_finish_fn);
#endif
#endif /* _SYS_KERNELDUMP_H */