Thanks a lot Lorenzo and David for the feedback and quick iteration on the patchset. I really like the number of lines of code has been steadily reducing since the first version :) I will fold the changes in the next series. <snip> > > > @@ -866,9 +866,14 @@ static int __init thp_shrinker_init(void) > > > huge_zero_folio_shrinker->scan_objects = shrink_huge_zero_folio_scan; > > > shrinker_register(huge_zero_folio_shrinker); > > > - deferred_split_shrinker->count_objects = deferred_split_count; > > > - deferred_split_shrinker->scan_objects = deferred_split_scan; > > > - shrinker_register(deferred_split_shrinker); > > > + if (IS_ENABLED(CONFIG_STATIC_HUGE_ZERO_FOLIO)) { > > > + if (!get_huge_zero_folio()) > > > + pr_warn("Allocating static huge zero folio failed\n"); > > > + } else { > > > + deferred_split_shrinker->count_objects = deferred_split_count; > > > + deferred_split_shrinker->scan_objects = deferred_split_scan; > > > + shrinker_register(deferred_split_shrinker); > > > + } > > > return 0; > > > } > > > -- > > > 2.50.1 > > > > > > > > > Now, one thing I do not like is that we have "ARCH_WANTS_STATIC_HUGE_ZERO_FOLIO" but > > > then have a user-selectable option. > > > > > > Should we just get rid of ARCH_WANTS_STATIC_HUGE_ZERO_FOLIO? > > One of the early feedbacks from Lorenzo was that there might be some architectures that has PMD size > 2M might enable this by mistake. So the ARCH_WANTS_STATIC_HUGE_ZERO_FOLIO was introduced as an extra precaution apart from user selectable CONFIG_STATIC_HUGE_ZERO_FOLIO. Isn't it better to have an extra knob per-arch to be on the safer side or you think it is too excessive? > > Yeah, though I guess we probably need to make it need CONFIG_MMU if so? > > Probably don't want to provide it if it might somehow break things? > > It would still depend on THP, and THP is !MMU. So that should just work. > > We could go one step further and special case in mm_get_huge_zero_folio() + > mm_put_huge_zero_folio() on CONFIG_STATIC_HUGE_ZERO_FOLIO. > > Something like > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 9c38a95e9f091..9b87884e5f299 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -248,6 +248,9 @@ static void put_huge_zero_page(void) > > struct folio *mm_get_huge_zero_folio(struct mm_struct *mm) > { > + if (IS_ENABLED(CONFIG_STATIC_HUGE_ZERO_FOLIO)) > + return huge_zero_folio; > + > if (test_bit(MMF_HUGE_ZERO_PAGE, &mm->flags)) > return READ_ONCE(huge_zero_folio); > > @@ -262,6 +265,9 @@ struct folio *mm_get_huge_zero_folio(struct mm_struct > *mm) > > void mm_put_huge_zero_folio(struct mm_struct *mm) > { > + if (IS_ENABLED(CONFIG_STATIC_HUGE_ZERO_FOLIO)) > + return huge_zero_folio; > + > if (test_bit(MMF_HUGE_ZERO_PAGE, &mm->flags)) > put_huge_zero_page(); > } > > -- Pankaj