mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 22:25:03 +00:00
kvfree_rcu: Use [READ/WRITE]_ONCE() macros to access to nr_bkv_objs
nr_bkv_objs is a count of the objects in the kvfree_rcu page cache. Accessing it requires holding the ->lock. Switch to READ_ONCE() and WRITE_ONCE() macros to provide lockless access to this counter. This lockless access is used for the shrinker. Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
d0bfa8b3c4
commit
ac7625ebd5
1 changed files with 4 additions and 10 deletions
|
@ -3250,7 +3250,7 @@ get_cached_bnode(struct kfree_rcu_cpu *krcp)
|
||||||
if (!krcp->nr_bkv_objs)
|
if (!krcp->nr_bkv_objs)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
krcp->nr_bkv_objs--;
|
WRITE_ONCE(krcp->nr_bkv_objs, krcp->nr_bkv_objs - 1);
|
||||||
return (struct kvfree_rcu_bulk_data *)
|
return (struct kvfree_rcu_bulk_data *)
|
||||||
llist_del_first(&krcp->bkvcache);
|
llist_del_first(&krcp->bkvcache);
|
||||||
}
|
}
|
||||||
|
@ -3264,9 +3264,8 @@ put_cached_bnode(struct kfree_rcu_cpu *krcp,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
llist_add((struct llist_node *) bnode, &krcp->bkvcache);
|
llist_add((struct llist_node *) bnode, &krcp->bkvcache);
|
||||||
krcp->nr_bkv_objs++;
|
WRITE_ONCE(krcp->nr_bkv_objs, krcp->nr_bkv_objs + 1);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -3278,7 +3277,7 @@ drain_page_cache(struct kfree_rcu_cpu *krcp)
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&krcp->lock, flags);
|
raw_spin_lock_irqsave(&krcp->lock, flags);
|
||||||
page_list = llist_del_all(&krcp->bkvcache);
|
page_list = llist_del_all(&krcp->bkvcache);
|
||||||
krcp->nr_bkv_objs = 0;
|
WRITE_ONCE(krcp->nr_bkv_objs, 0);
|
||||||
raw_spin_unlock_irqrestore(&krcp->lock, flags);
|
raw_spin_unlock_irqrestore(&krcp->lock, flags);
|
||||||
|
|
||||||
llist_for_each_safe(pos, n, page_list) {
|
llist_for_each_safe(pos, n, page_list) {
|
||||||
|
@ -3682,18 +3681,13 @@ kfree_rcu_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
unsigned long count = 0;
|
unsigned long count = 0;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* Snapshot count of all CPUs */
|
/* Snapshot count of all CPUs */
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu);
|
struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu);
|
||||||
|
|
||||||
count += READ_ONCE(krcp->count);
|
count += READ_ONCE(krcp->count);
|
||||||
|
count += READ_ONCE(krcp->nr_bkv_objs);
|
||||||
raw_spin_lock_irqsave(&krcp->lock, flags);
|
|
||||||
count += krcp->nr_bkv_objs;
|
|
||||||
raw_spin_unlock_irqrestore(&krcp->lock, flags);
|
|
||||||
|
|
||||||
atomic_set(&krcp->backoff_page_cache_fill, 1);
|
atomic_set(&krcp->backoff_page_cache_fill, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue