Skip to content

Commit cfd40b8

Browse files
committed
Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2023-06-22 (ice) This series contains updates to ice driver only. Jake adds a slight wait on control queue send to reduce wait time for responses that occur within normal times. Maciej allows for hot-swapping XDP programs. Przemek removes unnecessary checks when enabling SR-IOV and freeing allocated memory. Christophe Jaillet converts a managed memory allocation to a regular one. * '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue: ice: use ice_down_up() where applicable ice: Remove managed memory usage in ice_get_fw_log_cfg() ice: remove null checks before devm_kfree() calls ice: clean up freeing SR-IOV VFs ice: allow hot-swapping XDP programs ice: reduce initial wait for control queue messages ==================== Link: https://lore.kernel.org/r/20230622183601.2406499-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 2fe11c9 + b7a0345 commit cfd40b8

9 files changed

Lines changed: 52 additions & 108 deletions

File tree

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -814,8 +814,7 @@ static void ice_cleanup_fltr_mgmt_struct(struct ice_hw *hw)
814814
devm_kfree(ice_hw_to_dev(hw), lst_itr);
815815
}
816816
}
817-
if (recps[i].root_buf)
818-
devm_kfree(ice_hw_to_dev(hw), recps[i].root_buf);
817+
devm_kfree(ice_hw_to_dev(hw), recps[i].root_buf);
819818
}
820819
ice_rm_all_sw_replay_rule_info(hw);
821820
devm_kfree(ice_hw_to_dev(hw), sw->recp_list);
@@ -834,7 +833,7 @@ static int ice_get_fw_log_cfg(struct ice_hw *hw)
834833
u16 size;
835834

836835
size = sizeof(*config) * ICE_AQC_FW_LOG_ID_MAX;
837-
config = devm_kzalloc(ice_hw_to_dev(hw), size, GFP_KERNEL);
836+
config = kzalloc(size, GFP_KERNEL);
838837
if (!config)
839838
return -ENOMEM;
840839

@@ -857,7 +856,7 @@ static int ice_get_fw_log_cfg(struct ice_hw *hw)
857856
}
858857
}
859858

860-
devm_kfree(ice_hw_to_dev(hw), config);
859+
kfree(config);
861860

862861
return status;
863862
}
@@ -1011,8 +1010,7 @@ static int ice_cfg_fw_log(struct ice_hw *hw, bool enable)
10111010
}
10121011

10131012
out:
1014-
if (data)
1015-
devm_kfree(ice_hw_to_dev(hw), data);
1013+
devm_kfree(ice_hw_to_dev(hw), data);
10161014

10171015
return status;
10181016
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,7 @@ do { \
339339
} \
340340
} \
341341
/* free the buffer info list */ \
342-
if ((qi)->ring.cmd_buf) \
343-
devm_kfree(ice_hw_to_dev(hw), (qi)->ring.cmd_buf); \
342+
devm_kfree(ice_hw_to_dev(hw), (qi)->ring.cmd_buf); \
344343
/* free DMA head */ \
345344
devm_kfree(ice_hw_to_dev(hw), (qi)->ring.dma_head); \
346345
} while (0)
@@ -1056,14 +1055,19 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq,
10561055
if (cq->sq.next_to_use == cq->sq.count)
10571056
cq->sq.next_to_use = 0;
10581057
wr32(hw, cq->sq.tail, cq->sq.next_to_use);
1058+
ice_flush(hw);
1059+
1060+
/* Wait a short time before initial ice_sq_done() check, to allow
1061+
* hardware time for completion.
1062+
*/
1063+
udelay(5);
10591064

10601065
timeout = jiffies + ICE_CTL_Q_SQ_CMD_TIMEOUT;
10611066
do {
10621067
if (ice_sq_done(hw, cq))
10631068
break;
10641069

1065-
usleep_range(ICE_CTL_Q_SQ_CMD_USEC,
1066-
ICE_CTL_Q_SQ_CMD_USEC * 3 / 2);
1070+
usleep_range(100, 150);
10671071
} while (time_before(jiffies, timeout));
10681072

