Skip to content

Commit 6172a51

Browse files
committed
Merge tag 'net-6.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni: "Including fixes from bpf and wifi. Current release - regressions: - neighbour: fix __randomize_layout crash in struct neighbour - r8169: fix deadlock on RTL8125 in jumbo mtu mode Previous releases - regressions: - wifi: - mac80211: fix warning at station removal time - cfg80211: fix CQM for non-range use - tools: ynl-gen: fix unexpected response handling - octeontx2-af: fix possible buffer overflow - dpaa2: recycle the RX buffer only after all processing done - rswitch: fix missing dev_kfree_skb_any() in error path Previous releases - always broken: - ipv4: fix uaf issue when receiving igmp query packet - wifi: mac80211: fix debugfs deadlock at device removal time - bpf: - sockmap: af_unix stream sockets need to hold ref for pair sock - netdevsim: don't accept device bound programs - selftests: fix a char signedness issue - dsa: mv88e6xxx: fix marvell 6350 probe crash - octeontx2-pf: restore TC ingress police rules when interface is up - wangxun: fix memory leak on msix entry - ravb: keep reverse order of operations in ravb_remove()" * tag 'net-6.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (51 commits) net: ravb: Keep reverse order of operations in ravb_remove() net: ravb: Stop DMA in case of failures on ravb_open() net: ravb: Start TX queues after HW initialization succeeded net: ravb: Make write access to CXR35 first before accessing other EMAC registers net: ravb: Use pm_runtime_resume_and_get() net: ravb: Check return value of reset_control_deassert() net: libwx: fix memory leak on msix entry ice: Fix VF Reset paths when interface in a failed over aggregate bpf, sockmap: Add af_unix test with both sockets in map bpf, sockmap: af_unix stream sockets need to hold ref for pair sock tools: ynl-gen: always construct struct ynl_req_state ethtool: don't propagate EOPNOTSUPP from dumps ravb: Fix races between ravb_tx_timeout_work() and net related ops r8169: prevent potential deadlock in rtl8169_close r8169: fix deadlock on RTL8125 in jumbo mtu mode neighbour: Fix __randomize_layout crash in struct neighbour octeontx2-pf: Restore TC ingress police rules when interface is up octeontx2-pf: Fix adding mbox work queue entry when num_vfs > 64 net: stmmac: xgmac: Disable FPE MMC interrupts octeontx2-af: Fix possible buffer overflow ...
2 parents e8f6020 + 777f245 commit 6172a51

File tree

60 files changed

+1128
-337
lines changed

Some content is hidden

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

60 files changed

+1128
-337
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,18 @@ static void mv88e6250_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
577577
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100;
578578
}
579579

