[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20090421102317.F113.A69D9226@jp.fujitsu.com>
Date: Tue, 21 Apr 2009 10:41:20 +0900 (JST)
From: KOSAKI Motohiro <kosaki.motohiro@...fujitsu.com>
To: Dave Hansen <dave@...ux.vnet.ibm.com>
Cc: kosaki.motohiro@...fujitsu.com,
Eric B Munson <ebmunson@...ibm.com>, linux-mm@...ck.org,
linux-kernel@...r.kernel.org, mel@...ux.vnet.ibm.com,
cl@...ux-foundation.org
Subject: Re: [PATCH V3] Fix Committed_AS underflow
> void vm_acct_memory(long pages)
> {
> long *local;
> long local_min = -ACCT_THRESHOLD;
> long local_max = ACCT_THRESHOLD;
> long local_goal = 0;
>
> preempt_disable();
> local = &__get_cpu_var(committed_space);
> *local += pages;
> if (*local > local_max || *local < local_min) {
> atomic_long_add(*local - local_goal, &vm_committed_space);
> *local = local_goal;
> }
> preempt_enable();
> }
>
> But now consider if we changed the local_* variables a bit:
>
> long local_min = -(ACCT_THRESHOLD*2);
> long local_max = 0
> long local_goal = -ACCT_THRESHOLD;
>
> We'll get some possibly *large* numbers in meminfo, but it will at least
> never underflow.
if *local == -(ACCT_THRESHOLD*2),
*local - local_goal = -(ACCT_THRESHOLD*2) + ACCT_THRESHOLD = -ACCT_THRESHOLD
Then, we still pass negative value to atomic_long_add().
IOW, vm_committed_space still can be negative value.
Am I missing anything?
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists