From: David S. Miller <davem@davemloft.net>
Date: Wed, 17 Jan 2018 05:00:25 +0000 (-0500)
Subject: Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=c02b3741eb99a1ec733e6134c53ba59e43e19e97;p=linux.git

Merge git://git./linux/kernel/git/davem/net

Overlapping changes all over.

The mini-qdisc bits were a little bit tricky, however.

Signed-off-by: David S. Miller <davem@davemloft.net>
---

c02b3741eb99a1ec733e6134c53ba59e43e19e97
diff --cc arch/x86/lib/Makefile
index 171377b83be19,f23934bbaf4eb..25a972c61b0ae
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@@ -26,7 -26,7 +26,8 @@@ lib-y += memcpy_$(BITS).
  lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
  lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o insn-eval.o
  lib-$(CONFIG_RANDOMIZE_BASE) += kaslr.o
 +lib-$(CONFIG_FUNCTION_ERROR_INJECTION)	+= error-inject.o
+ lib-$(CONFIG_RETPOLINE) += retpoline.o
  
  obj-y += msr.o msr-reg.o msr-reg-export.o hweight.o
  
diff --cc include/linux/mlx5/mlx5_ifc.h
index 78e36fc2609ea,1391a82da98e2..94135c03d52b3
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@@ -1035,10 -1027,9 +1035,12 @@@ struct mlx5_ifc_cmd_hca_cap_bits 
  	u8         log_max_wq_sz[0x5];
  
  	u8         nic_vport_change_event[0x1];
 +	u8         disable_local_lb[0x1];
 +	u8         reserved_at_3e2[0x1];
+ 	u8         disable_local_lb_uc[0x1];
+ 	u8         disable_local_lb_mc[0x1];
 -	u8         reserved_at_3e3[0x8];
 +	u8         log_min_hairpin_wq_data_sz[0x5];
 +	u8         reserved_at_3e8[0x3];
  	u8         log_max_vlan_list[0x5];
  	u8         reserved_at_3f0[0x3];
  	u8         log_max_current_mc_list[0x5];
diff --cc include/net/sch_generic.h
index ac029d5d88e41,becf86aa4ac6b..bd9125b0481fa
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@@ -471,11 -444,10 +471,12 @@@ void qdisc_destroy(struct Qdisc *qdisc)
  void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, unsigned int n,
  			       unsigned int len);
  struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
 -			  const struct Qdisc_ops *ops);
 +			  const struct Qdisc_ops *ops,
 +			  struct netlink_ext_ack *extack);
+ void qdisc_free(struct Qdisc *qdisc);
  struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
 -				const struct Qdisc_ops *ops, u32 parentid);
 +				const struct Qdisc_ops *ops, u32 parentid,
 +				struct netlink_ext_ack *extack);
  void __qdisc_calculate_pkt_len(struct sk_buff *skb,
  			       const struct qdisc_size_table *stab);
  int skb_do_redirect(struct sk_buff *);
diff --cc net/ipv6/ip6_output.c
index 18547a44bdaf0,4f7d8de566114..a4a94452132b8
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@@ -1215,16 -1206,18 +1215,18 @@@ static int ip6_setup_cork(struct sock *
  	v6_cork->tclass = ipc6->tclass;
  	if (rt->dst.flags & DST_XFRM_TUNNEL)
  		mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
- 		      rt->dst.dev->mtu : dst_mtu(&rt->dst);
+ 		      READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst);
  	else
  		mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
- 		      rt->dst.dev->mtu : dst_mtu(xfrm_dst_path(&rt->dst));
 -		      READ_ONCE(rt->dst.dev->mtu) : dst_mtu(rt->dst.path);
++			READ_ONCE(rt->dst.dev->mtu) : dst_mtu(xfrm_dst_path(&rt->dst));
  	if (np->frag_size < mtu) {
  		if (np->frag_size)
  			mtu = np->frag_size;
  	}
+ 	if (mtu < IPV6_MIN_MTU)
+ 		return -EINVAL;
  	cork->base.fragsize = mtu;
 -	if (dst_allfrag(rt->dst.path))
 +	if (dst_allfrag(xfrm_dst_path(&rt->dst)))
  		cork->base.flags |= IPCORK_ALLFRAG;
  	cork->base.length = 0;
  
