On Thu, Jan 15, 2015 at 05:16:46PM -0800, Andrew Morton wrote: > On Thu, 15 Jan 2015 16:40:33 +0900 Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> wrote: > > > compound_head() is implemented with assumption that there would be > > race condition when checking tail flag. This assumption is only true > > when we try to access arbitrary positioned struct page. > > > > The situation that virt_to_head_page() is called is different case. > > We call virt_to_head_page() only in the range of allocated pages, > > so there is no race condition on tail flag. In this case, we don't > > need to handle race condition and we can reduce overhead slightly. > > This patch implements compound_head_fast() which is similar with > > compound_head() except tail flag race handling. And then, > > virt_to_head_page() uses this optimized function to improve performance. > > > > I saw 1.8% win in a fast-path loop over kmem_cache_alloc/free, > > (14.063 ns -> 13.810 ns) if target object is on tail page. > > > > ... > > > > --- a/include/linux/mm.h > > +++ b/include/linux/mm.h > > @@ -453,6 +453,13 @@ static inline struct page *compound_head(struct page *page) > > return page; > > } > > > > +static inline struct page *compound_head_fast(struct page *page) > > +{ > > + if (unlikely(PageTail(page))) > > + return page->first_page; > > + return page; > > +} > > Can we please have some code comments which let people know when they > should and shouldn't use compound_head_fast()? I shouldn't have to say > this :( Okay. > > > /* > > * The atomic page->_mapcount, starts from -1: so that transitions > > * both from it and to it can be tracked, using atomic_inc_and_test > > @@ -531,7 +538,8 @@ static inline void get_page(struct page *page) > > static inline struct page *virt_to_head_page(const void *x) > > { > > struct page *page = virt_to_page(x); > > - return compound_head(page); > > + > > + return compound_head_fast(page); > > And perhaps some explanation here as to why virt_to_head_page() can > safely use compound_head_fast(). There's an assumption here that > nobody will be dismantling the compound page while virt_to_head_page() > is in progress, yes? And this assumption also holds for the calling > code, because otherwise the virt_to_head_page() return value is kinda > meaningless. > > This is tricky stuff - let's spell it out carefully. Okay. I already sent v3 and it would have proper code comments. Thanks. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>