Commit e34b8252 authored by Dan Williams's avatar Dan Williams
Browse files

nfit/ars: Introduce scrub_flags



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: default avatarToshi Kani <toshi.kani@hpe.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 317a992a
Loading
Loading
Loading
Loading
+17 −13
Original line number Original line Diff line number Diff line
@@ -1317,19 +1317,23 @@ static ssize_t scrub_show(struct device *dev,
		struct device_attribute *attr, char *buf)
		struct device_attribute *attr, char *buf)
{
{
	struct nvdimm_bus_descriptor *nd_desc;
	struct nvdimm_bus_descriptor *nd_desc;
	struct acpi_nfit_desc *acpi_desc;
	ssize_t rc = -ENXIO;
	ssize_t rc = -ENXIO;
	bool busy;


	device_lock(dev);
	device_lock(dev);
	nd_desc = dev_get_drvdata(dev);
	nd_desc = dev_get_drvdata(dev);
	if (nd_desc) {
	if (!nd_desc) {
		struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc);
		device_unlock(dev);
		return rc;
	}
	acpi_desc = to_acpi_desc(nd_desc);


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


	lockdep_assert_held(&acpi_desc->init_mutex);
	lockdep_assert_held(&acpi_desc->init_mutex);


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


	if (query_rc == -EBUSY) {
	if (query_rc == -EBUSY) {
@@ -3146,7 +3150,7 @@ static void __sched_ars(struct acpi_nfit_desc *acpi_desc, unsigned int tmo)
{
{
	lockdep_assert_held(&acpi_desc->init_mutex);
	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 */
	/* note this should only be set from within the workqueue */
	if (tmo)
	if (tmo)
		acpi_desc->scrub_tmo = tmo;
		acpi_desc->scrub_tmo = tmo;
@@ -3162,7 +3166,7 @@ static void notify_ars_done(struct acpi_nfit_desc *acpi_desc)
{
{
	lockdep_assert_held(&acpi_desc->init_mutex);
	lockdep_assert_held(&acpi_desc->init_mutex);


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


	mutex_lock(&acpi_desc->init_mutex);
	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);
		mutex_unlock(&acpi_desc->init_mutex);
		return 0;
		return 0;
	}
	}
@@ -3530,7 +3534,7 @@ void acpi_nfit_shutdown(void *data)
	mutex_unlock(&acpi_desc_lock);
	mutex_unlock(&acpi_desc_lock);


	mutex_lock(&acpi_desc->init_mutex);
	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);
	cancel_delayed_work_sync(&acpi_desc->dwork);
	mutex_unlock(&acpi_desc->init_mutex);
	mutex_unlock(&acpi_desc->init_mutex);


+6 −2
Original line number Original line Diff line number Diff line
@@ -210,6 +210,11 @@ struct nfit_mem {
	int family;
	int family;
};
};


enum scrub_flags {
	ARS_BUSY,
	ARS_CANCEL,
};

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