zed: don't malloc() global zed_conf instance, optimise zed_conf layout

It's all of 40 bytes with 4-byte pointers and 64 with 8-byte ones
(previously 44 and 88, respectively) ‒
there's no reason it can't live on the stack

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #11860
This commit is contained in:
наб 2021-04-07 15:38:22 +02:00 committed by Brian Behlendorf
parent f96dbd7a29
commit 32cc3f0837
3 changed files with 48 additions and 63 deletions

View File

@ -216,15 +216,15 @@ _finish_daemonize(void)
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
struct zed_conf *zcp; struct zed_conf zcp;
uint64_t saved_eid; uint64_t saved_eid;
int64_t saved_etime[2]; int64_t saved_etime[2];
zed_log_init(argv[0]); zed_log_init(argv[0]);
zed_log_stderr_open(LOG_NOTICE); zed_log_stderr_open(LOG_NOTICE);
zcp = zed_conf_create(); zed_conf_init(&zcp);
zed_conf_parse_opts(zcp, argc, argv); zed_conf_parse_opts(&zcp, argc, argv);
if (zcp->do_verbose) if (zcp.do_verbose)
zed_log_stderr_open(LOG_INFO); zed_log_stderr_open(LOG_INFO);
if (geteuid() != 0) if (geteuid() != 0)
@ -237,32 +237,32 @@ main(int argc, char *argv[])
if (chdir("/") < 0) if (chdir("/") < 0)
zed_log_die("Failed to change to root directory"); zed_log_die("Failed to change to root directory");
if (zed_conf_scan_dir(zcp) < 0) if (zed_conf_scan_dir(&zcp) < 0)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
if (!zcp->do_foreground) { if (!zcp.do_foreground) {
_start_daemonize(); _start_daemonize();
zed_log_syslog_open(LOG_DAEMON); zed_log_syslog_open(LOG_DAEMON);
} }
_setup_sig_handlers(); _setup_sig_handlers();
if (zcp->do_memlock) if (zcp.do_memlock)
_lock_memory(); _lock_memory();
if ((zed_conf_write_pid(zcp) < 0) && (!zcp->do_force)) if ((zed_conf_write_pid(&zcp) < 0) && (!zcp.do_force))
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
if (!zcp->do_foreground) if (!zcp.do_foreground)
_finish_daemonize(); _finish_daemonize();
zed_log_msg(LOG_NOTICE, zed_log_msg(LOG_NOTICE,
"ZFS Event Daemon %s-%s (PID %d)", "ZFS Event Daemon %s-%s (PID %d)",
ZFS_META_VERSION, ZFS_META_RELEASE, (int)getpid()); ZFS_META_VERSION, ZFS_META_RELEASE, (int)getpid());
if (zed_conf_open_state(zcp) < 0) if (zed_conf_open_state(&zcp) < 0)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
if (zed_conf_read_state(zcp, &saved_eid, saved_etime) < 0) if (zed_conf_read_state(&zcp, &saved_eid, saved_etime) < 0)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
idle: idle:
@ -271,24 +271,24 @@ idle:
* successful. * successful.
*/ */
do { do {
if (!zed_event_init(zcp)) if (!zed_event_init(&zcp))
break; break;
/* Wait for some time and try again. tunable? */ /* Wait for some time and try again. tunable? */
sleep(30); sleep(30);
} while (!_got_exit && zcp->do_idle); } while (!_got_exit && zcp.do_idle);
if (_got_exit) if (_got_exit)
goto out; goto out;
zed_event_seek(zcp, saved_eid, saved_etime); zed_event_seek(&zcp, saved_eid, saved_etime);
while (!_got_exit) { while (!_got_exit) {
int rv; int rv;
if (_got_hup) { if (_got_hup) {
_got_hup = 0; _got_hup = 0;
(void) zed_conf_scan_dir(zcp); (void) zed_conf_scan_dir(&zcp);
} }
rv = zed_event_service(zcp); rv = zed_event_service(&zcp);
/* ENODEV: When kernel module is unloaded (osx) */ /* ENODEV: When kernel module is unloaded (osx) */
if (rv == ENODEV) if (rv == ENODEV)
@ -296,13 +296,13 @@ idle:
} }
zed_log_msg(LOG_NOTICE, "Exiting"); zed_log_msg(LOG_NOTICE, "Exiting");
zed_event_fini(zcp); zed_event_fini(&zcp);
if (zcp->do_idle && !_got_exit) if (zcp.do_idle && !_got_exit)
goto idle; goto idle;
out: out:
zed_conf_destroy(zcp); zed_conf_destroy(&zcp);
zed_log_fini(); zed_log_fini();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }

View File

