Skip to content

Commit 57012c5

Browse files
committed
Merge tag 'net-6.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni: "Including fixes from can, netfilter. Current release - regressions: - core: fix splice_to_socket() for O_NONBLOCK socket - af_unix: fix fortify_panic() in unix_bind_bsd(). - can: raw: fix lockdep issue in raw_release() Previous releases - regressions: - tcp: reduce chance of collisions in inet6_hashfn(). - netfilter: skip immediate deactivate in _PREPARE_ERROR - tipc: stop tipc crypto on failure in tipc_node_create - eth: igc: fix kernel panic during ndo_tx_timeout callback - eth: iavf: fix potential deadlock on allocation failure Previous releases - always broken: - ipv6: fix bug where deleting a mngtmpaddr can create a new temporary address - eth: ice: fix memory management in ice_ethtool_fdir.c - eth: hns3: fix the imp capability bit cannot exceed 32 bits issue - eth: vxlan: calculate correct header length for GPE - eth: stmmac: apply redundant write work around on 4.xx too" * tag 'net-6.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (49 commits) tipc: stop tipc crypto on failure in tipc_node_create af_unix: Terminate sun_path when bind()ing pathname socket. tipc: check return value of pskb_trim() benet: fix return value check in be_lancer_xmit_workarounds() virtio-net: fix race between set queues and probe net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64 splice, net: Fix splice_to_socket() for O_NONBLOCK socket net: fec: tx processing does not call XDP APIs if budget is 0 mptcp: more accurate NL event generation selftests: mptcp: join: only check for ip6tables if needed tools: ynl-gen: fix parse multi-attr enum attribute tools: ynl-gen: fix enum index in _decode_enum(..) netfilter: nf_tables: disallow rule addition to bound chain via NFTA_RULE_CHAIN_ID netfilter: nf_tables: skip immediate deactivate in _PREPARE_ERROR netfilter: nft_set_rbtree: fix overlap expiration walk igc: Fix Kernel Panic during ndo_tx_timeout callback net: dsa: qca8k: fix mdb add/del case with 0 VID net: dsa: qca8k: fix broken search_and_del net: dsa: qca8k: fix search_and_insert wrong handling of new rule net: dsa: qca8k: enable use_single_write for qca8xxx ...
2 parents bc16879 + de52e17 commit 57012c5

File tree

49 files changed

+522
-201
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+522
-201
lines changed

Documentation/networking/napi.rst

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,16 @@ argument - drivers can process completions for any number of Tx
6565
packets but should only process up to ``budget`` number of
6666
Rx packets. Rx processing is usually much more expensive.
6767

68-
In other words, it is recommended to ignore the budget argument when
69-
performing TX buffer reclamation to ensure that the reclamation is not
70-
arbitrarily bounded; however, it is required to honor the budget argument
71-
for RX processing.
68+
In other words for Rx processing the ``budget`` argument limits how many
69+
packets driver can process in a single poll. Rx specific APIs like page
70+
pool or XDP cannot be used at all when ``budget`` is 0.
71+
skb Tx processing should happen regardless of the ``budget``, but if
72+
the argument is 0 driver cannot call any XDP (or page pool) APIs.
7273

7374
.. warning::
7475

75-
The ``budget`` argument may be 0 if core tries to only process Tx completions
76-
and no Rx packets.
76+
The ``budget`` argument may be 0 if core tries to only process
77+
skb Tx completions and no Rx or XDP packets.
7778

7879
The poll method returns the amount of work done. If the driver still
7980
has outstanding work to do (e.g. ``budget`` was exhausted)

drivers/net/bonding/bond_main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,11 @@ static void bond_setup_by_slave(struct net_device *bond_dev,
15081508

15091509
memcpy(bond_dev->broadcast, slave_dev->broadcast,
15101510
slave_dev->addr_len);
1511+
1512+
if (slave_dev->flags & IFF_POINTOPOINT) {
1513+
bond_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
1514+
bond_dev->flags |= (IFF_POINTOPOINT | IFF_NOARP);
1515+
}
15111516
}
15121517

