Skip to content

Commit b80892c

Browse files
Christoph Hellwigdjbw
authored andcommitted
memremap: remove support for external pgmap refcounts
No driver is left using the external pgmap refcount, so remove the code to support it. Signed-off-by: Christoph Hellwig <[email protected]> Acked-by: Bjorn Helgaas <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dan Williams <[email protected]>
1 parent b842f1d commit b80892c

File tree

4 files changed

+28
-94
lines changed

4 files changed

+28
-94
lines changed

drivers/pci/p2pdma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size,
219219
error = gen_pool_add_owner(p2pdma->pool, (unsigned long)addr,
220220
pci_bus_address(pdev, bar) + offset,
221221
range_len(&pgmap->range), dev_to_node(&pdev->dev),
222-
pgmap->ref);
222+
&pgmap->ref);
223223
if (error)
224224
goto pages_free;
225225

include/linux/memremap.h

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,6 @@ struct dev_pagemap_ops {
7272
*/
7373
void (*page_free)(struct page *page);
7474

75-
/*
76-
* Transition the refcount in struct dev_pagemap to the dead state.
77-
*/
78-
void (*kill)(struct dev_pagemap *pgmap);
79-
80-
/*
81-
* Wait for refcount in struct dev_pagemap to be idle and reap it.
82-
*/
83-
void (*cleanup)(struct dev_pagemap *pgmap);
84-
8575
/*
8676
* Used for private (un-addressable) device memory only. Must migrate
8777
* the page back to a CPU accessible page.
@@ -95,8 +85,7 @@ struct dev_pagemap_ops {
9585
* struct dev_pagemap - metadata for ZONE_DEVICE mappings
9686
* @altmap: pre-allocated/reserved memory for vmemmap allocations
9787
* @ref: reference count that pins the devm_memremap_pages() mapping
98-
* @internal_ref: internal reference if @ref is not provided by the caller
99-
* @done: completion for @internal_ref
88+
* @done: completion for @ref
10089
* @type: memory type: see MEMORY_* in memory_hotplug.h
10190
* @flags: PGMAP_* flags to specify defailed behavior
10291
* @ops: method table
@@ -109,8 +98,7 @@ struct dev_pagemap_ops {
10998
*/
11099
struct dev_pagemap {
111100
struct vmem_altmap altmap;
112-
struct percpu_ref *ref;
113-
struct percpu_ref internal_ref;
101+
struct percpu_ref ref;
114102
struct completion done;
115103
enum memory_type type;
116104
unsigned int flags;
@@ -191,7 +179,7 @@ static inline unsigned long memremap_compat_align(void)
191179
static inline void put_dev_pagemap(struct dev_pagemap *pgmap)
192180
{
193181
if (pgmap)
194-
percpu_ref_put(pgmap->ref);
182+
percpu_ref_put(&pgmap->ref);
195183
}
196184

197185
#endif /* _LINUX_MEMREMAP_H_ */

mm/memremap.c

Lines changed: 12 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -112,30 +112,6 @@ static unsigned long pfn_next(unsigned long pfn)
112112
#define for_each_device_pfn(pfn, map, i) \
113113
for (pfn = pfn_first(map, i); pfn < pfn_end(map, i); pfn = pfn_next(pfn))
114114

115-
static void dev_pagemap_kill(struct dev_pagemap *pgmap)
116-
{
117-
if (pgmap->ops && pgmap->ops->kill)
118-
pgmap->ops->kill(pgmap);
119-
else
120-
percpu_ref_kill(pgmap->ref);
121-
}
122-
123-
static void dev_pagemap_cleanup(struct dev_pagemap *pgmap)
124-
{
125-
if (pgmap->ops && pgmap->ops->cleanup) {
126-
pgmap->ops->cleanup(pgmap);
127-
} else {
128-
wait_for_completion(&pgmap->done);
129-
percpu_ref_exit(pgmap->ref);
130-
}
131-
/*
132-
* Undo the pgmap ref assignment for the internal case as the
133-
* caller may re-enable the same pgmap.
134-
*/
135-
if (pgmap->ref == &pgmap->internal_ref)
136-
pgmap->ref = NULL;
137-
}
138-
139115
static void pageunmap_range(struct dev_pagemap *pgmap, int range_id)
140116
{
141117
struct range *range = &pgmap->ranges[range_id];
@@ -167,11 +143,12 @@ void memunmap_pages(struct dev_pagemap *pgmap)
167143
unsigned long pfn;
168144
int i;
169145

170-
dev_pagemap_kill(pgmap);
146+
percpu_ref_kill(&pgmap->ref);
171147
for (i = 0; i < pgmap->nr_range; i++)
172148
for_each_device_pfn(pfn, pgmap, i)
173149
put_page(pfn_to_page(pfn));
174-
dev_pagemap_cleanup(pgmap);
150+
wait_for_completion(&pgmap->done);
151+
percpu_ref_exit(&pgmap->ref);
175152

176153
for (i = 0; i < pgmap->nr_range; i++)
177154
pageunmap_range(pgmap, i);
@@ -188,8 +165,7 @@ static void devm_memremap_pages_release(void *data)
188165

189166
static void dev_pagemap_percpu_release(struct percpu_ref *ref)
190167
{
191-
struct dev_pagemap *pgmap =
192-
container_of(ref, struct dev_pagemap, internal_ref);
168+
struct dev_pagemap *pgmap = container_of(ref, struct dev_pagemap, ref);
193169

194170
complete(&pgmap->done);
195171
}
@@ -295,8 +271,8 @@ static int pagemap_range(struct dev_pagemap *pgmap, struct mhp_params *params,
295271
memmap_init_zone_device(&NODE_DATA(nid)->node_zones[ZONE_DEVICE],
296272
PHYS_PFN(range->start),
297273
PHYS_PFN(range_len(range)), pgmap);
298-
percpu_ref_get_many(pgmap->ref, pfn_end(pgmap, range_id)
299-
- pfn_first(pgmap, range_id));
274+
percpu_ref_get_many(&pgmap->ref,
275+
pfn_end(pgmap, range_id) - pfn_first(pgmap, range_id));
300276
return 0;
301277

302278
err_add_memory:
@@ -362,22 +338,11 @@ void *memremap_pages(struct dev_pagemap *pgmap, int nid)
362338
break;
363339
}
364340

365-
if (!pgmap->ref) {
366-
if (pgmap->ops && (pgmap->ops->kill || pgmap->ops->cleanup))
367-
return ERR_PTR(-EINVAL);
368-
369-
init_completion(&pgmap->done);
370-
error = percpu_ref_init(&pgmap->internal_ref,
371-
dev_pagemap_percpu_release, 0, GFP_KERNEL);
372-
if (error)
373-
return ERR_PTR(error);
374-
pgmap->ref = &pgmap->internal_ref;
375-
} else {
376-
if (!pgmap->ops || !pgmap->ops->kill || !pgmap->ops->cleanup) {
377-
WARN(1, "Missing reference count teardown definition\n");
378-
return ERR_PTR(-EINVAL);
379-
}
380-
}
341+
init_completion(&pgmap->done);
342+
error = percpu_ref_init(&pgmap->ref, dev_pagemap_percpu_release, 0,
343+
GFP_KERNEL);
344+
if (error)
345+
return ERR_PTR(error);
381346

382347
devmap_managed_enable_get(pgmap);
383348

@@ -486,7 +451,7 @@ struct dev_pagemap *get_dev_pagemap(unsigned long pfn,
486451
/* fall back to slow path lookup */
487452
rcu_read_lock();
488453
pgmap = xa_load(&pgmap_array, PHYS_PFN(phys));
489-
if (pgmap && !percpu_ref_tryget_live(pgmap->ref))
454+
if (pgmap && !percpu_ref_tryget_live(&pgmap->ref))
490455
pgmap = NULL;
491456
rcu_read_unlock();
492457

tools/testing/nvdimm/test/iomap.c

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -100,25 +100,17 @@ static void nfit_test_kill(void *_pgmap)
100100
{
101101
struct dev_pagemap *pgmap = _pgmap;
102102

103-
WARN_ON(!pgmap || !pgmap->ref);
104-
105-
if (pgmap->ops && pgmap->ops->kill)
106-
pgmap->ops->kill(pgmap);
107-
else
108-
percpu_ref_kill(pgmap->ref);
109-
110-
if (pgmap->ops && pgmap->ops->cleanup) {
111-
pgmap->ops->cleanup(pgmap);
112-
} else {
113-
wait_for_completion(&pgmap->done);
114-
percpu_ref_exit(pgmap->ref);
115-
}
103+
WARN_ON(!pgmap);
104+
105+
percpu_ref_kill(&pgmap->ref);
106+
107+
wait_for_completion(&pgmap->done);
108+
percpu_ref_exit(&pgmap->ref);
116109
}
117110

118111
static void dev_pagemap_percpu_release(struct percpu_ref *ref)
119112
{
120-
struct dev_pagemap *pgmap =
121-
container_of(ref, struct dev_pagemap, internal_ref);
113+
struct dev_pagemap *pgmap = container_of(ref, struct dev_pagemap, ref);
122114

123115
complete(&pgmap->done);
124116
}
@@ -132,22 +124,11 @@ void *__wrap_devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap)
132124
if (!nfit_res)
133125
return devm_memremap_pages(dev, pgmap);
134126

135-
if (!pgmap->ref) {
136-
if (pgmap->ops && (pgmap->ops->kill || pgmap->ops->cleanup))
137-
return ERR_PTR(-EINVAL);
138-
139-
init_completion(&pgmap->done);
140-
error = percpu_ref_init(&pgmap->internal_ref,
141-
dev_pagemap_percpu_release, 0, GFP_KERNEL);
142-
if (error)
143-
return ERR_PTR(error);
144-
pgmap->ref = &pgmap->internal_ref;
145-
} else {
146-
if (!pgmap->ops || !pgmap->ops->kill || !pgmap->ops->cleanup) {
147-
WARN(1, "Missing reference count teardown definition\n");
148-
return ERR_PTR(-EINVAL);
149-
}
150-
}
127+
init_completion(&pgmap->done);
128+
error = percpu_ref_init(&pgmap->ref, dev_pagemap_percpu_release, 0,
129+
GFP_KERNEL);
130+
if (error)
131+
return ERR_PTR(error);
151132

152133
error = devm_add_action_or_reset(dev, nfit_test_kill, pgmap);
153134
if (error)

0 commit comments

Comments
 (0)