Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1213483 > unrolled thread
| Started by | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| First post | 2015-08-26 03:40 +0200 |
| Last post | 2015-08-27 09:40 +0200 |
| Articles | 4 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind Dan Williams <dan.j.williams@intel.com> - 2015-08-26 03:40 +0200
Re: [PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind Christoph Hellwig <hch@lst.de> - 2015-08-26 14:50 +0200
Re: [PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind "Williams, Dan J" <dan.j.williams@intel.com> - 2015-08-26 23:40 +0200
Re: [PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind "hch@lst.de" <hch@lst.de> - 2015-08-27 09:40 +0200
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2015-08-26 03:40 +0200 |
| Subject | [PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind |
| Message-ID | <q1xR1-7IF-19@gated-at.bofh.it> |
Given that:
1/ device ->remove() can not be failed
2/ a pmem device may be unbound at any time
3/ we do not know what other parts of the kernel are actively using a
'struct page' from devm_memremap_pages()
...provide a facility for active usages of device memory to block pmem
device unbind. With a percpu_ref it should be feasible to take a
reference on a per-I/O or other high frequency basis.
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
include/linux/io.h | 37 ++++++++++++++++++++++
kernel/memremap.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 123 insertions(+), 3 deletions(-)
diff --git a/include/linux/io.h b/include/linux/io.h
index de64c1e53612..e20cc04f42b7 100644
--- a/include/linux/io.h
+++ b/include/linux/io.h
@@ -90,8 +90,31 @@ void devm_memunmap(struct device *dev, void *addr);
void *__devm_memremap_pages(struct device *dev, struct resource *res);
#ifdef CONFIG_ZONE_DEVICE
+#include <linux/percpu-refcount.h>
+#include <linux/ioport.h>
+#include <linux/list.h>
+
+struct page_map {
+ struct resource res;
+ struct list_head list;
+ unsigned long flags;
+ struct percpu_ref percpu_ref;
+ struct device *dev;
+};
+
void *devm_memremap_pages(struct device *dev, struct resource *res);
+struct page_map * __must_check get_page_map(resource_size_t addr);
+static inline void ref_page_map(struct page_map *page_map)
+{
+ percpu_ref_get(&page_map->percpu_ref);
+}
+
+static inline void put_page_map(struct page_map *page_map)
+{
+ percpu_ref_put(&page_map->percpu_ref);
+}
#else
+struct page_map;
static inline void *devm_memremap_pages(struct device *dev, struct resource *res)
{
/*
@@ -102,6 +125,20 @@ static inline void *devm_memremap_pages(struct device *dev, struct resource *res
WARN_ON_ONCE(1);
return ERR_PTR(-ENXIO);
}
+
+static inline __must_check struct page_map *get_page_map(resource_size_t addr)
+{
+ return NULL;
+}
+
+static inline void ref_page_map(struct page_map *page_map)
+{
+ return false;
+}
+
+static inline void put_page_map(struct page_map *page_map)
+{
+}
#endif
/*
diff --git a/kernel/memremap.c b/kernel/memremap.c
index 72b0c66628b6..65a6c9396062 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -12,6 +12,8 @@
*/
#include <linux/device.h>
#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/wait.h>
#include <linux/io.h>
#include <linux/mm.h>
#include <linux/memory_hotplug.h>
@@ -138,14 +140,66 @@ void devm_memunmap(struct device *dev, void *addr)
EXPORT_SYMBOL(devm_memunmap);
#ifdef CONFIG_ZONE_DEVICE
-struct page_map {
- struct resource res;
+static DEFINE_MUTEX(page_map_lock);
+static DECLARE_WAIT_QUEUE_HEAD(page_map_wait);
+static LIST_HEAD(page_maps);
+
+enum {
+ PAGE_MAP_LIVE,
+ PAGE_MAP_CONFIRM,
};
+static struct page_map *to_page_map(struct percpu_ref *ref)
+{
+ return container_of(ref, struct page_map, percpu_ref);
+}
+
+static void page_map_release(struct percpu_ref *ref)
+{
+ struct page_map *page_map = to_page_map(ref);
+
+ /* signal page_map is idle (no more refs) */
+ clear_bit(PAGE_MAP_LIVE, &page_map->flags);
+ wake_up_all(&page_map_wait);
+}
+
+static void page_map_confirm(struct percpu_ref *ref)
+{
+ struct page_map *page_map = to_page_map(ref);
+
+ /* signal page_map is confirmed dead (slow path ref mode) */
+ set_bit(PAGE_MAP_CONFIRM, &page_map->flags);
+ wake_up_all(&page_map_wait);
+}
+
+static void page_map_destroy(struct page_map *page_map)
+{
+ long tmo;
+
+ /* flush new lookups */
+ mutex_lock(&page_map_lock);
+ list_del_rcu(&page_map->list);
+ mutex_unlock(&page_map_lock);
+ synchronize_rcu();
+
+ percpu_ref_kill_and_confirm(&page_map->percpu_ref, page_map_confirm);
+ do {
+ tmo = wait_event_interruptible_timeout(page_map_wait,
+ !test_bit(PAGE_MAP_LIVE, &page_map->flags)
+ && test_bit(PAGE_MAP_CONFIRM, &page_map->flags), 5*HZ);
+ if (tmo <= 0)
+ dev_dbg(page_map->dev,
+ "page map active, continuing to wait...\n");
+ } while (tmo <= 0);
+}
+
static void devm_memremap_pages_release(struct device *dev, void *res)
{
struct page_map *page_map = res;
+ if (test_bit(PAGE_MAP_LIVE, &page_map->flags))
+ page_map_destroy(page_map);
+
/* pages are dead and unused, undo the arch mapping */
arch_remove_memory(page_map->res.start, resource_size(&page_map->res));
}
@@ -155,7 +209,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res)
int is_ram = region_intersects(res->start, resource_size(res),
"System RAM");
struct page_map *page_map;
- int error, nid;
+ int error, nid, rc;
if (is_ram == REGION_MIXED) {
WARN_ONCE(1, "%s attempted on mixed region %pr\n",
@@ -172,6 +226,12 @@ void *devm_memremap_pages(struct device *dev, struct resource *res)
return ERR_PTR(-ENOMEM);
memcpy(&page_map->res, res, sizeof(*res));
+ INIT_LIST_HEAD(&page_map->list);
+ page_map->dev = dev;
+ rc = percpu_ref_init(&page_map->percpu_ref, page_map_release, 0,
+ GFP_KERNEL);
+ if (rc)
+ return ERR_PTR(rc);
nid = dev_to_node(dev);
if (nid < 0)
@@ -183,8 +243,31 @@ void *devm_memremap_pages(struct device *dev, struct resource *res)
return ERR_PTR(error);
}
+ set_bit(PAGE_MAP_LIVE, &page_map->flags);
+ mutex_lock(&page_map_lock);
+ list_add_rcu(&page_map->list, &page_maps);
+ mutex_unlock(&page_map_lock);
+
devres_add(dev, page_map);
return __va(res->start);
}
EXPORT_SYMBOL(devm_memremap_pages);
+
+struct page_map * __must_check get_page_map(resource_size_t addr)
+{
+ struct page_map *page_map, *ret = NULL;
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(page_map, &page_maps, list) {
+ if (addr >= page_map->res.start && addr <= page_map->res.end) {
+ if (percpu_ref_tryget(&page_map->percpu_ref))
+ ret = page_map;
+ break;
+ }
+ }
+ rcu_read_unlock();
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(get_page_map);
#endif /* CONFIG_ZONE_DEVICE */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2015-08-26 14:50 +0200 |
| Subject | Re: [PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind |
| Message-ID | <q1Ijo-602-19@gated-at.bofh.it> |
| In reply to | #1213483 |
On Tue, Aug 25, 2015 at 09:28:13PM -0400, Dan Williams wrote: > Given that: > > 1/ device ->remove() can not be failed > > 2/ a pmem device may be unbound at any time > > 3/ we do not know what other parts of the kernel are actively using a > 'struct page' from devm_memremap_pages() > > ...provide a facility for active usages of device memory to block pmem > device unbind. With a percpu_ref it should be feasible to take a > reference on a per-I/O or other high frequency basis. Without a caller of get_page_map this is just adding dead code. I'd suggest to group it in a series with that caller. Also if the page_map gets exposed in a header the name is a bit too generic. memremap_map maybe? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Williams, Dan J" <dan.j.williams@intel.com> |
|---|---|
| Date | 2015-08-26 23:40 +0200 |
| Message-ID | <q1QAi-12Y-9@gated-at.bofh.it> |
| In reply to | #1213821 |
T24gV2VkLCAyMDE1LTA4LTI2IGF0IDE0OjQ2ICswMjAwLCBDaHJpc3RvcGggSGVsbHdpZyB3cm90 ZToNCj4gT24gVHVlLCBBdWcgMjUsIDIwMTUgYXQgMDk6Mjg6MTNQTSAtMDQwMCwgRGFuIFdpbGxp YW1zIHdyb3RlOg0KPiA+IEdpdmVuIHRoYXQ6DQo+ID4gDQo+ID4gMS8gZGV2aWNlIC0+cmVtb3Zl KCkgY2FuIG5vdCBiZSBmYWlsZWQNCj4gPiANCj4gPiAyLyBhIHBtZW0gZGV2aWNlIG1heSBiZSB1 bmJvdW5kIGF0IGFueSB0aW1lDQo+ID4gDQo+ID4gMy8gd2UgZG8gbm90IGtub3cgd2hhdCBvdGhl ciBwYXJ0cyBvZiB0aGUga2VybmVsIGFyZSBhY3RpdmVseSB1c2luZyBhDQo+ID4gICAgJ3N0cnVj dCBwYWdlJyBmcm9tIGRldm1fbWVtcmVtYXBfcGFnZXMoKQ0KPiA+IA0KPiA+IC4uLnByb3ZpZGUg YSBmYWNpbGl0eSBmb3IgYWN0aXZlIHVzYWdlcyBvZiBkZXZpY2UgbWVtb3J5IHRvIGJsb2NrIHBt ZW0NCj4gPiBkZXZpY2UgdW5iaW5kLiAgV2l0aCBhIHBlcmNwdV9yZWYgaXQgc2hvdWxkIGJlIGZl YXNpYmxlIHRvIHRha2UgYQ0KPiA+IHJlZmVyZW5jZSBvbiBhIHBlci1JL08gb3Igb3RoZXIgaGln aCBmcmVxdWVuY3kgYmFzaXMuDQo+IA0KPiBXaXRob3V0IGEgY2FsbGVyIG9mIGdldF9wYWdlX21h cCB0aGlzIGlzIGp1c3QgYWRkaW5nIGRlYWQgY29kZS4gIEknZA0KPiBzdWdnZXN0IHRvIGdyb3Vw IGl0IGluIGEgc2VyaWVzIHdpdGggdGhhdCBjYWxsZXIuDQo+IA0KDQpBZ3JlZWQsIHdlIGNhbiBk cm9wIHRoaXMgdW50aWwgdGhlIGZpcnN0IHVzZXIgYXJyaXZlcy4NCg0KPiBBbHNvIGlmIHRoZSBw YWdlX21hcCBnZXRzIGV4cG9zZWQgaW4gYSBoZWFkZXIgdGhlIG5hbWUgaXMgYSBiaXQgdG9vIGdl bmVyaWMuDQo+IG1lbXJlbWFwX21hcCBtYXliZT8NCg0KRG9uZSwgYW5kIGluIHRoZSBwYXRjaCBi ZWxvdyBJIGhpZGUgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMNCm9mIHBhZ2Vf bWFwIGluIGtlcm5lbC9tZW1yZW1hcC5jIGFuZCBvbmx5IGV4cG9zZSB0aGUgcGVyY3B1X3JlZiBp biB0aGUNCnB1YmxpYyBtZW1yZW1hcF9tYXAuDQoNCjg8LS0tLQ0KU3ViamVjdDogZGV2bV9tZW1y ZW1hcF9wYWdlczogcHJvdGVjdCBhZ2FpbnN0IHBtZW0gZGV2aWNlIHVuYmluZA0KDQpGcm9tOiBE YW4gV2lsbGlhbXMgPGRhbi5qLndpbGxpYW1zQGludGVsLmNvbT4NCg0KR2l2ZW4gdGhhdDoNCg0K MS8gZGV2aWNlIC0+cmVtb3ZlKCkgY2FuIG5vdCBiZSBmYWlsZWQNCg0KMi8gYSBwbWVtIGRldmlj ZSBtYXkgYmUgdW5ib3VuZCBhdCBhbnkgdGltZQ0KDQozLyB3ZSBkbyBub3Qga25vdyB3aGF0IG90 aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYXJlIGFjdGl2ZWx5IHVzaW5nIGENCiAgICdzdHJ1Y3Qg cGFnZScgZnJvbSBkZXZtX21lbXJlbWFwX3BhZ2VzKCkNCg0KLi4ucHJvdmlkZSBhIGZhY2lsaXR5 IGZvciBhY3RpdmUgdXNhZ2VzIG9mIGRldmljZSBtZW1vcnkgdG8gYmxvY2sgcG1lbQ0KZGV2aWNl IHVuYmluZC4gIFdpdGggYSBwZXJjcHVfcmVmIGl0IHNob3VsZCBiZSBmZWFzaWJsZSB0byB0YWtl IGENCnJlZmVyZW5jZSBvbiBhIHBlci1JL08gb3Igb3RoZXIgaGlnaCBmcmVxdWVuY3kgYmFzaXMu DQoNCkNjOiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4NClNpZ25lZC1vZmYtYnk6IERh biBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPg0KLS0tDQogaW5jbHVkZS9saW51 eC9pby5oIHwgICAzMCArKysrKysrKysrKysrKysrDQoga2VybmVsL21lbXJlbWFwLmMgIHwgICA5 NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystDQog MiBmaWxlcyBjaGFuZ2VkLCAxMjUgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQ0KDQpkaWZm IC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pby5oIGIvaW5jbHVkZS9saW51eC9pby5oDQppbmRleCBk ZTY0YzFlNTM2MTIuLjllNjk2YjExNGM2ZCAxMDA2NDQNCi0tLSBhL2luY2x1ZGUvbGludXgvaW8u aA0KKysrIGIvaW5jbHVkZS9saW51eC9pby5oDQpAQCAtOTAsOCArOTAsMjUgQEAgdm9pZCBkZXZt X21lbXVubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7DQogdm9pZCAqX19kZXZt X21lbXJlbWFwX3BhZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMp Ow0KIA0KICNpZmRlZiBDT05GSUdfWk9ORV9ERVZJQ0UNCisjaW5jbHVkZSA8bGludXgvcGVyY3B1 LXJlZmNvdW50Lmg+DQorDQorc3RydWN0IG1lbXJlbWFwX21hcCB7DQorCXN0cnVjdCBwZXJjcHVf cmVmIHBlcmNwdV9yZWY7DQorfTsNCisNCiB2b2lkICpkZXZtX21lbXJlbWFwX3BhZ2VzKHN0cnVj dCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpOw0KK3N0cnVjdCBtZW1yZW1hcF9t YXAgKiBfX211c3RfY2hlY2sgZ2V0X21lbXJlbWFwX21hcChyZXNvdXJjZV9zaXplX3QgYWRkcik7 DQorc3RhdGljIGlubGluZSB2b2lkIHJlZl9tZW1yZW1hcF9tYXAoc3RydWN0IG1lbXJlbWFwX21h cCAqbWVtcmVtYXBfbWFwKQ0KK3sNCisJcGVyY3B1X3JlZl9nZXQoJm1lbXJlbWFwX21hcC0+cGVy Y3B1X3JlZik7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbWVtcmVtYXBfbWFwKHN0 cnVjdCBtZW1yZW1hcF9tYXAgKm1lbXJlbWFwX21hcCkNCit7DQorCXBlcmNwdV9yZWZfcHV0KCZt ZW1yZW1hcF9tYXAtPnBlcmNwdV9yZWYpOw0KK30NCiAjZWxzZQ0KK3N0cnVjdCBtZW1yZW1hcF9t YXA7DQogc3RhdGljIGlubGluZSB2b2lkICpkZXZtX21lbXJlbWFwX3BhZ2VzKHN0cnVjdCBkZXZp Y2UgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpDQogew0KIAkvKg0KQEAgLTEwMiw2ICsxMTks MTkgQEAgc3RhdGljIGlubGluZSB2b2lkICpkZXZtX21lbXJlbWFwX3BhZ2VzKHN0cnVjdCBkZXZp Y2UgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMNCiAJV0FSTl9PTl9PTkNFKDEpOw0KIAlyZXR1 cm4gRVJSX1BUUigtRU5YSU8pOw0KIH0NCisNCitzdGF0aWMgaW5saW5lIF9fbXVzdF9jaGVjayBz dHJ1Y3QgbWVtcmVtYXBfbWFwICpnZXRfbWVtcmVtYXBfbWFwKHJlc291cmNlX3NpemVfdCBhZGRy KQ0KK3sNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWZfbWVt cmVtYXBfbWFwKHN0cnVjdCBtZW1yZW1hcF9tYXAgKm1lbXJlbWFwX21hcCkNCit7DQorfQ0KKw0K K3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbWVtcmVtYXBfbWFwKHN0cnVjdCBtZW1yZW1hcF9tYXAg Km1lbXJlbWFwX21hcCkNCit7DQorfQ0KICNlbmRpZg0KIA0KIC8qDQpkaWZmIC0tZ2l0IGEva2Vy bmVsL21lbXJlbWFwLmMgYi9rZXJuZWwvbWVtcmVtYXAuYw0KaW5kZXggNzJiMGM2NjYyOGI2Li41 YjlmMDQ3ODliOTYgMTAwNjQ0DQotLS0gYS9rZXJuZWwvbWVtcmVtYXAuYw0KKysrIGIva2VybmVs L21lbXJlbWFwLmMNCkBAIC0xMSw3ICsxMSwxMSBAQA0KICAqIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4NCiAgKi8NCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+DQor I2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPg0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KKyNp bmNsdWRlIDxsaW51eC9zY2hlZC5oPg0KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+DQorI2luY2x1 ZGUgPGxpbnV4L2xpc3QuaD4NCiAjaW5jbHVkZSA8bGludXgvaW8uaD4NCiAjaW5jbHVkZSA8bGlu dXgvbW0uaD4NCiAjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4NCkBAIC0xMzgsMTQg KzE0Miw3NCBAQCB2b2lkIGRldm1fbWVtdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICph ZGRyKQ0KIEVYUE9SVF9TWU1CT0woZGV2bV9tZW11bm1hcCk7DQogDQogI2lmZGVmIENPTkZJR19a T05FX0RFVklDRQ0KK3N0YXRpYyBERUZJTkVfTVVURVgocGFnZV9tYXBfbG9jayk7DQorc3RhdGlj IERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHBhZ2VfbWFwX3dhaXQpOw0KK3N0YXRpYyBMSVNUX0hF QUQocGFnZV9tYXBzKTsNCisNCitlbnVtIHsNCisJUEFHRV9NQVBfTElWRSwNCisJUEFHRV9NQVBf Q09ORklSTSwNCit9Ow0KKw0KIHN0cnVjdCBwYWdlX21hcCB7DQogCXN0cnVjdCByZXNvdXJjZSBy ZXM7DQorCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsNCisJdW5zaWduZWQgbG9uZyBmbGFnczsNCisJ c3RydWN0IG1lbXJlbWFwX21hcCBtYXA7DQorCXN0cnVjdCBkZXZpY2UgKmRldjsNCiB9Ow0KIA0K K3N0YXRpYyBzdHJ1Y3QgcGFnZV9tYXAgKnRvX3BhZ2VfbWFwKHN0cnVjdCBwZXJjcHVfcmVmICpy ZWYpDQorew0KKwlyZXR1cm4gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IHBhZ2VfbWFwLCBtYXAu cGVyY3B1X3JlZik7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHBhZ2VfbWFwX3JlbGVhc2Uoc3RydWN0 IHBlcmNwdV9yZWYgKnJlZikNCit7DQorCXN0cnVjdCBwYWdlX21hcCAqcGFnZV9tYXAgPSB0b19w YWdlX21hcChyZWYpOw0KKw0KKwkvKiBzaWduYWwgcGFnZV9tYXAgaXMgaWRsZSAobm8gbW9yZSBy ZWZzKSAqLw0KKwljbGVhcl9iaXQoUEFHRV9NQVBfTElWRSwgJnBhZ2VfbWFwLT5mbGFncyk7DQor CXdha2VfdXBfYWxsKCZwYWdlX21hcF93YWl0KTsNCit9DQorDQorc3RhdGljIHZvaWQgcGFnZV9t YXBfY29uZmlybShzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKQ0KK3sNCisJc3RydWN0IHBhZ2VfbWFw ICpwYWdlX21hcCA9IHRvX3BhZ2VfbWFwKHJlZik7DQorDQorCS8qIHNpZ25hbCBwYWdlX21hcCBp cyBjb25maXJtZWQgZGVhZCAoc2xvdyBwYXRoIHJlZiBtb2RlKSAqLw0KKwlzZXRfYml0KFBBR0Vf TUFQX0NPTkZJUk0sICZwYWdlX21hcC0+ZmxhZ3MpOw0KKwl3YWtlX3VwX2FsbCgmcGFnZV9tYXBf d2FpdCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHBhZ2VfbWFwX2Rlc3Ryb3koc3RydWN0IHBhZ2Vf bWFwICpwYWdlX21hcCkNCit7DQorCWxvbmcgdG1vOw0KKw0KKwkvKiBmbHVzaCBuZXcgbG9va3Vw cyAqLw0KKwltdXRleF9sb2NrKCZwYWdlX21hcF9sb2NrKTsNCisJbGlzdF9kZWxfcmN1KCZwYWdl X21hcC0+bGlzdCk7DQorCW11dGV4X3VubG9jaygmcGFnZV9tYXBfbG9jayk7DQorCXN5bmNocm9u aXplX3JjdSgpOw0KKw0KKwlwZXJjcHVfcmVmX2tpbGxfYW5kX2NvbmZpcm0oJnBhZ2VfbWFwLT5t YXAucGVyY3B1X3JlZiwgcGFnZV9tYXBfY29uZmlybSk7DQorCWRvIHsNCisJCXRtbyA9IHdhaXRf ZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHBhZ2VfbWFwX3dhaXQsDQorCQkJIXRlc3RfYml0 KFBBR0VfTUFQX0xJVkUsICZwYWdlX21hcC0+ZmxhZ3MpDQorCQkJJiYgdGVzdF9iaXQoUEFHRV9N QVBfQ09ORklSTSwgJnBhZ2VfbWFwLT5mbGFncyksIDUqSFopOw0KKwkJaWYgKHRtbyA8PSAwKQ0K KwkJCWRldl9kYmcocGFnZV9tYXAtPmRldiwNCisJCQkJCSJwYWdlIG1hcCBhY3RpdmUsIGNvbnRp bnVpbmcgdG8gd2FpdC4uLlxuIik7DQorCX0gd2hpbGUgKHRtbyA8PSAwKTsNCit9DQorDQogc3Rh dGljIHZvaWQgZGV2bV9tZW1yZW1hcF9wYWdlc19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldiwg dm9pZCAqcmVzKQ0KIHsNCiAJc3RydWN0IHBhZ2VfbWFwICpwYWdlX21hcCA9IHJlczsNCiANCisJ aWYgKHRlc3RfYml0KFBBR0VfTUFQX0xJVkUsICZwYWdlX21hcC0+ZmxhZ3MpKQ0KKwkJcGFnZV9t YXBfZGVzdHJveShwYWdlX21hcCk7DQorDQogCS8qIHBhZ2VzIGFyZSBkZWFkIGFuZCB1bnVzZWQs IHVuZG8gdGhlIGFyY2ggbWFwcGluZyAqLw0KIAlhcmNoX3JlbW92ZV9tZW1vcnkocGFnZV9tYXAt PnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcGFnZV9tYXAtPnJlcykpOw0KIH0NCkBAIC0xNTUs NyArMjE5LDcgQEAgdm9pZCAqZGV2bV9tZW1yZW1hcF9wYWdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYs IHN0cnVjdCByZXNvdXJjZSAqcmVzKQ0KIAlpbnQgaXNfcmFtID0gcmVnaW9uX2ludGVyc2VjdHMo cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLA0KIAkJCSJTeXN0ZW0gUkFNIik7DQogCXN0 cnVjdCBwYWdlX21hcCAqcGFnZV9tYXA7DQotCWludCBlcnJvciwgbmlkOw0KKwlpbnQgZXJyb3Is IG5pZCwgcmM7DQogDQogCWlmIChpc19yYW0gPT0gUkVHSU9OX01JWEVEKSB7DQogCQlXQVJOX09O Q0UoMSwgIiVzIGF0dGVtcHRlZCBvbiBtaXhlZCByZWdpb24gJXByXG4iLA0KQEAgLTE3Miw2ICsy MzYsMTIgQEAgdm9pZCAqZGV2bV9tZW1yZW1hcF9wYWdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0 cnVjdCByZXNvdXJjZSAqcmVzKQ0KIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7DQogDQogCW1l bWNweSgmcGFnZV9tYXAtPnJlcywgcmVzLCBzaXplb2YoKnJlcykpOw0KKwlJTklUX0xJU1RfSEVB RCgmcGFnZV9tYXAtPmxpc3QpOw0KKwlwYWdlX21hcC0+ZGV2ID0gZGV2Ow0KKwlyYyA9IHBlcmNw dV9yZWZfaW5pdCgmcGFnZV9tYXAtPm1hcC5wZXJjcHVfcmVmLCBwYWdlX21hcF9yZWxlYXNlLCAw LA0KKwkJCQlHRlBfS0VSTkVMKTsNCisJaWYgKHJjKQ0KKwkJcmV0dXJuIEVSUl9QVFIocmMpOw0K IA0KIAluaWQgPSBkZXZfdG9fbm9kZShkZXYpOw0KIAlpZiAobmlkIDwgMCkNCkBAIC0xODMsOCAr MjUzLDMyIEBAIHZvaWQgKmRldm1fbWVtcmVtYXBfcGFnZXMoc3RydWN0IGRldmljZSAqZGV2LCBz dHJ1Y3QgcmVzb3VyY2UgKnJlcykNCiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsNCiAJfQ0KIA0K KwlzZXRfYml0KFBBR0VfTUFQX0xJVkUsICZwYWdlX21hcC0+ZmxhZ3MpOw0KKwltdXRleF9sb2Nr KCZwYWdlX21hcF9sb2NrKTsNCisJbGlzdF9hZGRfcmN1KCZwYWdlX21hcC0+bGlzdCwgJnBhZ2Vf bWFwcyk7DQorCW11dGV4X3VubG9jaygmcGFnZV9tYXBfbG9jayk7DQorDQogCWRldnJlc19hZGQo ZGV2LCBwYWdlX21hcCk7DQogCXJldHVybiBfX3ZhKHJlcy0+c3RhcnQpOw0KIH0NCiBFWFBPUlRf U1lNQk9MKGRldm1fbWVtcmVtYXBfcGFnZXMpOw0KKw0KK3N0cnVjdCBtZW1yZW1hcF9tYXAgKiBf X211c3RfY2hlY2sgZ2V0X21lbXJlbWFwX21hcChyZXNvdXJjZV9zaXplX3QgYWRkcikNCit7DQor CXN0cnVjdCBtZW1yZW1hcF9tYXAgKnJldCA9IE5VTEw7DQorCXN0cnVjdCBwYWdlX21hcCAqcGFn ZV9tYXA7DQorDQorCXJjdV9yZWFkX2xvY2soKTsNCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uo cGFnZV9tYXAsICZwYWdlX21hcHMsIGxpc3QpIHsNCisJCWlmIChhZGRyID49IHBhZ2VfbWFwLT5y ZXMuc3RhcnQgJiYgYWRkciA8PSBwYWdlX21hcC0+cmVzLmVuZCkgew0KKwkJCWlmIChwZXJjcHVf cmVmX3RyeWdldCgmcGFnZV9tYXAtPm1hcC5wZXJjcHVfcmVmKSkNCisJCQkJcmV0ID0gJnBhZ2Vf bWFwLT5tYXA7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisJcmN1X3JlYWRfdW5sb2NrKCk7DQor DQorCXJldHVybiByZXQ7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9tZW1yZW1hcF9tYXAp Ow0KICNlbmRpZiAvKiBDT05GSUdfWk9ORV9ERVZJQ0UgKi8NCg0K -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "hch@lst.de" <hch@lst.de> |
|---|---|
| Date | 2015-08-27 09:40 +0200 |
| Subject | Re: [PATCH v2 9/9] devm_memremap_pages: protect against pmem device unbind |
| Message-ID | <q1ZWW-6e9-13@gated-at.bofh.it> |
| In reply to | #1214204 |
On Wed, Aug 26, 2015 at 09:39:18PM +0000, Williams, Dan J wrote: > On Wed, 2015-08-26 at 14:46 +0200, Christoph Hellwig wrote: > > On Tue, Aug 25, 2015 at 09:28:13PM -0400, Dan Williams wrote: > > > Given that: > > > > > > 1/ device ->remove() can not be failed > > > > > > 2/ a pmem device may be unbound at any time > > > > > > 3/ we do not know what other parts of the kernel are actively using a > > > 'struct page' from devm_memremap_pages() > > > > > > ...provide a facility for active usages of device memory to block pmem > > > device unbind. With a percpu_ref it should be feasible to take a > > > reference on a per-I/O or other high frequency basis. > > > > Without a caller of get_page_map this is just adding dead code. I'd > > suggest to group it in a series with that caller. > > > > Agreed, we can drop this until the first user arrives. > > > Also if the page_map gets exposed in a header the name is a bit too generic. > > memremap_map maybe? > > Done, and in the patch below I hide the internal implementation details > of page_map in kernel/memremap.c and only expose the percpu_ref in the > public memremap_map. Yes, that looks good once we're getting the users for it. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web