15131518
/* On bonding slaves other than the currently active slave, suppress

drivers/net/can/usb/gs_usb.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,8 @@ static int gs_can_close(struct net_device *netdev)
10301030
usb_kill_anchored_urbs(&dev->tx_submitted);
10311031
atomic_set(&dev->active_tx_urbs, 0);
10321032

1033+
dev->can.state = CAN_STATE_STOPPED;
1034+
10331035
/* reset the device */
10341036
rc = gs_cmd_reset(dev);
10351037
if (rc < 0)

drivers/net/dsa/qca/qca8k-8xxx.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,11 @@ static struct regmap_config qca8k_regmap_config = {
576576
.rd_table = &qca8k_readable_table,
577577
.disable_locking = true, /* Locking is handled by qca8k read/write */
578578
.cache_type = REGCACHE_NONE, /* Explicitly disable CACHE */
579-
.max_raw_read = 32, /* mgmt eth can read/write up to 8 registers at time */
580-
.max_raw_write = 32,
579+
.max_raw_read = 32, /* mgmt eth can read up to 8 registers at time */
580+
/* ATU regs suffer from a bug where some data are not correctly
581+
* written. Disable bulk write to correctly write ATU entry.
582+
*/
583+
.use_single_write = true,
581584
};
582585

583586
static int

drivers/net/dsa/qca/qca8k-common.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ void qca8k_fdb_flush(struct qca8k_priv *priv)
244244
}
245245

246246
static int qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask,
247-
const u8 *mac, u16 vid)
247+
const u8 *mac, u16 vid, u8 aging)
248248
{
249249
struct qca8k_fdb fdb = { 0 };
250250
int ret;
@@ -261,10 +261,12 @@ static int qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask,
261261
goto exit;
262262

263263
/* Rule exist. Delete first */
264-
if (!fdb.aging) {
264+
if (fdb.aging) {
265265
ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1);
266266
if (ret)
267267
goto exit;
268+
} else {
269+
fdb.aging = aging;
268270
}
269271

270272
/* Add port to fdb portmask */
@@ -291,6 +293,10 @@ static int qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask,
291293
if (ret < 0)
292294
goto exit;
293295

296+
ret = qca8k_fdb_read(priv, &fdb);
297+
if (ret < 0)
298+
goto exit;
299+
294300
/* Rule doesn't exist. Why delete? */
295301
if (!fdb.aging) {
296302
ret = -EINVAL;
@@ -810,7 +816,11 @@ int qca8k_port_mdb_add(struct dsa_switch *ds, int port,
810816
const u8 *addr = mdb->addr;
811817
u16 vid = mdb->vid;
812818

813-
return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid);
819+
if (!vid)
820+
vid = QCA8K_PORT_VID_DEF;
821+
822+
return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid,
823+
QCA8K_ATU_STATUS_STATIC);
814824
}
815825

816826
int qca8k_port_mdb_del(struct dsa_switch *ds, int port,
@@ -821,6 +831,9 @@ int qca8k_port_mdb_del(struct dsa_switch *ds, int port,
821831
const u8 *addr = mdb->addr;
822832
u16 vid = mdb->vid;
823833

834+
if (!vid)
835+
vid = QCA8K_PORT_VID_DEF;
836+
824837
return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid);
825838
}
826839