580+
static void mv88e6351_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
581+
struct phylink_config *config)
582+
{
583+
unsigned long *supported = config->supported_interfaces;
584+
585+
/* Translate the default cmode */
586+
mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
587+
588+
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
589+
MAC_1000FD;
590+
}
591+
580592
static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
581593
{
582594
u16 reg, val;
@@ -3880,7 +3892,8 @@ static int mv88e6xxx_port_setup(struct dsa_switch *ds, int port)
38803892
struct mv88e6xxx_chip *chip = ds->priv;
38813893
int err;
38823894

3883-
if (chip->info->ops->pcs_ops->pcs_init) {
3895+
if (chip->info->ops->pcs_ops &&
3896+
chip->info->ops->pcs_ops->pcs_init) {
38843897
err = chip->info->ops->pcs_ops->pcs_init(chip, port);
38853898
if (err)
38863899
return err;
@@ -3895,7 +3908,8 @@ static void mv88e6xxx_port_teardown(struct dsa_switch *ds, int port)
38953908

38963909
mv88e6xxx_teardown_devlink_regions_port(ds, port);
38973910

3898-
if (chip->info->ops->pcs_ops->pcs_teardown)
3911+
if (chip->info->ops->pcs_ops &&
3912+
chip->info->ops->pcs_ops->pcs_teardown)
38993913
chip->info->ops->pcs_ops->pcs_teardown(chip, port);
39003914
}
39013915

@@ -4340,7 +4354,7 @@ static const struct mv88e6xxx_ops mv88e6171_ops = {
43404354
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
43414355
.stu_getnext = mv88e6352_g1_stu_getnext,
43424356
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
4343-
.phylink_get_caps = mv88e6185_phylink_get_caps,
4357+
.phylink_get_caps = mv88e6351_phylink_get_caps,
43444358
};
43454359

43464360
static const struct mv88e6xxx_ops mv88e6172_ops = {
@@ -4440,7 +4454,7 @@ static const struct mv88e6xxx_ops mv88e6175_ops = {
44404454
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
44414455
.stu_getnext = mv88e6352_g1_stu_getnext,
44424456
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
4443-
.phylink_get_caps = mv88e6185_phylink_get_caps,
4457+
.phylink_get_caps = mv88e6351_phylink_get_caps,
44444458
};
44454459

44464460
static const struct mv88e6xxx_ops mv88e6176_ops = {
@@ -5069,7 +5083,7 @@ static const struct mv88e6xxx_ops mv88e6350_ops = {
50695083
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
50705084
.stu_getnext = mv88e6352_g1_stu_getnext,
50715085
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
5072-
.phylink_get_caps = mv88e6185_phylink_get_caps,
5086+
.phylink_get_caps = mv88e6351_phylink_get_caps,
50735087
};
50745088

50755089
static const struct mv88e6xxx_ops mv88e6351_ops = {
@@ -5117,7 +5131,7 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
51175131
.stu_loadpurge = mv88e6352_g1_stu_loadpurge,
51185132
.avb_ops = &mv88e6352_avb_ops,
51195133
.ptp_ops = &mv88e6352_ptp_ops,
5120-
.phylink_get_caps = mv88e6185_phylink_get_caps,
5134+
.phylink_get_caps = mv88e6351_phylink_get_caps,
51215135
};
51225136

51235137
static const struct mv88e6xxx_ops mv88e6352_ops = {

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,6 @@ struct sk_buff *dpaa2_eth_alloc_skb(struct dpaa2_eth_priv *priv,
516516

517517
memcpy(skb->data, fd_vaddr + fd_offset, fd_length);
518518

519-
dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd));
520-
521519
return skb;
522520
}
523521

@@ -589,6 +587,7 @@ void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
589587
struct rtnl_link_stats64 *percpu_stats;
590588
struct dpaa2_eth_drv_stats *percpu_extras;
591589
struct device *dev = priv->net_dev->dev.parent;
590+
bool recycle_rx_buf = false;
592591
void *buf_data;
593592
u32 xdp_act;
594593

@@ -618,6 +617,8 @@ void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
618617
dma_unmap_page(dev, addr, priv->rx_buf_size,
619618
DMA_BIDIRECTIONAL);
620619
skb = dpaa2_eth_build_linear_skb(ch, fd, vaddr);
620+
} else {
621+
recycle_rx_buf = true;
621622
}
622623
} else if (fd_format == dpaa2_fd_sg) {
623624
WARN_ON(priv->xdp_prog);
@@ -637,6 +638,9 @@ void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
637638
goto err_build_skb;
638639

639640
dpaa2_eth_receive_skb(priv, ch, fd, vaddr, fq, percpu_stats, skb);
641+
642+
if (recycle_rx_buf)
643+
dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd));
640644
return;
641645

