Re: [PATCH] thp: do not adjust zone water marks if khugepaged is not started

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Mar 27, 2015 at 02:47:08PM -0700, Andrew Morton wrote:
> On Fri, 27 Mar 2015 13:39:38 +0200 "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> wrote:
> 
> > set_recommended_min_free_kbytes() adjusts zone water marks to be suitable
> > for khugepaged. We avoid doing this if khugepaged is disabled, but don't
> > catch the case when khugepaged is failed to start.
> > 
> > Let's address this by checking khugepaged_thread instead of
> > khugepaged_enabled() in set_recommended_min_free_kbytes().
> > It's NULL if the kernel thread is stopped or failed to start.
> >
> 
> hm, why didn't khugepaged start up?  Is this a theoretical
> by-code-inspection thing or has the problem been observed in real life?

David mentioned this scenario in comment to my previous patch.

> 
> > --- a/mm/huge_memory.c
> > +++ b/mm/huge_memory.c
> > @@ -110,7 +110,8 @@ static int set_recommended_min_free_kbytes(void)
> >  	int nr_zones = 0;
> >  	unsigned long recommended_min;
> >  
> > -	if (!khugepaged_enabled())
> > +	/* khugepaged thread has stopped to failed to start */
> > +	if (!khugepaged_thread)
> >  		return 0;
> >  
> >  	for_each_populated_zone(zone)
> 
> Fair enough, but take a look at start_khugepaged():
> 
> : static int start_khugepaged(void)
> : {
> : 	int err = 0;
> : 	if (khugepaged_enabled()) {
> : 		if (!khugepaged_thread)
> : 			khugepaged_thread = kthread_run(khugepaged, NULL,
> : 							"khugepaged");
> : 		if (unlikely(IS_ERR(khugepaged_thread))) {
> : 			pr_err("khugepaged: kthread_run(khugepaged) failed\n");
> : 			err = PTR_ERR(khugepaged_thread);
> : 			khugepaged_thread = NULL;
> 
> -->> stop here 

Right, but set_recommended_min_free_kbytes() is also registered to
late_initcall() and will get called anyway.

It's not obvious why would we need it registered there. Call from
start_khugepaged() should be enough.

Andrea?

> : 		}
> : 
> : 		if (!list_empty(&khugepaged_scan.mm_head))
> : 			wake_up_interruptible(&khugepaged_wait);
> : 
> : 		set_recommended_min_free_kbytes();
> : 	} else if (khugepaged_thread) {
> : 		kthread_stop(khugepaged_thread);
> : 		khugepaged_thread = NULL;
> : 	}
> : 
> : 	return err;
> : }
> 
> --
> 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>

-- 
 Kirill A. Shutemov

--
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>




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]