aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/nfit/core.c28
-rw-r--r--drivers/acpi/nfit/nfit.h24
-rw-r--r--drivers/base/core.c30
-rw-r--r--drivers/nvdimm/btt_devs.c16
-rw-r--r--drivers/nvdimm/bus.c210
-rw-r--r--drivers/nvdimm/core.c10
-rw-r--r--drivers/nvdimm/dimm_devs.c4
-rw-r--r--drivers/nvdimm/namespace_devs.c36
-rw-r--r--drivers/nvdimm/nd-core.h71
-rw-r--r--drivers/nvdimm/pfn_devs.c24
-rw-r--r--drivers/nvdimm/pmem.c4
-rw-r--r--drivers/nvdimm/region.c24
-rw-r--r--drivers/nvdimm/region_devs.c12
-rw-r--r--include/linux/device.h6
14 files changed, 343 insertions, 156 deletions
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index c02fa27dd3f3..1413324982f0 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -1282,7 +1282,7 @@ static ssize_t hw_error_scrub_store(struct device *dev,
1282 if (rc) 1282 if (rc)
1283 return rc; 1283 return rc;
1284 1284
1285 device_lock(dev); 1285 nfit_device_lock(dev);
1286 nd_desc = dev_get_drvdata(dev); 1286 nd_desc = dev_get_drvdata(dev);
1287 if (nd_desc) { 1287 if (nd_desc) {
1288 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); 1288 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc);
@@ -1299,7 +1299,7 @@ static ssize_t hw_error_scrub_store(struct device *dev,
1299 break; 1299 break;
1300 } 1300 }
1301 } 1301 }
1302 device_unlock(dev); 1302 nfit_device_unlock(dev);
1303 if (rc) 1303 if (rc)
1304 return rc; 1304 return rc;
1305 return size; 1305 return size;
@@ -1319,7 +1319,7 @@ static ssize_t scrub_show(struct device *dev,
1319 ssize_t rc = -ENXIO; 1319 ssize_t rc = -ENXIO;
1320 bool busy; 1320 bool busy;
1321 1321
1322 device_lock(dev); 1322 nfit_device_lock(dev);
1323 nd_desc = dev_get_drvdata(dev); 1323 nd_desc = dev_get_drvdata(dev);
1324 if (!nd_desc) { 1324 if (!nd_desc) {
1325 device_unlock(dev); 1325 device_unlock(dev);
@@ -1339,7 +1339,7 @@ static ssize_t scrub_show(struct device *dev,
1339 } 1339 }
1340 1340
1341 mutex_unlock(&acpi_desc->init_mutex); 1341 mutex_unlock(&acpi_desc->init_mutex);
1342 device_unlock(dev); 1342 nfit_device_unlock(dev);
1343 return rc; 1343 return rc;
1344} 1344}
1345 1345
@@ -1356,14 +1356,14 @@ static ssize_t scrub_store(struct device *dev,
1356 if (val != 1) 1356 if (val != 1)
1357 return -EINVAL; 1357 return -EINVAL;
1358 1358
1359 device_lock(dev); 1359 nfit_device_lock(dev);
1360 nd_desc = dev_get_drvdata(dev); 1360 nd_desc = dev_get_drvdata(dev);
1361 if (nd_desc) { 1361 if (nd_desc) {
1362 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); 1362 struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc);
1363 1363
1364 rc = acpi_nfit_ars_rescan(acpi_desc, ARS_REQ_LONG); 1364 rc = acpi_nfit_ars_rescan(acpi_desc, ARS_REQ_LONG);
1365 } 1365 }
1366 device_unlock(dev); 1366 nfit_device_unlock(dev);
1367 if (rc) 1367 if (rc)
1368 return rc; 1368 return rc;
1369 return size; 1369 return size;
@@ -1749,9 +1749,9 @@ static void acpi_nvdimm_notify(acpi_handle handle, u32 event, void *data)
1749 struct acpi_device *adev = data; 1749 struct acpi_device *adev = data;
1750 struct device *dev = &adev->dev; 1750 struct device *dev = &adev->dev;
1751 1751
1752 device_lock(dev->parent); 1752 nfit_device_lock(dev->parent);
1753 __acpi_nvdimm_notify(dev, event); 1753 __acpi_nvdimm_notify(dev, event);
1754 device_unlock(dev->parent); 1754 nfit_device_unlock(dev->parent);
1755} 1755}
1756 1756
1757static bool acpi_nvdimm_has_method(struct acpi_device *adev, char *method) 1757static bool acpi_nvdimm_has_method(struct acpi_device *adev, char *method)
@@ -3457,8 +3457,8 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc)
3457 struct device *dev = acpi_desc->dev; 3457 struct device *dev = acpi_desc->dev;
3458 3458
3459 /* Bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */ 3459 /* Bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */
3460 device_lock(dev); 3460 nfit_device_lock(dev);
3461 device_unlock(dev); 3461 nfit_device_unlock(dev);
3462 3462
3463 /* Bounce the init_mutex to complete initial registration */ 3463 /* Bounce the init_mutex to complete initial registration */
3464 mutex_lock(&acpi_desc->init_mutex); 3464 mutex_lock(&acpi_desc->init_mutex);
@@ -3602,8 +3602,8 @@ void acpi_nfit_shutdown(void *data)
3602 * acpi_nfit_ars_rescan() submissions have had a chance to 3602 * acpi_nfit_ars_rescan() submissions have had a chance to
3603 * either submit or see ->cancel set. 3603 * either submit or see ->cancel set.
3604 */ 3604 */
3605 device_lock(bus_dev); 3605 nfit_device_lock(bus_dev);
3606 device_unlock(bus_dev); 3606 nfit_device_unlock(bus_dev);
3607 3607
3608 flush_workqueue(nfit_wq); 3608 flush_workqueue(nfit_wq);
3609} 3609}
@@ -3746,9 +3746,9 @@ EXPORT_SYMBOL_GPL(__acpi_nfit_notify);
3746 3746
3747static void acpi_nfit_notify(struct acpi_device *adev, u32 event) 3747static void acpi_nfit_notify(struct acpi_device *adev, u32 event)
3748{ 3748{
3749 device_lock(&adev->dev); 3749 nfit_device_lock(&adev->dev);
3750 __acpi_nfit_notify(&adev->dev, adev->handle, event); 3750 __acpi_nfit_notify(&adev->dev, adev->handle, event);
3751 device_unlock(&adev->dev); 3751 nfit_device_unlock(&adev->dev);
3752} 3752}
3753 3753
3754static const struct acpi_device_id acpi_nfit_ids[] = { 3754static const struct acpi_device_id acpi_nfit_ids[] = {
diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h
index 6ee2b02af73e..24241941181c 100644
--- a/drivers/acpi/nfit/nfit.h
+++ b/drivers/acpi/nfit/nfit.h
@@ -312,6 +312,30 @@ static inline struct acpi_nfit_desc *to_acpi_desc(
312 return container_of(nd_desc, struct acpi_nfit_desc, nd_desc); 312 return container_of(nd_desc, struct acpi_nfit_desc, nd_desc);
313} 313}
314 314
315#ifdef CONFIG_PROVE_LOCKING
316static inline void nfit_device_lock(struct device *dev)
317{
318 device_lock(dev);
319 mutex_lock(&dev->lockdep_mutex);
320}
321
322static inline void nfit_device_unlock(struct device *dev)
323{
324 mutex_unlock(&dev->lockdep_mutex);
325 device_unlock(dev);
326}
327#else
328static inline void nfit_device_lock(struct device *dev)
329{
330 device_lock(dev);
331}
332
333static inline void nfit_device_unlock(struct device *dev)
334{
335 device_unlock(dev);
336}
337#endif
338
315const guid_t *to_nfit_uuid(enum nfit_uuids id); 339const guid_t *to_nfit_uuid(enum nfit_uuids id);
316int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz); 340int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz);
317void acpi_nfit_shutdown(void *data); 341void acpi_nfit_shutdown(void *data);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index da84a73f2ba6..636058bbf48a 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1663,6 +1663,9 @@ void device_initialize(struct device *dev)
1663 kobject_init(&dev->kobj, &device_ktype); 1663 kobject_init(&dev->kobj, &device_ktype);
1664 INIT_LIST_HEAD(&dev->dma_pools); 1664 INIT_LIST_HEAD(&dev->dma_pools);
1665 mutex_init(&dev->mutex); 1665 mutex_init(&dev->mutex);
1666#ifdef CONFIG_PROVE_LOCKING
1667 mutex_init(&dev->lockdep_mutex);
1668#endif
1666 lockdep_set_novalidate_class(&dev->mutex); 1669 lockdep_set_novalidate_class(&dev->mutex);
1667 spin_lock_init(&dev->devres_lock); 1670 spin_lock_init(&dev->devres_lock);
1668 INIT_LIST_HEAD(&dev->devres_head); 1671 INIT_LIST_HEAD(&dev->devres_head);
@@ -2211,6 +2214,24 @@ void put_device(struct device *dev)
2211} 2214}
2212EXPORT_SYMBOL_GPL(put_device); 2215EXPORT_SYMBOL_GPL(put_device);
2213 2216
2217bool kill_device(struct device *dev)
2218{
2219 /*
2220 * Require the device lock and set the "dead" flag to guarantee that
2221 * the update behavior is consistent with the other bitfields near
2222 * it and that we cannot have an asynchronous probe routine trying
2223 * to run while we are tearing out the bus/class/sysfs from
2224 * underneath the device.
2225 */
2226 lockdep_assert_held(&dev->mutex);
2227
2228 if (dev->p->dead)
2229 return false;
2230 dev->p->dead = true;
2231 return true;
2232}
2233EXPORT_SYMBOL_GPL(kill_device);
2234