lkml.org 
[lkml]   [2009]   [Apr]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 07/25] Check in advance if the zonelist needs additional filtering
    On Tue, Apr 21, 2009 at 10:21:12AM +0300, Pekka Enberg wrote:
    > Hi Mel,
    >
    > On Mon, 2009-04-20 at 23:19 +0100, Mel Gorman wrote:
    > > Zonelist are filtered based on nodemasks for memory policies normally.
    > > It can be additionally filters on cpusets if they exist as well as
    > > noting when zones are full. These simple checks are expensive enough to
    > > be noticed in profiles. This patch checks in advance if zonelist
    > > filtering will ever be needed. If not, then the bulk of the checks are
    > > skipped.
    > >
    > > Signed-off-by: Mel Gorman <mel@csn.ul.ie>
    > > @@ -1401,6 +1405,7 @@ get_page_from_freelist(gfp_t gfp_mask, nodemask_t *nodemask, unsigned int order,
    > > nodemask_t *allowednodes = NULL;/* zonelist_cache approximation */
    > > int zlc_active = 0; /* set if using zonelist_cache */
    > > int did_zlc_setup = 0; /* just call zlc_setup() one time */
    > > + int zonelist_filter = 0;
    > >
    > > (void)first_zones_zonelist(zonelist, high_zoneidx, nodemask,
    > > &preferred_zone);
    > > @@ -1411,6 +1416,10 @@ get_page_from_freelist(gfp_t gfp_mask, nodemask_t *nodemask, unsigned int order,
    > >
    > > VM_BUG_ON(order >= MAX_ORDER);
    > >
    > > + /* Determine in advance if the zonelist needs filtering */
    > > + if ((alloc_flags & ALLOC_CPUSET) && unlikely(number_of_cpusets > 1))
    > > + zonelist_filter = 1;
    > > +
    > > zonelist_scan:
    > > /*
    > > * Scan zonelist, looking for a zone with enough free.
    > > @@ -1418,12 +1427,16 @@ zonelist_scan:
    > > */
    > > for_each_zone_zonelist_nodemask(zone, z, zonelist,
    > > high_zoneidx, nodemask) {
    > > - if (NUMA_BUILD && zlc_active &&
    > > - !zlc_zone_worth_trying(zonelist, z, allowednodes))
    > > - continue;
    > > - if ((alloc_flags & ALLOC_CPUSET) &&
    > > - !cpuset_zone_allowed_softwall(zone, gfp_mask))
    > > - goto try_next_zone;
    > > +
    > > + /* Ignore the additional zonelist filter checks if possible */
    > > + if (zonelist_filter) {
    > > + if (NUMA_BUILD && zlc_active &&
    > > + !zlc_zone_worth_trying(zonelist, z, allowednodes))
    > > + continue;
    > > + if ((alloc_flags & ALLOC_CPUSET) &&
    >
    > The above expression is always true here because of the earlier
    > zonelists_filter check, no?
    >

    Yeah, silly. I've dropped the patch altogether though because it was
    avoiding zonelist filtering for the wrong reasons.

    > > + !cpuset_zone_allowed_softwall(zone, gfp_mask))
    > > + goto try_next_zone;
    > > + }
    > >
    > > if (!(alloc_flags & ALLOC_NO_WATERMARKS)) {
    > > unsigned long mark;
    >
    >

    --
    Mel Gorman
    Part-time Phd Student Linux Technology Center
    University of Limerick IBM Dublin Software Lab


    \
     
     \ /
      Last update: 2009-04-21 11:53    [W:4.139 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site