642646
err_build_skb:
@@ -1073,14 +1077,12 @@ static int dpaa2_eth_build_single_fd(struct dpaa2_eth_priv *priv,
10731077
dma_addr_t addr;
10741078

10751079
buffer_start = skb->data - dpaa2_eth_needed_headroom(skb);
1076-
1077-
/* If there's enough room to align the FD address, do it.
1078-
* It will help hardware optimize accesses.
1079-
*/
10801080
aligned_start = PTR_ALIGN(buffer_start - DPAA2_ETH_TX_BUF_ALIGN,
10811081
DPAA2_ETH_TX_BUF_ALIGN);
10821082
if (aligned_start >= skb->head)
10831083
buffer_start = aligned_start;
1084+
else
1085+
return -ENOMEM;
10841086

10851087
/* Store a backpointer to the skb at the beginning of the buffer
10861088
* (in the private data area) such that we can release it
@@ -4967,6 +4969,8 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
49674969
if (err)
49684970
goto err_dl_port_add;
49694971

4972+
net_dev->needed_headroom = DPAA2_ETH_SWA_SIZE + DPAA2_ETH_TX_BUF_ALIGN;
4973+
49704974
err = register_netdev(net_dev);
49714975
if (err < 0) {
49724976
dev_err(dev, "register_netdev() failed\n");

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ static inline bool dpaa2_eth_rx_pause_enabled(u64 link_options)
740740

741741
static inline unsigned int dpaa2_eth_needed_headroom(struct sk_buff *skb)
742742
{
743-
unsigned int headroom = DPAA2_ETH_SWA_SIZE;
743+
unsigned int headroom = DPAA2_ETH_SWA_SIZE + DPAA2_ETH_TX_BUF_ALIGN;
744744

745745
/* If we don't have an skb (e.g. XDP buffer), we only need space for
746746
* the software annotation area

drivers/net/ethernet/intel/ice/ice_lag.c

Lines changed: 72 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,50 @@ ice_lag_move_vf_node_tc(struct ice_lag *lag, u8 oldport, u8 newport,
569569
dev_dbg(dev, "Problem restarting traffic for LAG node move\n");
570570
}
571571

572+
/**
573+
* ice_lag_build_netdev_list - populate the lag struct's netdev list
574+
* @lag: local lag struct
575+
* @ndlist: pointer to netdev list to populate
576+
*/
577+
static void ice_lag_build_netdev_list(struct ice_lag *lag,
578+
struct ice_lag_netdev_list *ndlist)
579+
{
580+
struct ice_lag_netdev_list *nl;
581+
struct net_device *tmp_nd;
582+
583+
INIT_LIST_HEAD(&ndlist->node);
584+
rcu_read_lock();
585+
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
586+
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
587+
if (!nl)
588+
break;
589+
590+
nl->netdev = tmp_nd;
591+
list_add(&nl->node, &ndlist->node);
592+
}
593+
rcu_read_unlock();
594+
lag->netdev_head = &ndlist->node;
595+
}
596+
597+
/**
598+
* ice_lag_destroy_netdev_list - free lag struct's netdev list
599+
* @lag: pointer to local lag struct
600+
* @ndlist: pointer to lag struct netdev list
601+
*/
602+
static void ice_lag_destroy_netdev_list(struct ice_lag *lag,
603+
struct ice_lag_netdev_list *ndlist)
604+
{
605+
struct ice_lag_netdev_list *entry, *n;
606+
607+
rcu_read_lock();
608+
list_for_each_entry_safe(entry, n, &ndlist->node, node) {
609+
list_del(&entry->node);
610+
kfree(entry);
611+
}
612+
rcu_read_unlock();
613+
lag->netdev_head = NULL;
614+
}
615+
572616
/**
573617
* ice_lag_move_single_vf_nodes - Move Tx scheduling nodes for single VF
574618
* @lag: primary interface LAG struct
@@ -597,7 +641,6 @@ ice_lag_move_single_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport,
597641
void ice_lag_move_new_vf_nodes(struct ice_vf *vf)
598642
{
599643
struct ice_lag_netdev_list ndlist;
600-
struct list_head *tmp, *n;
601644
u8 pri_port, act_port;
602645
struct ice_lag *lag;
603646
struct ice_vsi *vsi;
@@ -621,38 +664,15 @@ void ice_lag_move_new_vf_nodes(struct ice_vf *vf)
621664
pri_port = pf->hw.port_info->lport;
622665
act_port = lag->active_port;
623666

624-
if (lag->upper_netdev) {
625-
struct ice_lag_netdev_list *nl;
626-
struct net_device *tmp_nd;
627-
628-
INIT_LIST_HEAD(&ndlist.node);
629-
rcu_read_lock();
630-
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
631-
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
632-
if (!nl)
633-
break;
634-
635-
nl->netdev = tmp_nd;
636-
list_add(&nl->node, &ndlist.node);
637-
}
638-
rcu_read_unlock();
639-
}
640-
641-
lag->netdev_head = &ndlist.node;
667+
if (lag->upper_netdev)
668+
ice_lag_build_netdev_list(lag, &ndlist);
642669

643670
if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) &&
644671
lag->bonded && lag->primary && pri_port != act_port &&
645672
!list_empty(lag->netdev_head))
646673
ice_lag_move_single_vf_nodes(lag, pri_port, act_port, vsi->idx);
647674

648-
list_for_each_safe(tmp, n, &ndlist.node) {
649-
struct ice_lag_netdev_list *entry;
650-
651-
entry = list_entry(tmp, struct ice_lag_netdev_list, node);
652-
list_del(&entry->node);
653-
kfree(entry);
654-
}
655-
lag->netdev_head = NULL;
675+
ice_lag_destroy_netdev_list(lag, &ndlist);
656676

657677
new_vf_unlock:
658678
mutex_unlock(&pf->lag_mutex);
@@ -679,6 +699,29 @@ static void ice_lag_move_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport)
679699
ice_lag_move_single_vf_nodes(lag, oldport, newport, i);
680700
}
681701

702+
/**
703+
* ice_lag_move_vf_nodes_cfg - move vf nodes outside LAG netdev event context
704+
* @lag: local lag struct
705+
* @src_prt: lport value for source port
706+
* @dst_prt: lport value for destination port
707+
*
708+
* This function is used to move nodes during an out-of-netdev-event situation,
709+
* primarily when the driver needs to reconfigure or recreate resources.
710+
*
711+
* Must be called while holding the lag_mutex to avoid lag events from
712+
* processing while out-of-sync moves are happening. Also, paired moves,
713+
* such as used in a reset flow, should both be called under the same mutex
714+
* lock to avoid changes between start of reset and end of reset.
715+
*/
716+
void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt)
717+
{
718+
struct ice_lag_netdev_list ndlist;
719+
720+
ice_lag_build_netdev_list(lag, &ndlist);
721+
ice_lag_move_vf_nodes(lag, src_prt, dst_prt);
722+
ice_lag_destroy_netdev_list(lag, &ndlist);
723+
}
724+
682725
#define ICE_LAG_SRIOV_CP_RECIPE 10
683726
#define ICE_LAG_SRIOV_TRAIN_PKT_LEN 16
684727

