Skip to content

Commit

Permalink
mac80211: fix RCU warnings in mesh
Browse files Browse the repository at this point in the history
Sparse RCU checking reports two warnings in the mesh
path table code. These are due to questionable uses of
rcu_dereference.

To fix the first one, get rid of mesh_gate_add() and
just make mesh_path_add_gate() do the correct deref.

To fix the second one, simply remove rcu_dereference()
in mesh_gate_del() -- it already gets a proper pointer
as indicated by the prototype (no __rcu annotation)
and confirmed by the code.

Cc: Javier Cardona <javier@cozybit.com>
Cc: Thomas Pedersen <thomas@cozybit.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Nov 21, 2011
1 parent 11a2a35 commit 30be52e
Showing 1 changed file with 5 additions and 22 deletions.
27 changes: 5 additions & 22 deletions net/mac80211/mesh_pathtbl.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,6 @@ static inline struct mesh_table *resize_dereference_mpp_paths(void)
lockdep_is_held(&pathtbl_resize_lock));
}

static int mesh_gate_add(struct mesh_table *tbl, struct mesh_path *mpath);

/*
* CAREFUL -- "tbl" must not be an expression,
* in particular not an rcu_dereference(), since
Expand Down Expand Up @@ -420,21 +418,18 @@ static void mesh_gate_node_reclaim(struct rcu_head *rp)
}

/**
* mesh_gate_add - mark mpath as path to a mesh gate and add to known_gates
* @mesh_tbl: table which contains known_gates list
* @mpath: mpath to known mesh gate
*
* Returns: 0 on success
*
* mesh_path_add_gate - add the given mpath to a mesh gate to our path table
* @mpath: gate path to add to table
*/
static int mesh_gate_add(struct mesh_table *tbl, struct mesh_path *mpath)
int mesh_path_add_gate(struct mesh_path *mpath)
{
struct mesh_table *tbl;
struct mpath_node *gate, *new_gate;
struct hlist_node *n;
int err;

rcu_read_lock();
tbl = rcu_dereference(tbl);
tbl = rcu_dereference(mesh_paths);

hlist_for_each_entry_rcu(gate, n, tbl->known_gates, list)
if (gate->mpath == mpath) {
Expand Down Expand Up @@ -478,8 +473,6 @@ static int mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath)
struct mpath_node *gate;
struct hlist_node *p, *q;

tbl = rcu_dereference(tbl);

hlist_for_each_entry_safe(gate, p, q, tbl->known_gates, list)
if (gate->mpath == mpath) {
spin_lock_bh(&tbl->gates_lock);
Expand All @@ -497,16 +490,6 @@ static int mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath)
return 0;
}

/**
*
* mesh_path_add_gate - add the given mpath to a mesh gate to our path table
* @mpath: gate path to add to table
*/
int mesh_path_add_gate(struct mesh_path *mpath)
{
return mesh_gate_add(mesh_paths, mpath);
}

/**
* mesh_gate_num - number of gates known to this interface
* @sdata: subif data
Expand Down

0 comments on commit 30be52e

Please sign in to comment.