Balbir Singh wrote: > A new configuration file called soft_limit_in_bytes is added. The parsing > and configuration rules remain the same as for the limit_in_bytes user > interface. > > A global list of all memory cgroups over their soft limit is maintained. > This list is then used to reclaim memory on global pressure. A cgroup is > removed from the list when the cgroup is deleted. > > The global list is protected with a read-write spinlock. >
You are not using read-write spinlock.. > > Signed-off-by: Balbir Singh <[EMAIL PROTECTED]> > --- > > mm/memcontrol.c | 33 ++++++++++++++++++++++++++++++++- > 1 file changed, 32 insertions(+), 1 deletion(-) > > diff -puN mm/memcontrol.c~memory-controller-add-soft-limit-interface > mm/memcontrol.c > --- > linux-2.6.25-rc2/mm/memcontrol.c~memory-controller-add-soft-limit-interface > 2008-02-19 12:31:49.000000000 +0530 > +++ linux-2.6.25-rc2-balbir/mm/memcontrol.c 2008-02-19 12:31:49.000000000 > +0530 > @@ -35,6 +35,10 @@ > > struct cgroup_subsys mem_cgroup_subsys; > static const int MEM_CGROUP_RECLAIM_RETRIES = 5; > +static spinlock_t mem_cgroup_sl_list_lock; /* spin lock that protects */ > + /* the list of cgroups over*/ > + /* their soft limit */ > +static struct list_head mem_cgroup_sl_exceeded_list; > > /* > * Statistics for memory cgroup. > @@ -136,6 +140,10 @@ struct mem_cgroup { > * statistics. > */ > struct mem_cgroup_stat stat; > + /* > + * List of all mem_cgroup's that exceed their soft limit > + */ > + struct list_head sl_exceeded_list; > }; > > /* > @@ -679,6 +687,18 @@ retry: > goto retry; > } > > + /* > + * If we exceed our soft limit, we get added to the list of > + * cgroups over their soft limit > + */ > + if (!res_counter_check_under_limit(&mem->res, RES_SOFT_LIMIT)) { > + spin_lock_irqsave(&mem_cgroup_sl_list_lock, flags); > + if (list_empty(&mem->sl_exceeded_list)) > + list_add_tail(&mem->sl_exceeded_list, > + &mem_cgroup_sl_exceeded_list); > + spin_unlock_irqrestore(&mem_cgroup_sl_list_lock, flags); > + } > + > mz = page_cgroup_zoneinfo(pc); > spin_lock_irqsave(&mz->lru_lock, flags); > /* Update statistics vector */ > @@ -736,13 +756,14 @@ void mem_cgroup_uncharge(struct page_cgr > if (atomic_dec_and_test(&pc->ref_cnt)) { > page = pc->page; > mz = page_cgroup_zoneinfo(pc); > + mem = pc->mem_cgroup; > /* > * get page->cgroup and clear it under lock. > * force_empty can drop page->cgroup without checking refcnt. > */ > unlock_page_cgroup(page); > + > if (clear_page_cgroup(page, pc) == pc) { > - mem = pc->mem_cgroup; > css_put(&mem->css); > res_counter_uncharge(&mem->res, PAGE_SIZE); > spin_lock_irqsave(&mz->lru_lock, flags); > @@ -1046,6 +1067,12 @@ static struct cftype mem_cgroup_files[] > .name = "stat", > .open = mem_control_stat_open, > }, > + { > + .name = "soft_limit_in_bytes", > + .private = RES_SOFT_LIMIT, > + .write = mem_cgroup_write, > + .read = mem_cgroup_read, > + }, > }; > > static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *mem, int node) > @@ -1097,6 +1124,9 @@ mem_cgroup_create(struct cgroup_subsys * > if (unlikely((cont->parent) == NULL)) { > mem = &init_mem_cgroup; > init_mm.mem_cgroup = mem; > + INIT_LIST_HEAD(&mem->sl_exceeded_list); > + spin_lock_init(&mem_cgroup_sl_list_lock); > + INIT_LIST_HEAD(&mem_cgroup_sl_exceeded_list); > } else > mem = kzalloc(sizeof(struct mem_cgroup), GFP_KERNEL); > > @@ -1104,6 +1134,7 @@ mem_cgroup_create(struct cgroup_subsys * > return NULL; > > res_counter_init(&mem->res); > + INIT_LIST_HEAD(&mem->sl_exceeded_list); > mem->sl_exceeded_list initialized twice ? > memset(&mem->info, 0, sizeof(mem->info)); > > _ > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/