return dp;
}
-/* Must be called with genl_mutex. */
-static struct flow_table *get_table_protected(struct datapath *dp)
-{
- return rcu_dereference_protected(dp->table, lockdep_genl_is_held());
-}
-
/* Must be called with rcu_read_lock or RTNL lock. */
static struct vport *get_vport_protected(struct datapath *dp, u16 port_no)
{
if (!dp)
return -ENODEV;
- old_table = get_table_protected(dp);
+ old_table = genl_dereference(dp->table);
new_table = flow_tbl_alloc(TBL_MIN_BUCKETS);
if (!new_table)
return -ENOMEM;
static void get_dp_stats(struct datapath *dp, struct ovs_dp_stats *stats)
{
int i;
- struct flow_table *table = get_table_protected(dp);
+ struct flow_table *table = genl_dereference(dp->table);
stats->n_flows = flow_tbl_count(table);
if (!dp)
goto error;
- table = get_table_protected(dp);
+ table = genl_dereference(dp->table);
flow = flow_tbl_lookup(table, &key, key_len);
if (!flow) {
struct sw_flow_actions *acts;
if (!IS_ERR(new_table)) {
rcu_assign_pointer(dp->table, new_table);
flow_tbl_deferred_destroy(table);
- table = get_table_protected(dp);
+ table = genl_dereference(dp->table);
}
}
if (!dp)
return -ENODEV;
- table = get_table_protected(dp);
+ table = genl_dereference(dp->table);
flow = flow_tbl_lookup(table, &key, key_len);
if (!flow)
return -ENOENT;
if (!dp)
return -ENODEV;
- table = get_table_protected(dp);
+ table = genl_dereference(dp->table);
flow = flow_tbl_lookup(table, &key, key_len);
if (!flow)
return -ENOENT;
{
struct ovs_header *ovs_header = genlmsg_data(nlmsg_data(cb->nlh));
struct datapath *dp;
+ struct flow_table *table;
dp = get_dp(ovs_header->dp_ifindex);
if (!dp)
return -ENODEV;
+ table = genl_dereference(dp->table);
+
for (;;) {
struct sw_flow *flow;
u32 bucket, obj;
bucket = cb->args[0];
obj = cb->args[1];
- flow = flow_tbl_next(get_table_protected(dp), &bucket, &obj);
+ flow = flow_tbl_next(table, &bucket, &obj);
if (!flow)
break;
err_destroy_percpu:
free_percpu(dp->stats_percpu);
err_destroy_table:
- flow_tbl_destroy(get_table_protected(dp));
+ flow_tbl_destroy(genl_dereference(dp->table));
err_free_dp:
kfree(dp);
err_put_module: