diff options
-rw-r--r-- | net/core/flow.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/net/core/flow.c b/net/core/flow.c index 555a456efb07..8ae42de9c79e 100644 --- a/net/core/flow.c +++ b/net/core/flow.c | |||
@@ -413,7 +413,7 @@ static int __init flow_cache_init(struct flow_cache *fc) | |||
413 | 413 | ||
414 | for_each_online_cpu(i) { | 414 | for_each_online_cpu(i) { |
415 | if (flow_cache_cpu_prepare(fc, i)) | 415 | if (flow_cache_cpu_prepare(fc, i)) |
416 | return -ENOMEM; | 416 | goto err; |
417 | } | 417 | } |
418 | fc->hotcpu_notifier = (struct notifier_block){ | 418 | fc->hotcpu_notifier = (struct notifier_block){ |
419 | .notifier_call = flow_cache_cpu, | 419 | .notifier_call = flow_cache_cpu, |
@@ -426,6 +426,18 @@ static int __init flow_cache_init(struct flow_cache *fc) | |||
426 | add_timer(&fc->rnd_timer); | 426 | add_timer(&fc->rnd_timer); |
427 | 427 | ||
428 | return 0; | 428 | return 0; |
429 | |||
430 | err: | ||
431 | for_each_possible_cpu(i) { | ||
432 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, i); | ||
433 | kfree(fcp->hash_table); | ||
434 | fcp->hash_table = NULL; | ||
435 | } | ||
436 | |||
437 | free_percpu(fc->percpu); | ||
438 | fc->percpu = NULL; | ||
439 | |||
440 | return -ENOMEM; | ||
429 | } | 441 | } |
430 | 442 | ||
431 | static int __init flow_cache_init_global(void) | 443 | static int __init flow_cache_init_global(void) |