mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Merge in late fixes in preparation for the net-next PR. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -252,6 +252,12 @@ static int iavf_ptp_gettimex64(struct ptp_clock_info *info,
|
|||||||
return iavf_read_phc_indirect(adapter, ts, sts);
|
return iavf_read_phc_indirect(adapter, ts, sts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int iavf_ptp_settime64(struct ptp_clock_info *info,
|
||||||
|
const struct timespec64 *ts)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iavf_ptp_cache_phc_time - Cache PHC time for performing timestamp extension
|
* iavf_ptp_cache_phc_time - Cache PHC time for performing timestamp extension
|
||||||
* @adapter: private adapter structure
|
* @adapter: private adapter structure
|
||||||
@@ -320,6 +326,7 @@ static int iavf_ptp_register_clock(struct iavf_adapter *adapter)
|
|||||||
KBUILD_MODNAME, dev_name(dev));
|
KBUILD_MODNAME, dev_name(dev));
|
||||||
ptp_info->owner = THIS_MODULE;
|
ptp_info->owner = THIS_MODULE;
|
||||||
ptp_info->gettimex64 = iavf_ptp_gettimex64;
|
ptp_info->gettimex64 = iavf_ptp_gettimex64;
|
||||||
|
ptp_info->settime64 = iavf_ptp_settime64;
|
||||||
ptp_info->do_aux_work = iavf_ptp_do_aux_work;
|
ptp_info->do_aux_work = iavf_ptp_do_aux_work;
|
||||||
|
|
||||||
clock = ptp_clock_register(ptp_info, dev);
|
clock = ptp_clock_register(ptp_info, dev);
|
||||||
|
|||||||
@@ -369,7 +369,7 @@ int aqr_firmware_load(struct phy_device *phydev)
|
|||||||
* assume that, and load a new image.
|
* assume that, and load a new image.
|
||||||
*/
|
*/
|
||||||
ret = aqr_firmware_load_nvmem(phydev);
|
ret = aqr_firmware_load_nvmem(phydev);
|
||||||
if (!ret)
|
if (ret == -EPROBE_DEFER || !ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = aqr_firmware_load_fs(phydev);
|
ret = aqr_firmware_load_fs(phydev);
|
||||||
|
|||||||
@@ -2349,7 +2349,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|||||||
int addr_family;
|
int addr_family;
|
||||||
__u8 tos, ttl;
|
__u8 tos, ttl;
|
||||||
int ifindex;
|
int ifindex;
|
||||||
int err;
|
int err = 0;
|
||||||
u32 flags = vxlan->cfg.flags;
|
u32 flags = vxlan->cfg.flags;
|
||||||
bool use_cache;
|
bool use_cache;
|
||||||
bool udp_sum = false;
|
bool udp_sum = false;
|
||||||
@@ -2454,12 +2454,18 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
if (addr_family == AF_INET) {
|
if (addr_family == AF_INET) {
|
||||||
struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);
|
struct vxlan_sock *sock4;
|
||||||
u16 ipcb_flags = 0;
|
u16 ipcb_flags = 0;
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
__be16 df = 0;
|
__be16 df = 0;
|
||||||
__be32 saddr;
|
__be32 saddr;
|
||||||
|
|
||||||
|
sock4 = rcu_dereference(vxlan->vn4_sock);
|
||||||
|
if (unlikely(!sock4)) {
|
||||||
|
reason = SKB_DROP_REASON_DEV_READY;
|
||||||
|
goto tx_error;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ifindex)
|
if (!ifindex)
|
||||||
ifindex = sock4->sock->sk->sk_bound_dev_if;
|
ifindex = sock4->sock->sk->sk_bound_dev_if;
|
||||||
|
|
||||||
@@ -2534,10 +2540,16 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|||||||
ipcb_flags);
|
ipcb_flags);
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
} else {
|
} else {
|
||||||
struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
|
struct vxlan_sock *sock6;
|
||||||
struct in6_addr saddr;
|
struct in6_addr saddr;
|
||||||
u16 ip6cb_flags = 0;
|
u16 ip6cb_flags = 0;
|
||||||
|
|
||||||
|
sock6 = rcu_dereference(vxlan->vn6_sock);
|
||||||
|
if (unlikely(!sock6)) {
|
||||||
|
reason = SKB_DROP_REASON_DEV_READY;
|
||||||
|
goto tx_error;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ifindex)
|
if (!ifindex)
|
||||||
ifindex = sock6->sock->sk->sk_bound_dev_if;
|
ifindex = sock6->sock->sk->sk_bound_dev_if;
|
||||||
|
|
||||||
|
|||||||
@@ -554,6 +554,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
skb_queue_head_init(&np->skb_pool);
|
skb_queue_head_init(&np->skb_pool);
|
||||||
|
INIT_WORK(&np->refill_wq, refill_skbs_work_handler);
|
||||||
|
|
||||||
if (ndev->priv_flags & IFF_DISABLE_NETPOLL) {
|
if (ndev->priv_flags & IFF_DISABLE_NETPOLL) {
|
||||||
np_err(np, "%s doesn't support polling, aborting\n",
|
np_err(np, "%s doesn't support polling, aborting\n",
|
||||||
@@ -591,7 +592,6 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
|||||||
|
|
||||||
/* fill up the skb queue */
|
/* fill up the skb queue */
|
||||||
refill_skbs(np);
|
refill_skbs(np);
|
||||||
INIT_WORK(&np->refill_wq, refill_skbs_work_handler);
|
|
||||||
|
|
||||||
/* last thing to do is link it to the net device structure */
|
/* last thing to do is link it to the net device structure */
|
||||||
rcu_assign_pointer(ndev->npinfo, npinfo);
|
rcu_assign_pointer(ndev->npinfo, npinfo);
|
||||||
|
|||||||
@@ -1591,7 +1591,6 @@ static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free)
|
|||||||
|
|
||||||
qdisc_drop_reason(skb, sch, to_free, SKB_DROP_REASON_QDISC_OVERLIMIT);
|
qdisc_drop_reason(skb, sch, to_free, SKB_DROP_REASON_QDISC_OVERLIMIT);
|
||||||
sch->q.qlen--;
|
sch->q.qlen--;
|
||||||
qdisc_tree_reduce_backlog(sch, 1, len);
|
|
||||||
|
|
||||||
cake_heapify(q, 0);
|
cake_heapify(q, 0);
|
||||||
|
|
||||||
@@ -1737,14 +1736,14 @@ static void cake_reconfigure(struct Qdisc *sch);
|
|||||||
static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||||
struct sk_buff **to_free)
|
struct sk_buff **to_free)
|
||||||
{
|
{
|
||||||
|
u32 idx, tin, prev_qlen, prev_backlog, drop_id;
|
||||||
struct cake_sched_data *q = qdisc_priv(sch);
|
struct cake_sched_data *q = qdisc_priv(sch);
|
||||||
int len = qdisc_pkt_len(skb);
|
int len = qdisc_pkt_len(skb), ret;
|
||||||
int ret;
|
|
||||||
struct sk_buff *ack = NULL;
|
struct sk_buff *ack = NULL;
|
||||||
ktime_t now = ktime_get();
|
ktime_t now = ktime_get();
|
||||||
struct cake_tin_data *b;
|
struct cake_tin_data *b;
|
||||||
struct cake_flow *flow;
|
struct cake_flow *flow;
|
||||||
u32 idx, tin;
|
bool same_flow = false;
|
||||||
|
|
||||||
/* choose flow to insert into */
|
/* choose flow to insert into */
|
||||||
idx = cake_classify(sch, &b, skb, q->flow_mode, &ret);
|
idx = cake_classify(sch, &b, skb, q->flow_mode, &ret);
|
||||||
@@ -1818,6 +1817,8 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||||||
consume_skb(skb);
|
consume_skb(skb);
|
||||||
} else {
|
} else {
|
||||||
/* not splitting */
|
/* not splitting */
|
||||||
|
int ack_pkt_len = 0;
|
||||||
|
|
||||||
cobalt_set_enqueue_time(skb, now);
|
cobalt_set_enqueue_time(skb, now);
|
||||||
get_cobalt_cb(skb)->adjusted_len = cake_overhead(q, skb);
|
get_cobalt_cb(skb)->adjusted_len = cake_overhead(q, skb);
|
||||||
flow_queue_add(flow, skb);
|
flow_queue_add(flow, skb);
|
||||||
@@ -1828,13 +1829,13 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||||||
if (ack) {
|
if (ack) {
|
||||||
b->ack_drops++;
|
b->ack_drops++;
|
||||||
sch->qstats.drops++;
|
sch->qstats.drops++;
|
||||||
b->bytes += qdisc_pkt_len(ack);
|
ack_pkt_len = qdisc_pkt_len(ack);
|
||||||
len -= qdisc_pkt_len(ack);
|
b->bytes += ack_pkt_len;
|
||||||
q->buffer_used += skb->truesize - ack->truesize;
|
q->buffer_used += skb->truesize - ack->truesize;
|
||||||
if (q->rate_flags & CAKE_FLAG_INGRESS)
|
if (q->rate_flags & CAKE_FLAG_INGRESS)
|
||||||
cake_advance_shaper(q, b, ack, now, true);
|
cake_advance_shaper(q, b, ack, now, true);
|
||||||
|
|
||||||
qdisc_tree_reduce_backlog(sch, 1, qdisc_pkt_len(ack));
|
qdisc_tree_reduce_backlog(sch, 1, ack_pkt_len);
|
||||||
consume_skb(ack);
|
consume_skb(ack);
|
||||||
} else {
|
} else {
|
||||||
sch->q.qlen++;
|
sch->q.qlen++;
|
||||||
@@ -1843,11 +1844,11 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||||||
|
|
||||||
/* stats */
|
/* stats */
|
||||||
b->packets++;
|
b->packets++;
|
||||||
b->bytes += len;
|
b->bytes += len - ack_pkt_len;
|
||||||
b->backlogs[idx] += len;
|
b->backlogs[idx] += len - ack_pkt_len;
|
||||||
b->tin_backlog += len;
|
b->tin_backlog += len - ack_pkt_len;
|
||||||
sch->qstats.backlog += len;
|
sch->qstats.backlog += len - ack_pkt_len;
|
||||||
q->avg_window_bytes += len;
|
q->avg_window_bytes += len - ack_pkt_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (q->overflow_timeout)
|
if (q->overflow_timeout)
|
||||||
@@ -1922,24 +1923,29 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||||||
if (q->buffer_used > q->buffer_max_used)
|
if (q->buffer_used > q->buffer_max_used)
|
||||||
q->buffer_max_used = q->buffer_used;
|
q->buffer_max_used = q->buffer_used;
|
||||||
|
|
||||||
if (q->buffer_used > q->buffer_limit) {
|
if (q->buffer_used <= q->buffer_limit)
|
||||||
bool same_flow = false;
|
return NET_XMIT_SUCCESS;
|
||||||
u32 dropped = 0;
|
|
||||||
u32 drop_id;
|
|
||||||
|
|
||||||
while (q->buffer_used > q->buffer_limit) {
|
prev_qlen = sch->q.qlen;
|
||||||
dropped++;
|
prev_backlog = sch->qstats.backlog;
|
||||||
drop_id = cake_drop(sch, to_free);
|
|
||||||
|
|
||||||
if ((drop_id >> 16) == tin &&
|
while (q->buffer_used > q->buffer_limit) {
|
||||||
(drop_id & 0xFFFF) == idx)
|
drop_id = cake_drop(sch, to_free);
|
||||||
same_flow = true;
|
if ((drop_id >> 16) == tin &&
|
||||||
}
|
(drop_id & 0xFFFF) == idx)
|
||||||
b->drop_overlimit += dropped;
|
same_flow = true;
|
||||||
|
|
||||||
if (same_flow)
|
|
||||||
return NET_XMIT_CN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prev_qlen -= sch->q.qlen;
|
||||||
|
prev_backlog -= sch->qstats.backlog;
|
||||||
|
b->drop_overlimit += prev_qlen;
|
||||||
|
|
||||||
|
if (same_flow) {
|
||||||
|
qdisc_tree_reduce_backlog(sch, prev_qlen - 1,
|
||||||
|
prev_backlog - len);
|
||||||
|
return NET_XMIT_CN;
|
||||||
|
}
|
||||||
|
qdisc_tree_reduce_backlog(sch, prev_qlen, prev_backlog);
|
||||||
return NET_XMIT_SUCCESS;
|
return NET_XMIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ check_connection()
|
|||||||
local message=${3}
|
local message=${3}
|
||||||
RET=0
|
RET=0
|
||||||
|
|
||||||
|
sleep 0.25
|
||||||
ip netns exec ${ns} ping ${target} -c 4 -i 0.1 &>/dev/null
|
ip netns exec ${ns} ping ${target} -c 4 -i 0.1 &>/dev/null
|
||||||
check_err $? "ping failed"
|
check_err $? "ping failed"
|
||||||
log_test "${bond_mode}/${xvlan_type}_${xvlan_mode}: ${message}"
|
log_test "${bond_mode}/${xvlan_type}_${xvlan_mode}: ${message}"
|
||||||
|
|||||||
@@ -1005,5 +1005,33 @@
|
|||||||
"teardown": [
|
"teardown": [
|
||||||
"$TC qdisc del dev $DUMMY clsact"
|
"$TC qdisc del dev $DUMMY clsact"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4366",
|
||||||
|
"name": "CAKE with QFQ Parent - CAKE enqueue with packets dropping",
|
||||||
|
"category": [
|
||||||
|
"qdisc",
|
||||||
|
"cake",
|
||||||
|
"netem"
|
||||||
|
],
|
||||||
|
"plugins": {
|
||||||
|
"requires": "nsPlugin"
|
||||||
|
},
|
||||||
|
"setup":[
|
||||||
|
"$TC qdisc add dev $DUMMY handle 1: root qfq",
|
||||||
|
"$TC class add dev $DUMMY parent 1: classid 1:1 qfq maxpkt 1024",
|
||||||
|
"$TC qdisc add dev $DUMMY parent 1:1 handle 2: cake memlimit 9",
|
||||||
|
"$TC filter add dev $DUMMY protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1",
|
||||||
|
"ping -I$DUMMY -f -c1 -s64 -W1 10.10.10.1 || true",
|
||||||
|
"$TC qdisc replace dev $DUMMY parent 1:1 handle 3: netem delay 0ms"
|
||||||
|
],
|
||||||
|
"cmdUnderTest": "ping -I$DUMMY -f -c1 -s64 -W1 10.10.10.1 || true",
|
||||||
|
"expExitCode": "0",
|
||||||
|
"verifyCmd": "$TC -s qdisc show dev $DUMMY",
|
||||||
|
"matchPattern": "qdisc qfq 1:",
|
||||||
|
"matchCount": "1",
|
||||||
|
"teardown": [
|
||||||
|
"$TC qdisc del dev $DUMMY handle 1: root"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user