[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1279653481.9785.4.camel@nimitz>
Date: Tue, 20 Jul 2010 12:18:01 -0700
From: Dave Hansen <dave@...ux.vnet.ibm.com>
To: Nathan Fontenot <nfont@...tin.ibm.com>
Cc: linux-kernel@...r.kernel.org, linux-mm@...ck.org,
linuxppc-dev@...abs.org,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@...fujitsu.com>,
greg@...ah.com
Subject: Re: [PATCH 4/8] v3 Allow memory_block to span multiple memory
sections
On Mon, 2010-07-19 at 22:55 -0500, Nathan Fontenot wrote:
> +static int add_memory_section(int nid, struct mem_section *section,
> + unsigned long state, enum mem_add_context context)
> +{
> + struct memory_block *mem;
> + int ret = 0;
> +
> + mem = find_memory_block(section);
> + if (mem) {
> + atomic_inc(&mem->section_count);
> + kobject_put(&mem->sysdev.kobj);
> + } else
> + ret = init_memory_block(&mem, section, state);
> +
> if (!ret) {
> - if (context == HOTPLUG)
> + if (context == HOTPLUG &&
> + atomic_read(&mem->section_count) == sections_per_block)
> ret = register_mem_sect_under_node(mem, nid);
> }
I think the atomic_inc() can race with the atomic_dec_and_test() in
remove_memory_block().
Thread 1 does:
mem = find_memory_block(section);
Thread 2 does
atomic_dec_and_test(&mem->section_count);
and destroys the memory block, Thread 1 runs again:
if (mem) {
atomic_inc(&mem->section_count);
kobject_put(&mem->sysdev.kobj);
} else
but now mem got destroyed by Thread 2. You probably need to change
find_memory_block() to itself take a reference, and to use
atomic_inc_unless().
-- Dave
--
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