@ -32,38 +32,26 @@
#include "zed_strings.h" #include "zed_strings.h"
/* /*
* Return a new configuration with default values. * Initialise the configuration with default values.
*/ */
struct zed_conf * void
zed_conf_create(void) zed_conf_init(struct zed_conf *zcp)
{ {
struct zed_conf *zcp; memset(zcp, 0, sizeof (*zcp));
zcp = calloc(1, sizeof (*zcp)); /* zcp->zfs_hdl opened in zed_event_init() */
if (!zcp) /* zcp->zedlets created in zed_conf_scan_dir() */
goto nomem;
zcp->pid_fd = -1; /* opened in zed_conf_write_pid() */
zcp->state_fd = -1; /* opened in zed_conf_open_state() */
zcp->zevent_fd = -1; /* opened in zed_event_init() */
zcp->pid_fd = -1;
zcp->zedlets = NULL; /* created via zed_conf_scan_dir() */
zcp->state_fd = -1; /* opened via zed_conf_open_state() */
zcp->zfs_hdl = NULL; /* opened via zed_event_init() */
zcp->zevent_fd = -1; /* opened via zed_event_init() */
zcp->max_jobs = 16; zcp->max_jobs = 16;
if (!(zcp->pid_file = strdup(ZED_PID_FILE))) if (!(zcp->pid_file = strdup(ZED_PID_FILE)) ||
goto nomem; !(zcp->zedlet_dir = strdup(ZED_ZEDLET_DIR)) ||
!(zcp->state_file = strdup(ZED_STATE_FILE)))
if (!(zcp->zedlet_dir = strdup(ZED_ZEDLET_DIR))) zed_log_die("Failed to create conf: %s", strerror(errno));
goto nomem;
if (!(zcp->state_file = strdup(ZED_STATE_FILE)))
goto nomem;
return (zcp);
nomem:
zed_log_die("Failed to create conf: %s", strerror(errno));
return (NULL);
} }
/* /*
@ -74,9 +62,6 @@ nomem:
void void
zed_conf_destroy(struct zed_conf *zcp) zed_conf_destroy(struct zed_conf *zcp)
{ {
if (!zcp)
return;
if (zcp->state_fd >= 0) { if (zcp->state_fd >= 0) {
if (close(zcp->state_fd) < 0) if (close(zcp->state_fd) < 0)
zed_log_msg(LOG_WARNING, zed_log_msg(LOG_WARNING,
@ -113,7 +98,6 @@ zed_conf_destroy(struct zed_conf *zcp)
zed_strings_destroy(zcp->zedlets); zed_strings_destroy(zcp->zedlets);
zcp->zedlets = NULL; zcp->zedlets = NULL;
} }
free(zcp);
} }
/* /*

View File

@ -20,26 +20,29 @@
#include "zed_strings.h" #include "zed_strings.h"
struct zed_conf { struct zed_conf {
unsigned do_force:1; /* true if force enabled */
unsigned do_foreground:1; /* true if run in foreground */
unsigned do_memlock:1; /* true if locking memory */
unsigned do_verbose:1; /* true if verbosity enabled */
unsigned do_zero:1; /* true if zeroing state */
unsigned do_idle:1; /* true if idle enabled */
char *pid_file; /* abs path to pid file */ char *pid_file; /* abs path to pid file */
int pid_fd; /* fd to pid file for lock */
char *zedlet_dir; /* abs path to zedlet dir */ char *zedlet_dir; /* abs path to zedlet dir */
zed_strings_t *zedlets; /* names of enabled zedlets */
char *state_file; /* abs path to state file */ char *state_file; /* abs path to state file */
int state_fd; /* fd to state file */
libzfs_handle_t *zfs_hdl; /* handle to libzfs */ libzfs_handle_t *zfs_hdl; /* handle to libzfs */
int zevent_fd; /* fd for access to zevents */ zed_strings_t *zedlets; /* names of enabled zedlets */
char *path; /* custom $PATH for zedlets to use */ char *path; /* custom $PATH for zedlets to use */
int pid_fd; /* fd to pid file for lock */
int state_fd; /* fd to state file */
int zevent_fd; /* fd for access to zevents */
int16_t max_jobs; /* max zedlets to run at one time */ int16_t max_jobs; /* max zedlets to run at one time */
boolean_t do_force:1; /* true if force enabled */
boolean_t do_foreground:1; /* true if run in foreground */
boolean_t do_memlock:1; /* true if locking memory */
boolean_t do_verbose:1; /* true if verbosity enabled */
boolean_t do_zero:1; /* true if zeroing state */
boolean_t do_idle:1; /* true if idle enabled */
}; };
struct zed_conf *zed_conf_create(void); void zed_conf_init(struct zed_conf *zcp);
void zed_conf_destroy(struct zed_conf *zcp); void zed_conf_destroy(struct zed_conf *zcp);
void zed_conf_parse_opts(struct zed_conf *zcp, int argc, char **argv); void zed_conf_parse_opts(struct zed_conf *zcp, int argc, char **argv);
@ -49,9 +52,7 @@ int zed_conf_scan_dir(struct zed_conf *zcp);
int zed_conf_write_pid(struct zed_conf *zcp); int zed_conf_write_pid(struct zed_conf *zcp);
int zed_conf_open_state(struct zed_conf *zcp); int zed_conf_open_state(struct zed_conf *zcp);
int zed_conf_read_state(struct zed_conf *zcp, uint64_t *eidp, int64_t etime[]); int zed_conf_read_state(struct zed_conf *zcp, uint64_t *eidp, int64_t etime[]);
int zed_conf_write_state(struct zed_conf *zcp, uint64_t eid, int64_t etime[]); int zed_conf_write_state(struct zed_conf *zcp, uint64_t eid, int64_t etime[]);
#endif /* !ZED_CONF_H */ #endif /* !ZED_CONF_H */