acpi, nfit: limit ->flush_probe() to initialization work
authorDan Williams <dan.j.williams@intel.com>
Fri, 14 Apr 2017 05:48:46 +0000 (22:48 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 17 Apr 2017 19:34:17 +0000 (12:34 -0700)
The nvdimm probe flushing mechanism gives userspace a sync point where
it knows all asynchronous driver probe sequences have completed.
However, it need not wait for other asynchronous actions, like
on-demand address-range-scrub. Track the init work separately from other
work in the workqueue, and only flush the former.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/acpi/nfit/core.c
drivers/acpi/nfit/nfit.h

index 1d54833ade3fd27280b8efc1d37f0f46fc36f87c..69c6cc77130c7e29f2f83b4e2710bdacfb1d25d4 100644 (file)
@@ -2581,6 +2581,7 @@ static void acpi_nfit_scrub(struct work_struct *work)
                        acpi_nfit_register_region(acpi_desc, nfit_spa);
                }
        }
+       acpi_desc->init_complete = 1;
 
        list_for_each_entry(nfit_spa, &acpi_desc->spas, list)
                acpi_nfit_async_scrub(acpi_desc, nfit_spa);
@@ -2784,6 +2785,12 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc)
        device_lock(dev);
        device_unlock(dev);
 
+       /* bounce the init_mutex to make init_complete valid */
+       mutex_lock(&acpi_desc->init_mutex);
+       mutex_unlock(&acpi_desc->init_mutex);
+       if (acpi_desc->init_complete)
+               return 0;
+
        /*
         * Scrub work could take 10s of seconds, userspace may give up so we
         * need to be interruptible while waiting.
index aaabd2721f8e85a630919964a9755716e5b16269..fac098bfa5856acede40863ffad0aaf5aa73e645 100644 (file)
@@ -163,6 +163,7 @@ struct acpi_nfit_desc {
        unsigned int scrub_count;
        unsigned int scrub_mode;
        unsigned int cancel:1;
+       unsigned int init_complete:1;
        unsigned long dimm_cmd_force_en;
        unsigned long bus_cmd_force_en;
        int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,