lkml.org 
[lkml]   [2009]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC][PATCH 4/9] soft limit queue and priority
    On Mon, 6 Apr 2009 16:35:34 +0530
    Balbir Singh <balbir@linux.vnet.ibm.com> wrote:

    > * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2009-04-03 17:12:48]:
    >
    > > From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    > >
    > > Softlimitq. for memcg.
    > >
    > > Implements an array of queue to list memcgs, array index is determined by
    > > the amount of memory usage excess the soft limit.
    > >
    > > While Balbir's one uses RB-tree and my old one used a per-zone queue
    > > (with round-robin), this is one of mixture of them.
    > > (I'd like to use rotation of queue in later patches)
    > >
    > > Priority is determined by following.
    > > Assume unit = total pages/1024. (the code uses different value)
    > > if excess is...
    > > < unit, priority = 0,
    > > < unit*2, priority = 1,
    > > < unit*2*2, priority = 2,
    > > ...
    > > < unit*2^9, priority = 9,
    > > < unit*2^10, priority = 10, (> 50% to total mem)
    > >
    > > This patch just includes queue management part and not includes
    > > selection logic from queue. Some trick will be used for selecting victims at
    > > soft limit in efficient way.
    > >
    > > And this equips 2 queues, for anon and file. Inset/Delete of both list is
    > > done at once but scan will be independent. (These 2 queues are used later.)
    > >
    > > Major difference from Balbir's one other than RB-tree is bahavior under
    > > hierarchy. This one adds all children to queue by checking hierarchical
    > > priority. This is for helping per-zone usage check on victim-selection logic.
    > >
    > > Changelog: v1->v2
    > > - fixed comments.
    > > - change base size to exponent.
    > > - some micro optimization to reduce code size.
    > > - considering memory hotplug, it's not good to record a value calculated
    > > from totalram_pages at boot and using it later is bad manner. Fixed it.
    > > - removed soft_limit_lock (spinlock)
    > > - added soft_limit_update counter for avoiding mulptiple update at once.
    > >
    > >
    > > Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    > > ---
    > > mm/memcontrol.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
    > > 1 file changed, 117 insertions(+), 1 deletion(-)
    > >
    > > Index: softlimit-test2/mm/memcontrol.c
    > > ===================================================================
    > > --- softlimit-test2.orig/mm/memcontrol.c
    > > +++ softlimit-test2/mm/memcontrol.c
    > > @@ -192,7 +192,14 @@ struct mem_cgroup {
    > > atomic_t refcnt;
    > >
    > > unsigned int swappiness;
    > > -
    > > + /*
    > > + * For soft limit.
    > > + */
    > > + int soft_limit_priority;
    > > + struct list_head soft_limit_list[2];
    > > +#define SL_ANON (0)
    > > +#define SL_FILE (1)
    >
    > Comments for the #define please.
    >
    Sure.

    > > + atomic_t soft_limit_update;
    > > /*
    > > * statistics. This must be placed at the end of memcg.
    > > */
    > > @@ -938,11 +945,115 @@ static bool mem_cgroup_soft_limit_check(
    > > return ret;
    > > }
    > >
    > > +/*
    > > + * Assume "base_amount", and excess = usage - soft limit.
    > > + *
    > > + * 0...... if excess < base_amount
    > > + * 1...... if excess < base_amount * 2
    > > + * 2...... if excess < base_amount * 2^2
    > > + * 3.......if excess < base_amount * 2^3
    > > + * ....
    > > + * 9.......if excess < base_amount * 2^9
    > > + * 10 .....if excess < base_amount * 2^10
    > > + *
    > > + * base_amount is detemined from total pages in the system.
    > > + */
    > > +
    > > +#define SLQ_MAXPRIO (11)
    > > +static struct {
    > > + spinlock_t lock;
    > > + struct list_head queue[SLQ_MAXPRIO][2]; /* 0:anon 1:file */
    > > +} softlimitq;
    > > +
    > > +#define SLQ_PRIO_FACTOR (1024) /* 2^10 */
    > > +
    > > +static int __calc_soft_limit_prio(unsigned long excess)
    > > +{
    > > + unsigned long factor = totalram_pages /SLQ_PRIO_FACTOR;
    >
    > I would prefer to use global_lru_pages()
    >
    Hmm, ok.

    Thanks,
    -Kame



    \
     
     \ /
      Last update: 2009-04-07 01:59    [W:0.027 / U:0.320 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site