From: David Rientjes <rientjes@xxxxxxxxxx> Date: Tue, 19 Feb 2013 11:37:30 -0800 (PST) > On Tue, 19 Feb 2013, David Miller wrote: > >> diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c >> index 7f64743..338b406 100644 >> --- a/arch/sparc/mm/tsb.c >> +++ b/arch/sparc/mm/tsb.c >> @@ -288,14 +288,13 @@ static unsigned long tsb_size_to_rss_limit(unsigned long new_size) >> * the number of entries that the current TSB can hold at once. Currently, >> * we trigger when the RSS hits 3/4 of the TSB capacity. >> */ >> -void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long rss) >> +void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long rss, gfp_t gfp) >> { >> unsigned long max_tsb_size = 1 * 1024 * 1024; >> unsigned long new_size, old_size, flags; >> struct tsb *old_tsb, *new_tsb; >> unsigned long new_cache_index, old_cache_index; >> unsigned long new_rss_limit; >> - gfp_t gfp_flags; >> >> if (max_tsb_size > (PAGE_SIZE << MAX_ORDER)) >> max_tsb_size = (PAGE_SIZE << MAX_ORDER); >> @@ -312,12 +311,11 @@ void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long rss) >> new_rss_limit = ~0UL; >> >> retry_tsb_alloc: >> - gfp_flags = GFP_KERNEL; >> if (new_size > (PAGE_SIZE * 2)) >> - gfp_flags = __GFP_NOWARN | __GFP_NORETRY; >> + gfp = __GFP_NOWARN | __GFP_NORETRY; > > The existing code here already looks buggy for a different reason, it > should be gfp |= __GFP_NOWARN | __GFP_NORETRY; > > I was wondering if you could get away with just a simple one-liner fix > above by doing > > gfp_flags = rss ? GFP_KERNEL : GFP_NOWAIT; > > but I agree this is more robust. Thanks for noticing that bug. I'll probably just fix the "=" to an "|=" for now. -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html