On Sun, Nov 18, 2012 at 02:23:44PM +0800, Jaegeuk Hanse wrote: > On 11/16/2012 03:27 AM, Kirill A. Shutemov wrote: > >From: "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> > > > >H. Peter Anvin doesn't like huge zero page which sticks in memory forever > >after the first allocation. Here's implementation of lockless refcounting > >for huge zero page. > > > >We have two basic primitives: {get,put}_huge_zero_page(). They > >manipulate reference counter. > > > >If counter is 0, get_huge_zero_page() allocates a new huge page and > >takes two references: one for caller and one for shrinker. We free the > >page only in shrinker callback if counter is 1 (only shrinker has the > >reference). > > > >put_huge_zero_page() only decrements counter. Counter is never zero > >in put_huge_zero_page() since shrinker holds on reference. > > > >Freeing huge zero page in shrinker callback helps to avoid frequent > >allocate-free. > > > >Refcounting has cost. On 4 socket machine I observe ~1% slowdown on > >parallel (40 processes) read page faulting comparing to lazy huge page > >allocation. I think it's pretty reasonable for synthetic benchmark. > > Hi Kirill, > > I see your and Andew's hot discussion in v4 resend thread. > > "I also tried another scenario: usemem -n16 100M -r 1000. It creates > real memory pressure - no easy reclaimable memory. This time > callback called with nr_to_scan > 0 and we freed hzp. " > > What's "usemem"? Is it a tool and how to get it? http://www.spinics.net/lists/linux-mm/attachments/gtarazbJaHPaAT.gtar > It's hard for me to > find nr_to_scan > 0 in every callset, how can nr_to_scan > 0 in your > scenario? shrink_slab() calls the callback with nr_to_scan > 0 if system is under pressure -- look for do_shrinker_shrink(). -- Kirill A. Shutemov
Attachment:
signature.asc
Description: Digital signature