10691073
/* if ready, copy the desc back to temp */

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ enum ice_ctl_q {
3535

3636
/* Control Queue timeout settings - max delay 1s */
3737
#define ICE_CTL_Q_SQ_CMD_TIMEOUT HZ /* Wait max 1s */
38-
#define ICE_CTL_Q_SQ_CMD_USEC 100 /* Check every 100usec */
3938
#define ICE_CTL_Q_ADMIN_INIT_TIMEOUT 10 /* Count 10 times */
4039
#define ICE_CTL_Q_ADMIN_INIT_MSEC 100 /* Check every 100msec */
4140

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

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,23 +1303,6 @@ ice_flow_find_prof_id(struct ice_hw *hw, enum ice_block blk, u64 prof_id)
13031303
return NULL;
13041304
}
13051305

1306-
/**
1307-
* ice_dealloc_flow_entry - Deallocate flow entry memory
1308-
* @hw: pointer to the HW struct
1309-
* @entry: flow entry to be removed
1310-
*/
1311-
static void
1312-
ice_dealloc_flow_entry(struct ice_hw *hw, struct ice_flow_entry *entry)
1313-
{
1314-
if (!entry)
1315-
return;
1316-
1317-
if (entry->entry)
1318-
devm_kfree(ice_hw_to_dev(hw), entry->entry);
1319-
1320-
devm_kfree(ice_hw_to_dev(hw), entry);
1321-
}
1322-
13231306
/**
13241307
* ice_flow_rem_entry_sync - Remove a flow entry
13251308
* @hw: pointer to the HW struct
@@ -1335,7 +1318,8 @@ ice_flow_rem_entry_sync(struct ice_hw *hw, enum ice_block __always_unused blk,
13351318

13361319
list_del(&entry->l_entry);
13371320

1338-
ice_dealloc_flow_entry(hw, entry);
1321+
devm_kfree(ice_hw_to_dev(hw), entry->entry);
1322+
devm_kfree(ice_hw_to_dev(hw), entry);
13391323

13401324
return 0;
13411325
}
@@ -1662,8 +1646,7 @@ ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id,
16621646

16631647
out:
16641648
if (status && e) {
1665-
if (e->entry)
1666-
devm_kfree(ice_hw_to_dev(hw), e->entry);
1649+
devm_kfree(ice_hw_to_dev(hw), e->entry);
16671650
devm_kfree(ice_hw_to_dev(hw), e);
16681651
}
16691652

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

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -321,31 +321,19 @@ static void ice_vsi_free_arrays(struct ice_vsi *vsi)
321321

322322
dev = ice_pf_to_dev(pf);
323323

324-
if (vsi->af_xdp_zc_qps) {
325-
bitmap_free(vsi->af_xdp_zc_qps);
326-
vsi->af_xdp_zc_qps = NULL;
327-
}
324+
bitmap_free(vsi->af_xdp_zc_qps);
325+
vsi->af_xdp_zc_qps = NULL;
328326
/* free the ring and vector containers */
329-
if (vsi->q_vectors) {
330-
devm_kfree(dev, vsi->q_vectors);
331-
vsi->q_vectors = NULL;
332-
}
333-
if (vsi->tx_rings) {
334-
devm_kfree(dev, vsi->tx_rings);
335-
vsi->tx_rings = NULL;
336-
}
337-
if (vsi->rx_rings) {
338-
devm_kfree(dev, vsi->rx_rings);
339-
vsi->rx_rings = NULL;
340-
}
341-
if (vsi->txq_map) {
342-
devm_kfree(dev, vsi->txq_map);
343-
vsi->txq_map = NULL;
344-
}
345-
if (vsi->rxq_map) {
346-
devm_kfree(dev, vsi->rxq_map);
347-
vsi->rxq_map = NULL;
348-
}
327+
devm_kfree(dev, vsi->q_vectors);
328+
vsi->q_vectors = NULL;
329+
devm_kfree(dev, vsi->tx_rings);
330+
vsi->tx_rings = NULL;
331+
devm_kfree(dev, vsi->rx_rings);
332+
vsi->rx_rings = NULL;
333+
devm_kfree(dev, vsi->txq_map);
334+
vsi->txq_map = NULL;
335+
devm_kfree(dev, vsi->rxq_map);
336+
vsi->rxq_map = NULL;
349337
}
350338