diff --cc net/sched/sch_api.c
index 0038a1c44ee97,52529b7f8d963..7dffa9dce28b2
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@@ -1088,64 -1062,43 +1088,53 @@@ static struct Qdisc *qdisc_create(struc
  		netdev_info(dev, "Caught tx_queue_len zero misconfig\n");
  	}
  
 -	if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS])) == 0) {
 -		if (tca[TCA_STAB]) {
 -			stab = qdisc_get_stab(tca[TCA_STAB]);
 -			if (IS_ERR(stab)) {
 -				err = PTR_ERR(stab);
 -				goto err_out4;
 -			}
 -			rcu_assign_pointer(sch->stab, stab);
 -		}
 -		if (tca[TCA_RATE]) {
 -			seqcount_t *running;
 -
 -			err = -EOPNOTSUPP;
 -			if (sch->flags & TCQ_F_MQROOT)
 -				goto err_out4;
 -
 -			if ((sch->parent != TC_H_ROOT) &&
 -			    !(sch->flags & TCQ_F_INGRESS) &&
 -			    (!p || !(p->flags & TCQ_F_MQROOT)))
 -				running = qdisc_root_sleeping_running(sch);
 -			else
 -				running = &sch->running;
 -
 -			err = gen_new_estimator(&sch->bstats,
 -						sch->cpu_bstats,
 -						&sch->rate_est,
 -						NULL,
 -						running,
 -						tca[TCA_RATE]);
 -			if (err)
 -				goto err_out4;
 +	if (ops->init) {
 +		err = ops->init(sch, tca[TCA_OPTIONS], extack);
 +		if (err != 0)
 +			goto err_out5;
 +	}
 +
- 	if (qdisc_is_percpu_stats(sch)) {
- 		sch->cpu_bstats =
- 			netdev_alloc_pcpu_stats(struct gnet_stats_basic_cpu);
- 		if (!sch->cpu_bstats)
- 			goto err_out4;
- 
- 		sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue);
- 		if (!sch->cpu_qstats)
- 			goto err_out4;
- 	}
- 
 +	if (tca[TCA_STAB]) {
 +		stab = qdisc_get_stab(tca[TCA_STAB], extack);
 +		if (IS_ERR(stab)) {
 +			err = PTR_ERR(stab);
 +			goto err_out4;
  		}
 +		rcu_assign_pointer(sch->stab, stab);
 +	}
 +	if (tca[TCA_RATE]) {
 +		seqcount_t *running;
  
 -		qdisc_hash_add(sch, false);
 +		err = -EOPNOTSUPP;
 +		if (sch->flags & TCQ_F_MQROOT) {
 +			NL_SET_ERR_MSG(extack, "Cannot attach rate estimator to a multi-queue root qdisc");
 +			goto err_out4;
 +		}
  
 -		return sch;
 +		if (sch->parent != TC_H_ROOT &&
 +		    !(sch->flags & TCQ_F_INGRESS) &&
 +		    (!p || !(p->flags & TCQ_F_MQROOT)))
 +			running = qdisc_root_sleeping_running(sch);
 +		else
 +			running = &sch->running;
 +
 +		err = gen_new_estimator(&sch->bstats,
 +					sch->cpu_bstats,
 +					&sch->rate_est,
 +					NULL,
 +					running,
 +					tca[TCA_RATE]);
 +		if (err) {
 +			NL_SET_ERR_MSG(extack, "Failed to generate new estimator");
 +			goto err_out4;
 +		}
  	}
 +
 +	qdisc_hash_add(sch, false);
 +
 +	return sch;
 +
 +err_out5:
  	/* ops->init() failed, we call ->destroy() like qdisc_create_dflt() */
  	if (ops->destroy)
  		ops->destroy(sch);
diff --cc net/sched/sch_ingress.c
index 7ca2be20dd6fb,003e1b063447d..3372dd5e984da
--- a/net/sched/sch_ingress.c
+++ b/net/sched/sch_ingress.c
@@@ -78,13 -75,7 +77,7 @@@ static int ingress_init(struct Qdisc *s
  	q->block_info.chain_head_change = clsact_chain_head_change;
  	q->block_info.chain_head_change_priv = &q->miniqp;
  
- 	err = tcf_block_get_ext(&q->block, sch, &q->block_info, extack);
- 	if (err)
- 		return err;
- 
- 	sch->flags |= TCQ_F_CPUSTATS;
- 
- 	return 0;
 -	return tcf_block_get_ext(&q->block, sch, &q->block_info);
++	return tcf_block_get_ext(&q->block, sch, &q->block_info, extack);
  }
  
  static void ingress_destroy(struct Qdisc *sch)
@@@ -197,14 -186,7 +191,7 @@@ static int clsact_init(struct Qdisc *sc
  	q->egress_block_info.chain_head_change = clsact_chain_head_change;
  	q->egress_block_info.chain_head_change_priv = &q->miniqp_egress;
  
- 	err = tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info,
- 				extack);
- 	if (err)
- 		return err;
- 
- 	sch->flags |= TCQ_F_CPUSTATS;
- 
- 	return 0;
 -	return tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info);
++	return tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info, extack);
  }
  
  static void clsact_destroy(struct Qdisc *sch)