Skip to content

Commit

Permalink
efi: pstore: move workqueue handling out of efivars
Browse files Browse the repository at this point in the history
The worker thread that gets kicked off to sync the state of the
EFI variable list is only used by the EFI pstore implementation,
and is defined in its source file. So let's move its scheduling
there as well. Since our efivar_init() scan will bail on duplicate
entries, there is no need to disable the workqueue like we did
before, so we can run it unconditionally.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
  • Loading branch information
Ard Biesheuvel committed Sep 29, 2020
1 parent 232f4eb commit c9b51a2
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 26 deletions.
7 changes: 5 additions & 2 deletions drivers/firmware/efi/efi-pstore.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644);
EFI_VARIABLE_RUNTIME_ACCESS)

static LIST_HEAD(efi_pstore_list);
static DECLARE_WORK(efivar_work, NULL);

static int efi_pstore_open(struct pstore_info *psi)
{
Expand Down Expand Up @@ -267,8 +268,9 @@ static int efi_pstore_write(struct pstore_record *record)
ret = efivar_entry_set_safe(efi_name, vendor, PSTORE_EFI_ATTRIBUTES,
preemptible(), record->size, record->psi->buf);

if (record->reason == KMSG_DUMP_OOPS)
efivar_run_worker();
if (record->reason == KMSG_DUMP_OOPS && try_module_get(THIS_MODULE))
if (!schedule_work(&efivar_work))
module_put(THIS_MODULE);

return ret;
};
Expand Down Expand Up @@ -412,6 +414,7 @@ static void efi_pstore_update_entries(struct work_struct *work)
}

kfree(entry);
module_put(THIS_MODULE);
}

static __init int efivars_pstore_init(void)
Expand Down
21 changes: 0 additions & 21 deletions drivers/firmware/efi/vars.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ static struct efivars *__efivars;
*/
static DEFINE_SEMAPHORE(efivars_lock);

static bool efivar_wq_enabled = true;
DECLARE_WORK(efivar_work, NULL);
EXPORT_SYMBOL_GPL(efivar_work);

static bool
validate_device_path(efi_char16_t *var_name, int match, u8 *buffer,
unsigned long len)
Expand Down Expand Up @@ -391,13 +387,6 @@ static void dup_variable_bug(efi_char16_t *str16, efi_guid_t *vendor_guid,
size_t i, len8 = len16 / sizeof(efi_char16_t);
char *str8;

/*
* Disable the workqueue since the algorithm it uses for
* detecting new variables won't work with this buggy
* implementation of GetNextVariableName().
*/
efivar_wq_enabled = false;

str8 = kzalloc(len8, GFP_KERNEL);
if (!str8)
return;
Expand Down Expand Up @@ -1157,16 +1146,6 @@ struct kobject *efivars_kobject(void)
}
EXPORT_SYMBOL_GPL(efivars_kobject);

/**
* efivar_run_worker - schedule the efivar worker thread
*/
void efivar_run_worker(void)
{
if (efivar_wq_enabled)
schedule_work(&efivar_work);
}
EXPORT_SYMBOL_GPL(efivar_run_worker);

/**
* efivars_register - register an efivars
* @efivars: efivars to register
Expand Down
3 changes: 0 additions & 3 deletions include/linux/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -1037,9 +1037,6 @@ bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
size_t len);

extern struct work_struct efivar_work;
void efivar_run_worker(void);

#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
int efivars_sysfs_init(void);

Expand Down

0 comments on commit c9b51a2

Please sign in to comment.