351339
/**
@@ -902,10 +890,8 @@ static void ice_rss_clean(struct ice_vsi *vsi)
902890

903891
dev = ice_pf_to_dev(pf);
904892

905-
if (vsi->rss_hkey_user)
906-
devm_kfree(dev, vsi->rss_hkey_user);
907-
if (vsi->rss_lut_user)
908-
devm_kfree(dev, vsi->rss_lut_user);
893+
devm_kfree(dev, vsi->rss_hkey_user);
894+
devm_kfree(dev, vsi->rss_lut_user);
909895

910896
ice_vsi_clean_rss_flow_fld(vsi);
911897
/* remove RSS replay list */

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

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2633,11 +2633,11 @@ static void ice_vsi_assign_bpf_prog(struct ice_vsi *vsi, struct bpf_prog *prog)
26332633
int i;
26342634

26352635
old_prog = xchg(&vsi->xdp_prog, prog);
2636-
if (old_prog)
2637-
bpf_prog_put(old_prog);
2638-
26392636
ice_for_each_rxq(vsi, i)
26402637
WRITE_ONCE(vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog);
2638+
2639+
if (old_prog)
2640+
bpf_prog_put(old_prog);
26412641
}
26422642

26432643
/**
@@ -2922,6 +2922,12 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
29222922
}
29232923
}
29242924

2925+
/* hot swap progs and avoid toggling link */
2926+
if (ice_is_xdp_ena_vsi(vsi) == !!prog) {
2927+
ice_vsi_assign_bpf_prog(vsi, prog);
2928+
return 0;
2929+
}
2930+
29252931
/* need to stop netdev while setting up the program for Rx rings */
29262932
if (if_running && !test_and_set_bit(ICE_VSI_DOWN, vsi->state)) {
29272933
ret = ice_down(vsi);
@@ -2954,13 +2960,6 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
29542960
xdp_ring_err = ice_realloc_zc_buf(vsi, false);
29552961
if (xdp_ring_err)
29562962
NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Rx resources failed");
2957-
} else {
2958-
/* safe to call even when prog == vsi->xdp_prog as
2959-
* dev_xdp_install in net/core/dev.c incremented prog's
2960-
* refcount so corresponding bpf_prog_put won't cause
2961-
* underflow
2962-
*/
2963-
ice_vsi_assign_bpf_prog(vsi, prog);
29642963
}
29652964

29662965
if (if_running)
@@ -7413,21 +7412,9 @@ static int ice_change_mtu(struct net_device *netdev, int new_mtu)
74137412
}
74147413

74157414
netdev->mtu = (unsigned int)new_mtu;
7416-
7417-
/* if VSI is up, bring it down and then back up */
7418-
if (!test_and_set_bit(ICE_VSI_DOWN, vsi->state)) {
7419-
err = ice_down(vsi);
7420-
if (err) {
7421-
netdev_err(netdev, "change MTU if_down err %d\n", err);
7422-
return err;
7423-
}
7424-
7425-
err = ice_up(vsi);
7426-
if (err) {
7427-
netdev_err(netdev, "change MTU if_up err %d\n", err);
7428-
return err;
7429-
}
7430-
}
7415+
err = ice_down_up(vsi);
7416+
if (err)
7417+
return err;
74317418

