diff options
Diffstat (limited to 'net/core/net-sysfs.c')
-rw-r--r-- | net/core/net-sysfs.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index a5ff5a89f376..7f902cad10f8 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -712,15 +712,21 @@ static void rx_queue_release(struct kobject *kobj) | |||
712 | 712 | ||
713 | 713 | ||
714 | map = rcu_dereference_raw(queue->rps_map); | 714 | map = rcu_dereference_raw(queue->rps_map); |
715 | if (map) | 715 | if (map) { |
716 | RCU_INIT_POINTER(queue->rps_map, NULL); | ||
716 | call_rcu(&map->rcu, rps_map_release); | 717 | call_rcu(&map->rcu, rps_map_release); |
718 | } | ||
717 | 719 | ||
718 | flow_table = rcu_dereference_raw(queue->rps_flow_table); | 720 | flow_table = rcu_dereference_raw(queue->rps_flow_table); |
719 | if (flow_table) | 721 | if (flow_table) { |
722 | RCU_INIT_POINTER(queue->rps_flow_table, NULL); | ||
720 | call_rcu(&flow_table->rcu, rps_dev_flow_table_release); | 723 | call_rcu(&flow_table->rcu, rps_dev_flow_table_release); |
724 | } | ||
721 | 725 | ||
722 | if (atomic_dec_and_test(&first->count)) | 726 | if (atomic_dec_and_test(&first->count)) |
723 | kfree(first); | 727 | kfree(first); |
728 | else | ||
729 | memset(kobj, 0, sizeof(*kobj)); | ||
724 | } | 730 | } |
725 | 731 | ||
726 | static struct kobj_type rx_queue_ktype = { | 732 | static struct kobj_type rx_queue_ktype = { |