Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The netfilter conflicts were rather simple overlapping changes. However, the cls_tcindex.c stuff was a bit more complex. On the 'net' side, Cong is fixing several races and memory leaks. Whilst on the 'net-next' side we have Vlad adding the rtnl-ness support. What I've decided to do, in order to resolve this, is revert the conversion over to using a workqueue that Cong did, bringing us back to pure RCU. I did it this way because I believe that either Cong's races don't apply with have Vlad did things, or Cong will have to implement the race fix slightly differently. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -275,7 +275,7 @@ static void tcindex_free_perfect_hash(struct tcindex_data *cp)
|
||||
kfree(cp->perfect);
|
||||
}
|
||||
|
||||
static int tcindex_alloc_perfect_hash(struct tcindex_data *cp)
|
||||
static int tcindex_alloc_perfect_hash(struct net *net, struct tcindex_data *cp)
|
||||
{
|
||||
int i, err = 0;
|
||||
|
||||
@@ -289,6 +289,9 @@ static int tcindex_alloc_perfect_hash(struct tcindex_data *cp)
|
||||
TCA_TCINDEX_ACT, TCA_TCINDEX_POLICE);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
cp->perfect[i].exts.net = net;
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -305,9 +308,9 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
struct nlattr *est, bool ovr, struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct tcindex_filter_result new_filter_result, *old_r = r;
|
||||
struct tcindex_filter_result cr;
|
||||
struct tcindex_data *cp = NULL, *oldp;
|
||||
struct tcindex_filter *f = NULL; /* make gcc behave */
|
||||
struct tcf_result cr = {};
|
||||
int err, balloc = 0;
|
||||
struct tcf_exts e;
|
||||
|
||||
@@ -337,7 +340,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
if (p->perfect) {
|
||||
int i;
|
||||
|
||||
if (tcindex_alloc_perfect_hash(cp) < 0)
|
||||
if (tcindex_alloc_perfect_hash(net, cp) < 0)
|
||||
goto errout;
|
||||
for (i = 0; i < cp->hash; i++)
|
||||
cp->perfect[i].res = p->perfect[i].res;
|
||||
@@ -346,13 +349,10 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
cp->h = p->h;
|
||||
|
||||
err = tcindex_filter_result_init(&new_filter_result);
|
||||
if (err < 0)
|
||||
goto errout1;
|
||||
err = tcindex_filter_result_init(&cr);
|
||||
if (err < 0)
|
||||
goto errout1;
|
||||
if (old_r)
|
||||
cr.res = r->res;
|
||||
cr = r->res;
|
||||
|
||||
if (tb[TCA_TCINDEX_HASH])
|
||||
cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]);
|
||||
@@ -406,7 +406,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
err = -ENOMEM;
|
||||
if (!cp->perfect && !cp->h) {
|
||||
if (valid_perfect_hash(cp)) {
|
||||
if (tcindex_alloc_perfect_hash(cp) < 0)
|
||||
if (tcindex_alloc_perfect_hash(net, cp) < 0)
|
||||
goto errout_alloc;
|
||||
balloc = 1;
|
||||
} else {
|
||||
@@ -443,8 +443,8 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
}
|
||||
|
||||
if (tb[TCA_TCINDEX_CLASSID]) {
|
||||
cr.res.classid = nla_get_u32(tb[TCA_TCINDEX_CLASSID]);
|
||||
tcf_bind_filter(tp, &cr.res, base);
|
||||
cr.classid = nla_get_u32(tb[TCA_TCINDEX_CLASSID]);
|
||||
tcf_bind_filter(tp, &cr, base);
|
||||
}
|
||||
|
||||
if (old_r && old_r != r) {
|
||||
@@ -456,7 +456,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
}
|
||||
|
||||
oldp = p;
|
||||
r->res = cr.res;
|
||||
r->res = cr;
|
||||
tcf_exts_change(&r->exts, &e);
|
||||
|
||||
rcu_assign_pointer(tp->root, cp);
|
||||
@@ -475,6 +475,8 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
|
||||
; /* nothing */
|
||||
|
||||
rcu_assign_pointer(*fp, f);
|
||||
} else {
|
||||
tcf_exts_destroy(&new_filter_result.exts);
|
||||
}
|
||||
|
||||
if (oldp)
|
||||
@@ -487,7 +489,6 @@ errout_alloc:
|
||||
else if (balloc == 2)
|
||||
kfree(cp->h);
|
||||
errout1:
|
||||
tcf_exts_destroy(&cr.exts);
|
||||
tcf_exts_destroy(&new_filter_result.exts);
|
||||
errout:
|
||||
kfree(cp);
|
||||
|
@@ -500,7 +500,7 @@ static void dev_watchdog_down(struct net_device *dev)
|
||||
* netif_carrier_on - set carrier
|
||||
* @dev: network device
|
||||
*
|
||||
* Device has detected that carrier.
|
||||
* Device has detected acquisition of carrier.
|
||||
*/
|
||||
void netif_carrier_on(struct net_device *dev)
|
||||
{
|
||||
|
Reference in New Issue
Block a user