74327419
netdev_dbg(netdev, "changed MTU to %d\n", new_mtu);
74337420
set_bit(ICE_FLAG_MTU_CHANGED, pf->flags);

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,7 @@ void ice_free_sched_node(struct ice_port_info *pi, struct ice_sched_node *node)
358358
node->sibling;
359359
}
360360

361-
/* leaf nodes have no children */
362-
if (node->children)
363-
devm_kfree(ice_hw_to_dev(hw), node->children);
364-
361+
devm_kfree(ice_hw_to_dev(hw), node->children);
365362
kfree(node->name);
366363
xa_erase(&pi->sched_node_ids, node->id);
367364
devm_kfree(ice_hw_to_dev(hw), node);
@@ -859,10 +856,8 @@ void ice_sched_cleanup_all(struct ice_hw *hw)
859856
if (!hw)
860857
return;
861858

862-
if (hw->layer_info) {
863-
devm_kfree(ice_hw_to_dev(hw), hw->layer_info);
864-
hw->layer_info = NULL;
865-
}
859+
devm_kfree(ice_hw_to_dev(hw), hw->layer_info);
860+
hw->layer_info = NULL;
866861

867862
ice_sched_clear_port(hw->port_info);
868863

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -905,14 +905,13 @@ static int ice_ena_vfs(struct ice_pf *pf, u16 num_vfs)
905905
*/
906906
static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs)
907907
{
908-
int pre_existing_vfs = pci_num_vf(pf->pdev);
909908
struct device *dev = ice_pf_to_dev(pf);
910909
int err;
911910

912-
if (pre_existing_vfs && pre_existing_vfs != num_vfs)
911+
if (!num_vfs) {
913912
ice_free_vfs(pf);
914-
else if (pre_existing_vfs && pre_existing_vfs == num_vfs)
915913
return 0;
914+
}
916915

917916
if (num_vfs > pf->vfs.num_supported) {
918917
dev_err(dev, "Can't enable %d VFs, max VFs supported is %d\n",

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

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1636,21 +1636,16 @@ ice_save_vsi_ctx(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi)
16361636
*/
16371637
static void ice_clear_vsi_q_ctx(struct ice_hw *hw, u16 vsi_handle)
16381638
{
1639-
struct ice_vsi_ctx *vsi;
1639+
struct ice_vsi_ctx *vsi = ice_get_vsi_ctx(hw, vsi_handle);
16401640
u8 i;
16411641

1642-
vsi = ice_get_vsi_ctx(hw, vsi_handle);
16431642
if (!vsi)
16441643
return;
16451644
ice_for_each_traffic_class(i) {
1646-
if (vsi->lan_q_ctx[i]) {
1647-
devm_kfree(ice_hw_to_dev(hw), vsi->lan_q_ctx[i]);
1648-
vsi->lan_q_ctx[i] = NULL;
1649-
}
1650-
if (vsi->rdma_q_ctx[i]) {
1651-
devm_kfree(ice_hw_to_dev(hw), vsi->rdma_q_ctx[i]);
1652-
vsi->rdma_q_ctx[i] = NULL;
1653-
}
1645+
devm_kfree(ice_hw_to_dev(hw), vsi->lan_q_ctx[i]);
1646+
vsi->lan_q_ctx[i] = NULL;
1647+
devm_kfree(ice_hw_to_dev(hw), vsi->rdma_q_ctx[i]);
1648+
vsi->rdma_q_ctx[i] = NULL;
16541649
}
16551650
}
16561651

@@ -5468,9 +5463,7 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
54685463
devm_kfree(ice_hw_to_dev(hw), fvit);
54695464
}
54705465

5471-
if (rm->root_buf)
5472-
devm_kfree(ice_hw_to_dev(hw), rm->root_buf);
5473-
5466+
devm_kfree(ice_hw_to_dev(hw), rm->root_buf);
54745467
kfree(rm);
54755468

54765469
err_free_lkup_exts:

0 commit comments

Comments
 (0)