net: Add a flow_cache_flush_deferred function

flow_cach_flush() might sleep but can be called from
atomic context via the xfrm garbage collector. So add
a flow_cache_flush_deferred() function and use this if
the xfrm garbage colector is invoked from within the
packet path.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Acked-by: Timo Teräs <timo.teras@iki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Steffen Klassert
2011-12-21 16:48:08 -05:00
committed by David S. Miller
parent 9f28a2fc0b
commit c0ed1c14a7
3 changed files with 27 additions and 4 deletions

View File

@@ -358,6 +358,18 @@ void flow_cache_flush(void)
put_online_cpus();
}
static void flow_cache_flush_task(struct work_struct *work)
{
flow_cache_flush();
}
static DECLARE_WORK(flow_cache_flush_work, flow_cache_flush_task);
void flow_cache_flush_deferred(void)
{
schedule_work(&flow_cache_flush_work);
}
static int __cpuinit flow_cache_cpu_prepare(struct flow_cache *fc, int cpu)
{
struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu);