Skip to content

Commit

Permalink
libsemanage: improve performance of semanage store rebuild
Browse files Browse the repository at this point in the history
Commit 9d107ab ("libsemanage: Set new restorecon handle before doing restorecon
") added reopeniong selabel handle every time semanage_setfiles() is
called. It means that during `semodule -B`, `selabel_close()` and
`selabel_open()` could be called more than 1800x what could have a
significant performance impact.

It should be enough to reopen selabel handle just after semanage commit
when changes are applied.

Before 9d107ab:
    semodule -B  5.84s user 0.52s system 96% cpu 6.585 total

After 9d107ab:
    semodule -B  11.15s user 0.64s system 98% cpu 11.952 total

With this patch:
    semodule -B  5.51s user 0.41s system 98% cpu 6.014 total

Signed-off-by: Petr Lautrbach <[email protected]>
Acked-by: Jason Zaman <[email protected]>
  • Loading branch information
bachradsusi committed Mar 3, 2025
1 parent 71aec30 commit ec960f9
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions libsemanage/src/semanage_store.c
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,7 @@ static int semanage_commit_sandbox(semanage_handle_t * sh)
semanage_path(SEMANAGE_PREVIOUS, SEMANAGE_TOPLEVEL);
const char *sandbox = semanage_path(SEMANAGE_TMP, SEMANAGE_TOPLEVEL);
struct stat buf;
struct selabel_handle *sehandle;

/* update the commit number */
if ((commit_number = semanage_direct_get_serial(sh)) < 0) {
Expand Down Expand Up @@ -1822,6 +1823,8 @@ static int semanage_commit_sandbox(semanage_handle_t * sh)

cleanup:
semanage_release_active_lock(sh);
sehandle = selinux_restorecon_default_handle();
selinux_restorecon_set_sehandle(sehandle);
return retval;
}

Expand Down Expand Up @@ -3012,14 +3015,10 @@ log_callback_mute(__attribute__((unused)) int type, __attribute__((unused)) cons
void semanage_setfiles(semanage_handle_t * sh, const char *path){
struct stat sb;
int fd;
struct selabel_handle *sehandle;

union selinux_callback cb_orig = selinux_get_callback(SELINUX_CB_LOG);
union selinux_callback cb = { .func_log = log_callback_mute };

sehandle = selinux_restorecon_default_handle();
selinux_restorecon_set_sehandle(sehandle);

/* Mute all logs */
selinux_set_callback(SELINUX_CB_LOG, cb);

Expand Down

0 comments on commit ec960f9

Please sign in to comment.