On Sun, Mar 15, 2020 at 07:18:40PM +0100, Uladzislau Rezki (Sony) wrote: > Since there is newly introduced kvfree_rcu() API, > there is no need in queuing and using call_rcu() > to kvfree() an object after the GP. > > Remove kvfree_rcu_local() function and replace > call_rcu() by new kvfree_rcu() API that does > the same but in more efficient way. This patch LGTM: Reviewed-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx> thanks, - Joel > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx> > --- > mm/list_lru.c | 13 +++---------- > 1 file changed, 3 insertions(+), 10 deletions(-) > > diff --git a/mm/list_lru.c b/mm/list_lru.c > index 386424688f80..69becdb22408 100644 > --- a/mm/list_lru.c > +++ b/mm/list_lru.c > @@ -12,6 +12,7 @@ > #include <linux/slab.h> > #include <linux/mutex.h> > #include <linux/memcontrol.h> > +#include <linux/rcupdate.h> > #include "slab.h" > > #ifdef CONFIG_MEMCG_KMEM > @@ -383,21 +384,13 @@ static void memcg_destroy_list_lru_node(struct list_lru_node *nlru) > struct list_lru_memcg *memcg_lrus; > /* > * This is called when shrinker has already been unregistered, > - * and nobody can use it. So, there is no need to use kvfree_rcu_local(). > + * and nobody can use it. So, there is no need to use kvfree_rcu(). > */ > memcg_lrus = rcu_dereference_protected(nlru->memcg_lrus, true); > __memcg_destroy_list_lru_node(memcg_lrus, 0, memcg_nr_cache_ids); > kvfree(memcg_lrus); > } > > -static void kvfree_rcu_local(struct rcu_head *head) > -{ > - struct list_lru_memcg *mlru; > - > - mlru = container_of(head, struct list_lru_memcg, rcu); > - kvfree(mlru); > -} > - > static int memcg_update_list_lru_node(struct list_lru_node *nlru, > int old_size, int new_size) > { > @@ -429,7 +422,7 @@ static int memcg_update_list_lru_node(struct list_lru_node *nlru, > rcu_assign_pointer(nlru->memcg_lrus, new); > spin_unlock_irq(&nlru->lock); > > - call_rcu(&old->rcu, kvfree_rcu_local); > + kvfree_rcu(old, rcu); > return 0; > } > > -- > 2.20.1 >