On Thu, Oct 01, 2020 at 11:02:20AM +0200, Michal Hocko wrote:
> On Wed 30-09-20 16:21:54, Paul E. McKenney wrote:

[ . . . ]

Hit "send" too soon, apologies...

> > ------------------------------------------------------------------------
> > 
> > commit 490b638d7c241ac06cee168ccf8688bb8b872478
> > Author: Paul E. McKenney <paul...@kernel.org>
> > Date:   Wed Sep 30 16:16:39 2020 -0700
> > 
> >     kvfree_rcu(): Switch from kmalloc/kfree to __get_free_page/free_page.
> >     
> >     The advantages of using kmalloc() and kfree() are a possible small 
> > speedup
> >     on CONFIG_SLAB=y systems, avoiding the allocation-side cast, and use of
> >     more-familiar API members.  The advantages of using __get_free_page()
> >     and free_page() are a possible reduction in fragmentation and direct
> >     access to the buddy allocator.
> >     
> >     To help settle the question as to which to use, this commit switches
> >     from kmalloc() and kfree() to __get_free_page() and free_page().
> >     
> >     Suggested-by: Michal Hocko <mho...@suse.com>
> >     Suggested-by: "Uladzislau Rezki (Sony)" <ure...@gmail.com>
> >     Signed-off-by: Paul E. McKenney <paul...@kernel.org>
> 
> Yes, looks good to me. I am not entirely sure about the fragmentation
> argument. It really depends on the SL.B allocator internals. The same
> applies for the potential speed up. I would be even surprised if the
> SLAB was faster in average considering it has to use the page allocator
> as well. So to me the primary motivation would be "use the right tool
> for the purpose".

Very well, I will update the commit message, and thank you!

                                                        Thanx, Paul

> > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > index 2886e81..242f0f0 100644
> > --- a/kernel/rcu/tree.c
> > +++ b/kernel/rcu/tree.c
> > @@ -3225,7 +3225,8 @@ static void kfree_rcu_work(struct work_struct *work)
> >                             bkvhead[i] = NULL;
> >                     krc_this_cpu_unlock(krcp, flags);
> >  
> > -                   kfree(bkvhead[i]);
> > +                   if (bkvhead[i])
> > +                           free_page((unsigned long)bkvhead[i]);
> >  
> >                     cond_resched_tasks_rcu_qs();
> >             }
> > @@ -3378,7 +3379,7 @@ add_ptr_to_bulk_krc_lock(struct kfree_rcu_cpu **krcp,
> >             bnode = get_cached_bnode(*krcp);
> >             if (!bnode && can_alloc_page) {
> >                     krc_this_cpu_unlock(*krcp, *flags);
> > -                   bnode = kmalloc(PAGE_SIZE, gfp);
> > +                   bnode = (struct kvfree_rcu_bulk_data 
> > *)__get_free_page(gfp);
> >                     *krcp = krc_this_cpu_lock(flags);
> >             }
> >  
> 
> -- 
> Michal Hocko
> SUSE Labs

Reply via email to