drivers/net/ethernet/atheros/atl1c/atl1c_main.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2094,8 +2094,11 @@ static int atl1c_tso_csum(struct atl1c_adapter *adapter,
20942094
real_len = (((unsigned char *)ip_hdr(skb) - skb->data)
20952095
+ ntohs(ip_hdr(skb)->tot_len));
20962096

2097-
if (real_len < skb->len)
2098-
pskb_trim(skb, real_len);
2097+
if (real_len < skb->len) {
2098+
err = pskb_trim(skb, real_len);
2099+
if (err)
2100+
return err;
2101+
}
20992102

21002103
hdr_len = skb_tcp_all_headers(skb);
21012104
if (unlikely(skb->len == hdr_len)) {

drivers/net/ethernet/atheros/atl1e/atl1e_main.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,8 +1641,11 @@ static int atl1e_tso_csum(struct atl1e_adapter *adapter,
16411641
real_len = (((unsigned char *)ip_hdr(skb) - skb->data)
16421642
+ ntohs(ip_hdr(skb)->tot_len));
16431643

1644-
if (real_len < skb->len)
1645-
pskb_trim(skb, real_len);
1644+
if (real_len < skb->len) {
1645+
err = pskb_trim(skb, real_len);
1646+
if (err)
1647+
return err;
1648+
}
16461649

16471650
hdr_len = skb_tcp_all_headers(skb);
16481651
if (unlikely(skb->len == hdr_len)) {

drivers/net/ethernet/atheros/atlx/atl1.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,8 +2113,11 @@ static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb,
21132113

21142114
real_len = (((unsigned char *)iph - skb->data) +
21152115
ntohs(iph->tot_len));
2116-
if (real_len < skb->len)
2117-
pskb_trim(skb, real_len);
2116+
if (real_len < skb->len) {
2117+
err = pskb_trim(skb, real_len);
2118+
if (err)
2119+
return err;
2120+
}
21182121
hdr_len = skb_tcp_all_headers(skb);
21192122
if (skb->len == hdr_len) {
21202123
iph->check = 0;

drivers/net/ethernet/emulex/benet/be_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1138,7 +1138,8 @@ static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter,
11381138
(lancer_chip(adapter) || BE3_chip(adapter) ||
11391139
skb_vlan_tag_present(skb)) && is_ipv4_pkt(skb)) {
11401140
ip = (struct iphdr *)ip_hdr(skb);
1141-
pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len));
1141+
if (unlikely(pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len))))
1142+
goto tx_drop;
11421143
}
11431144

11441145
/* If vlan tag is already inlined in the packet, skip HW VLAN

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,7 @@ fec_enet_hwtstamp(struct fec_enet_private *fep, unsigned ts,
13721372
}
13731373

13741374
static void
1375-
fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
1375+
fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
13761376
{
13771377
struct fec_enet_private *fep;
13781378
struct xdp_frame *xdpf;
@@ -1416,6 +1416,14 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
14161416
if (!skb)
14171417
goto tx_buf_done;
14181418
} else {
1419+
/* Tx processing cannot call any XDP (or page pool) APIs if
1420+
* the "budget" is 0. Because NAPI is called with budget of
1421+
* 0 (such as netpoll) indicates we may be in an IRQ context,
1422+
* however, we can't use the page pool from IRQ context.
1423+
*/
1424+
if (unlikely(!budget))
1425+
break;
1426+
14191427
xdpf = txq->tx_buf[index].xdp;
14201428
if (bdp->cbd_bufaddr)
14211429
dma_unmap_single(&fep->pdev->dev,
@@ -1508,14 +1516,14 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
15081516
writel(0, txq->bd.reg_desc_active);
15091517
}
15101518

1511-
static void fec_enet_tx(struct net_device *ndev)
1519+
static void fec_enet_tx(struct net_device *ndev, int budget)
15121520
{
15131521
struct fec_enet_private *fep = netdev_priv(ndev);
15141522
int i;
15151523

15161524
/* Make sure that AVB queues are processed first. */
15171525
for (i = fep->num_tx_queues - 1; i >= 0; i--)
1518-
fec_enet_tx_queue(ndev, i);
1526+
fec_enet_tx_queue(ndev, i, budget);
15191527
}
15201528

15211529
static void fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq,
@@ -1858,7 +1866,7 @@ static int fec_enet_rx_napi(struct napi_struct *napi, int budget)
18581866

18591867
do {
18601868
done += fec_enet_rx(ndev, budget - done);
1861-
fec_enet_tx(ndev);
1869+
fec_enet_tx(ndev, budget);
18621870
} while ((done < budget) && fec_enet_collect_events(fep));
18631871

18641872
if (done < budget) {
@@ -3916,6 +3924,8 @@ static int fec_enet_xdp_xmit(struct net_device *dev,
39163924

39173925
__netif_tx_lock(nq, cpu);
39183926

3927+
/* Avoid tx timeout as XDP shares the queue with kernel stack */
3928+
txq_trans_cond_update(nq);
39193929
for (i = 0; i < num_frames; i++) {
39203930
if (fec_enet_txq_xmit_frame(fep, txq, frames[i]) < 0)
39213931
break;

0 commit comments

Comments
 (0)