@@ -2051,7 +2094,6 @@ void ice_lag_rebuild(struct ice_pf *pf)
20512094
{
20522095
struct ice_lag_netdev_list ndlist;
20532096
struct ice_lag *lag, *prim_lag;
2054-
struct list_head *tmp, *n;
20552097
u8 act_port, loc_port;
20562098

20572099
if (!pf->lag || !pf->lag->bonded)
@@ -2063,21 +2105,7 @@ void ice_lag_rebuild(struct ice_pf *pf)
20632105
if (lag->primary) {
20642106
prim_lag = lag;
20652107
} else {
2066-
struct ice_lag_netdev_list *nl;
2067-
struct net_device *tmp_nd;
2068-
2069-
INIT_LIST_HEAD(&ndlist.node);
2070-
rcu_read_lock();
2071-
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
2072-
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
2073-
if (!nl)
2074-
break;
2075-
2076-
nl->netdev = tmp_nd;
2077-
list_add(&nl->node, &ndlist.node);
2078-
}
2079-
rcu_read_unlock();
2080-
lag->netdev_head = &ndlist.node;
2108+
ice_lag_build_netdev_list(lag, &ndlist);
20812109
prim_lag = ice_lag_find_primary(lag);
20822110
}
20832111

@@ -2107,13 +2135,7 @@ void ice_lag_rebuild(struct ice_pf *pf)
21072135

21082136
ice_clear_rdma_cap(pf);
21092137
lag_rebuild_out:
2110-
list_for_each_safe(tmp, n, &ndlist.node) {
2111-
struct ice_lag_netdev_list *entry;
2112-
2113-
entry = list_entry(tmp, struct ice_lag_netdev_list, node);
2114-
list_del(&entry->node);
2115-
kfree(entry);
2116-
}
2138+
ice_lag_destroy_netdev_list(lag, &ndlist);
21172139
mutex_unlock(&pf->lag_mutex);
21182140
}
21192141

drivers/net/ethernet/intel/ice/ice_lag.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,5 @@ int ice_init_lag(struct ice_pf *pf);
6565
void ice_deinit_lag(struct ice_pf *pf);
6666
void ice_lag_rebuild(struct ice_pf *pf);
6767
bool ice_lag_is_switchdev_running(struct ice_pf *pf);
68+
void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt);
6869
#endif /* _ICE_LAG_H_ */

drivers/net/ethernet/intel/ice/ice_vf_lib.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,12 +829,16 @@ static void ice_notify_vf_reset(struct ice_vf *vf)
829829
int ice_reset_vf(struct ice_vf *vf, u32 flags)
830830
{
831831
struct ice_pf *pf = vf->pf;
832+
struct ice_lag *lag;
832833
struct ice_vsi *vsi;
834+
u8 act_prt, pri_prt;
833835
struct device *dev;
834836
int err = 0;
835837
bool rsd;
836838

837839
dev = ice_pf_to_dev(pf);
840+
act_prt = ICE_LAG_INVALID_PORT;
841+
pri_prt = pf->hw.port_info->lport;
838842

839843
if (flags & ICE_VF_RESET_NOTIFY)
840844
ice_notify_vf_reset(vf);
@@ -845,6 +849,17 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)
845849
return 0;
846850
}
847851

852+
lag = pf->lag;
853+
mutex_lock(&pf->lag_mutex);
854+
if (lag && lag->bonded && lag->primary) {
855+
act_prt = lag->active_port;
856+
if (act_prt != pri_prt && act_prt != ICE_LAG_INVALID_PORT &&
857+
lag->upper_netdev)
858+
ice_lag_move_vf_nodes_cfg(lag, act_prt, pri_prt);
859+
else
860+
act_prt = ICE_LAG_INVALID_PORT;
861+
}
862+
848863
if (flags & ICE_VF_RESET_LOCK)
849864
mutex_lock(&vf->cfg_lock);
850865
else
@@ -937,6 +952,11 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)
937952
if (flags & ICE_VF_RESET_LOCK)
938953
mutex_unlock(&vf->cfg_lock);
939954

955+
if (lag && lag->bonded && lag->primary &&
956+
act_prt != ICE_LAG_INVALID_PORT)
957+
ice_lag_move_vf_nodes_cfg(lag, pri_prt, act_prt);
958+
mutex_unlock(&pf->lag_mutex);
959+
940960
return err;
941961
}
942962

0 commit comments

Comments
 (0)