2008-03-16 08:24:17

by Peter Teoh

[permalink] [raw]
Subject: spin_lock after get_cpu_var()

I find it quite puzzling (no where else in kernel source is this
found) that you would want to apply spin_lock() after get_cpu_var().
The fddef is already percpu, so there is no need to lock it, right?

I submitted this patch before, but got no response, just trying my
luck this time :-).

void free_fdtable_rcu(struct rcu_head *rcu)
{
struct fdtable *fdt = container_of(rcu, struct fdtable, rcu);
struct fdtable_defer *fddef;

BUG_ON(!fdt);

if (fdt->max_fds <= NR_OPEN_DEFAULT) {
/*
* This fdtable is embedded in the files structure and that
* structure itself is getting destroyed.
*/
kmem_cache_free(files_cachep,
container_of(fdt, struct files_struct, fdtab));
return;
}
if (fdt->max_fds <= (PAGE_SIZE / sizeof(struct file *))) {
kfree(fdt->fd);
kfree(fdt->open_fds);
kfree(fdt);
} else {
fddef = &get_cpu_var(fdtable_defer_list);=============> here
spin_lock(&fddef->lock);==========================>here
fdt->next = fddef->next;
fddef->next = fdt;
/* vmallocs are handled from the workqueue context */
schedule_work(&fddef->wq);
spin_unlock(&fddef->lock);
put_cpu_var(fdtable_defer_list);
}
}


2008-03-16 10:14:47

by Johannes Weiner

[permalink] [raw]
Subject: Re: spin_lock after get_cpu_var()

Hi Peter,

"Peter Teoh" <[email protected]> writes:

> I find it quite puzzling (no where else in kernel source is this
> found) that you would want to apply spin_lock() after get_cpu_var().
> The fddef is already percpu, so there is no need to lock it, right?
>
> I submitted this patch before, but got no response, just trying my
> luck this time :-).

http://lkml.org/lkml/2008/3/14/208

Hannes