Skip to content

Commit

Permalink
nfit/ars: Introduce scrub_flags
Browse files Browse the repository at this point in the history
In preparation for introducing new flags to gate whether ARS results are
stale, or poll the completion state, convert the existing flags to an
unsigned long with enumerated values. This conversion allows the flags
to be atomically updated outside of ->init_mutex.

Reviewed-by: Toshi Kani <[email protected]>
Signed-off-by: Dan Williams <[email protected]>
  • Loading branch information
djbw committed Feb 20, 2019
1 parent 317a992 commit e34b825
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 15 deletions.
30 changes: 17 additions & 13 deletions drivers/acpi/nfit/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1317,19 +1317,23 @@ static ssize_t scrub_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct nvdimm_bus_descriptor *nd_desc;
struct acpi_nfit_desc *acpi_desc;
ssize_t rc = -ENXIO;
bool busy;

device_lock(dev);
nd_desc = dev_get_drvdata(dev);
if (nd_desc) {
struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc);

mutex_lock(&acpi_desc->init_mutex);
rc = sprintf(buf, "%d%s", acpi_desc->scrub_count,
acpi_desc->scrub_busy
&& !acpi_desc->cancel ? "+\n" : "\n");
mutex_unlock(&acpi_desc->init_mutex);
if (!nd_desc) {
device_unlock(dev);
return rc;
}
acpi_desc = to_acpi_desc(nd_desc);

mutex_lock(&acpi_desc->init_mutex);
busy = test_bit(ARS_BUSY, &acpi_desc->scrub_flags)
&& !test_bit(ARS_CANCEL, &acpi_desc->scrub_flags);
rc = sprintf(buf, "%d%s", acpi_desc->scrub_count, busy ? "+\n" : "\n");
mutex_unlock(&acpi_desc->init_mutex);
device_unlock(dev);
return rc;
}
Expand Down Expand Up @@ -3072,7 +3076,7 @@ static unsigned int __acpi_nfit_scrub(struct acpi_nfit_desc *acpi_desc,

lockdep_assert_held(&acpi_desc->init_mutex);

if (acpi_desc->cancel)
if (test_bit(ARS_CANCEL, &acpi_desc->scrub_flags))
return 0;

if (query_rc == -EBUSY) {
Expand Down Expand Up @@ -3146,7 +3150,7 @@ static void __sched_ars(struct acpi_nfit_desc *acpi_desc, unsigned int tmo)
{
lockdep_assert_held(&acpi_desc->init_mutex);

acpi_desc->scrub_busy = 1;
set_bit(ARS_BUSY, &acpi_desc->scrub_flags);
/* note this should only be set from within the workqueue */
if (tmo)
acpi_desc->scrub_tmo = tmo;
Expand All @@ -3162,7 +3166,7 @@ static void notify_ars_done(struct acpi_nfit_desc *acpi_desc)
{
lockdep_assert_held(&acpi_desc->init_mutex);

acpi_desc->scrub_busy = 0;
clear_bit(ARS_BUSY, &acpi_desc->scrub_flags);
acpi_desc->scrub_count++;
if (acpi_desc->scrub_count_state)
sysfs_notify_dirent(acpi_desc->scrub_count_state);
Expand Down Expand Up @@ -3451,7 +3455,7 @@ int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc,
struct nfit_spa *nfit_spa;

mutex_lock(&acpi_desc->init_mutex);
if (acpi_desc->cancel) {
if (test_bit(ARS_CANCEL, &acpi_desc->scrub_flags)) {
mutex_unlock(&acpi_desc->init_mutex);
return 0;
}
Expand Down Expand Up @@ -3530,7 +3534,7 @@ void acpi_nfit_shutdown(void *data)
mutex_unlock(&acpi_desc_lock);

mutex_lock(&acpi_desc->init_mutex);
acpi_desc->cancel = 1;
set_bit(ARS_CANCEL, &acpi_desc->scrub_flags);
cancel_delayed_work_sync(&acpi_desc->dwork);
mutex_unlock(&acpi_desc->init_mutex);

Expand Down
8 changes: 6 additions & 2 deletions drivers/acpi/nfit/nfit.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,11 @@ struct nfit_mem {
int family;
};

enum scrub_flags {
ARS_BUSY,
ARS_CANCEL,
};

struct acpi_nfit_desc {
struct nvdimm_bus_descriptor nd_desc;
struct acpi_table_header acpi_header;
Expand All @@ -231,8 +236,7 @@ struct acpi_nfit_desc {
unsigned int max_ars;
unsigned int scrub_count;
unsigned int scrub_mode;
unsigned int scrub_busy:1;
unsigned int cancel:1;
unsigned long scrub_flags;
unsigned long dimm_cmd_force_en;
unsigned long bus_cmd_force_en;
unsigned long bus_nfit_cmd_force_en;
Expand Down

0 comments on commit e34b825

Please sign in to comment.