Skip to content

Commit a19f7d7

Browse files
committed
Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2022-02-10 Dan Carpenter propagates an error in FEC configuration. Jesse fixes TSO offloads of IPIP and SIT frames. Dave adds a dedicated LAG unregister function to resolve a KASAN error and moves auxiliary device re-creation after LAG removal to the service task to avoid issues with RTNL lock. * '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue: ice: Avoid RTNL lock when re-creating auxiliary device ice: Fix KASAN error in LAG NETDEV_UNREGISTER handler ice: fix IPIP and SIT TSO offload ice: fix an error code in ice_cfg_phy_fec() ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 7fbf679 + 5dbbbd0 commit a19f7d7

File tree

5 files changed

+53
-16
lines changed

5 files changed

+53
-16
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ enum ice_pf_flags {
483483
ICE_FLAG_VF_TRUE_PROMISC_ENA,
484484
ICE_FLAG_MDD_AUTO_RESET_VF,
485485
ICE_FLAG_LINK_LENIENT_MODE_ENA,
486+
ICE_FLAG_PLUG_AUX_DEV,
486487
ICE_PF_FLAGS_NBITS /* must be last */
487488
};
488489

@@ -887,7 +888,7 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf)
887888
if (pf->hw.func_caps.common_cap.rdma && pf->num_rdma_msix) {
888889
set_bit(ICE_FLAG_RDMA_ENA, pf->flags);
889890
set_bit(ICE_FLAG_AUX_ENA, pf->flags);
890-
ice_plug_aux_dev(pf);
891+
set_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags);
891892
}
892893
}
893894

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3342,7 +3342,8 @@ ice_cfg_phy_fec(struct ice_port_info *pi, struct ice_aqc_set_phy_cfg_data *cfg,
33423342
!ice_fw_supports_report_dflt_cfg(hw)) {
33433343
struct ice_link_default_override_tlv tlv;
33443344

3345-
if (ice_get_link_default_override(&tlv, pi))
3345+
status = ice_get_link_default_override(&tlv, pi);
3346+
if (status)
33463347
goto out;
33473348

33483349
if (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE) &&

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

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,17 +204,39 @@ ice_lag_unlink(struct ice_lag *lag,
204204
lag->upper_netdev = NULL;
205205
}
206206

207-
if (lag->peer_netdev) {
208-
dev_put(lag->peer_netdev);
209-
lag->peer_netdev = NULL;
210-
}
211-
207+
lag->peer_netdev = NULL;
212208
ice_set_sriov_cap(pf);
213209
ice_set_rdma_cap(pf);
214210
lag->bonded = false;
215211
lag->role = ICE_LAG_NONE;
216212
}
217213

214+
/**
215+
* ice_lag_unregister - handle netdev unregister events
216+
* @lag: LAG info struct
217+
* @netdev: netdev reporting the event
218+
*/
219+
static void ice_lag_unregister(struct ice_lag *lag, struct net_device *netdev)
220+
{
221+
struct ice_pf *pf = lag->pf;
222+
223+
/* check to see if this event is for this netdev
224+
* check that we are in an aggregate
225+
*/
226+
if (netdev != lag->netdev || !lag->bonded)
227+
return;
228+
229+
if (lag->upper_netdev) {
230+
dev_put(lag->upper_netdev);
231+
lag->upper_netdev = NULL;
232+
ice_set_sriov_cap(pf);
233+
ice_set_rdma_cap(pf);
234+
}
235+
/* perform some cleanup in case we come back */
236+
lag->bonded = false;
237+
lag->role = ICE_LAG_NONE;
238+
}
239+
218240
/**
219241
* ice_lag_changeupper_event - handle LAG changeupper event
220242
* @lag: LAG info struct
@@ -307,7 +329,7 @@ ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event,
307329
ice_lag_info_event(lag, ptr);
308330
break;
309331
case NETDEV_UNREGISTER:
310-
ice_lag_unlink(lag, ptr);
332+
ice_lag_unregister(lag, netdev);
311333
break;
312334
default:
313335
break;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ struct ice_tx_ctx_desc {
568568
(0x3FFFFULL << ICE_TXD_CTX_QW1_TSO_LEN_S)
569569

570570
#define ICE_TXD_CTX_QW1_MSS_S 50
571+
#define ICE_TXD_CTX_MIN_MSS 64
571572

572573
#define ICE_TXD_CTX_QW1_VSI_S 50
573574
#define ICE_TXD_CTX_QW1_VSI_M (0x3FFULL << ICE_TXD_CTX_QW1_VSI_S)

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

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,6 +2253,9 @@ static void ice_service_task(struct work_struct *work)
22532253
return;
22542254
}
22552255

2256+
if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))
2257+
ice_plug_aux_dev(pf);
2258+
22562259
ice_clean_adminq_subtask(pf);
22572260
ice_check_media_subtask(pf);
22582261
ice_check_for_hang_subtask(pf);
@@ -8525,6 +8528,7 @@ ice_features_check(struct sk_buff *skb,
85258528
struct net_device __always_unused *netdev,
85268529
netdev_features_t features)
85278530
{
8531+
bool gso = skb_is_gso(skb);
85288532
size_t len;
85298533

85308534
/* No point in doing any of this if neither checksum nor GSO are
@@ -8537,24 +8541,32 @@ ice_features_check(struct sk_buff *skb,
85378541
/* We cannot support GSO if the MSS is going to be less than
85388542
* 64 bytes. If it is then we need to drop support for GSO.
85398543
*/
8540-
if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_size < 64))
8544+
if (gso && (skb_shinfo(skb)->gso_size < ICE_TXD_CTX_MIN_MSS))
85418545
features &= ~NETIF_F_GSO_MASK;
85428546

8543-
len = skb_network_header(skb) - skb->data;
8547+
len = skb_network_offset(skb);
85448548
if (len > ICE_TXD_MACLEN_MAX || len & 0x1)
85458549
goto out_rm_features;
85468550

8547-
len = skb_transport_header(skb) - skb_network_header(skb);
8551+
len = skb_network_header_len(skb);
85488552
if (len > ICE_TXD_IPLEN_MAX || len & 0x1)
85498553
goto out_rm_features;
85508554

85518555
if (skb->encapsulation) {
8552-
len = skb_inner_network_header(skb) - skb_transport_header(skb);
8553-
if (len > ICE_TXD_L4LEN_MAX || len & 0x1)
8554-
goto out_rm_features;
8556+
/* this must work for VXLAN frames AND IPIP/SIT frames, and in
8557+
* the case of IPIP frames, the transport header pointer is
8558+
* after the inner header! So check to make sure that this
8559+
* is a GRE or UDP_TUNNEL frame before doing that math.
8560+
*/
8561+
if (gso && (skb_shinfo(skb)->gso_type &
8562+
(SKB_GSO_GRE | SKB_GSO_UDP_TUNNEL))) {
8563+
len = skb_inner_network_header(skb) -
8564+
skb_transport_header(skb);
8565+
if (len > ICE_TXD_L4LEN_MAX || len & 0x1)
8566+
goto out_rm_features;
8567+
}
85558568

8556-
len = skb_inner_transport_header(skb) -
8557-
skb_inner_network_header(skb);
8569+
len = skb_inner_network_header_len(skb);
85588570
if (len > ICE_TXD_IPLEN_MAX || len & 0x1)
85598571
goto out_rm_features;
85608572
}

0 commit comments

Comments
 (0)