Skip to content

Commit bbabcf0

Browse files
committed
Merge: ice: managing MSI-X in driver
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/522 JIRA: https://issues.redhat.com/browse/RHEL-80554 Patches are required for managing MSI-X in driver. Signed-off-by: Petr Oros <poros@redhat.com> Approved-by: Michal Schmidt <mschmidt@redhat.com> Approved-by: Kamal Heib <kheib@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Julio Faracco <jfaracco@redhat.com>
2 parents 9f8c863 + b015641 commit bbabcf0

File tree

17 files changed

+438
-521
lines changed

17 files changed

+438
-521
lines changed

Documentation/networking/devlink/ice.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ Parameters
6969

7070
To verify that value has been set:
7171
$ devlink dev param show pci/0000:16:00.0 name tx_scheduling_layers
72+
* - ``msix_vec_per_pf_max``
73+
- driverinit
74+
- Set the max MSI-X that can be used by the PF, rest can be utilized for
75+
SRIOV. The range is from min value set in msix_vec_per_pf_min to
76+
2k/number of ports.
77+
* - ``msix_vec_per_pf_min``
78+
- driverinit
79+
- Set the min MSI-X that will be used by the PF. This value inform how many
80+
MSI-X will be allocated statically. The range is from 2 to value set
81+
in msix_vec_per_pf_max.
82+
7283
.. list-table:: Driver specific parameters implemented
7384
:widths: 5 5 90
7485

drivers/infiniband/hw/irdma/hw.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,6 @@ static int irdma_save_msix_info(struct irdma_pci_f *rf)
498498
iw_qvlist->num_vectors = rf->msix_count;
499499
if (rf->msix_count <= num_online_cpus())
500500
rf->msix_shared = true;
501-
else if (rf->msix_count > num_online_cpus() + 1)
502-
rf->msix_count = num_online_cpus() + 1;
503501

504502
pmsix = rf->msix_entries;
505503
for (i = 0, ceq_idx = 0; i < rf->msix_count; i++, iw_qvinfo++) {

drivers/infiniband/hw/irdma/main.c

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,43 @@ static void irdma_lan_unregister_qset(struct irdma_sc_vsi *vsi,
206206
ibdev_dbg(&iwdev->ibdev, "WS: LAN free_res for rdma qset failed.\n");
207207
}
208208

209+
static int irdma_init_interrupts(struct irdma_pci_f *rf, struct ice_pf *pf)
210+
{
211+
int i;
212+
213+
rf->msix_count = num_online_cpus() + IRDMA_NUM_AEQ_MSIX;
214+
rf->msix_entries = kcalloc(rf->msix_count, sizeof(*rf->msix_entries),
215+
GFP_KERNEL);
216+
if (!rf->msix_entries)
217+
return -ENOMEM;
218+
219+
for (i = 0; i < rf->msix_count; i++)
220+
if (ice_alloc_rdma_qvector(pf, &rf->msix_entries[i]))
221+
break;
222+
223+
if (i < IRDMA_MIN_MSIX) {
224+
for (; i > 0; i--)
225+
ice_free_rdma_qvector(pf, &rf->msix_entries[i]);
226+
227+
kfree(rf->msix_entries);
228+
return -ENOMEM;
229+
}
230+
231+
rf->msix_count = i;
232+
233+
return 0;
234+
}
235+
236+
static void irdma_deinit_interrupts(struct irdma_pci_f *rf, struct ice_pf *pf)
237+
{
238+
int i;
239+
240+
for (i = 0; i < rf->msix_count; i++)
241+
ice_free_rdma_qvector(pf, &rf->msix_entries[i]);
242+
243+
kfree(rf->msix_entries);
244+
}
245+
209246
static void irdma_remove(struct auxiliary_device *aux_dev)
210247
{
211248
struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev,
@@ -216,6 +253,7 @@ static void irdma_remove(struct auxiliary_device *aux_dev)
216253

217254
irdma_ib_unregister_device(iwdev);
218255
ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, false);
256+
irdma_deinit_interrupts(iwdev->rf, pf);
219257

220258
pr_debug("INIT: Gen2 PF[%d] device remove success\n", PCI_FUNC(pf->pdev->devfn));
221259
}
@@ -230,9 +268,7 @@ static void irdma_fill_device_info(struct irdma_device *iwdev, struct ice_pf *pf
230268
rf->gen_ops.unregister_qset = irdma_lan_unregister_qset;
231269
rf->hw.hw_addr = pf->hw.hw_addr;
232270
rf->pcidev = pf->pdev;
233-
rf->msix_count = pf->num_rdma_msix;
234271
rf->pf_id = pf->hw.pf_id;
235-
rf->msix_entries = &pf->msix_entries[pf->rdma_base_vector];
236272
rf->default_vsi.vsi_idx = vsi->vsi_num;
237273
rf->protocol_used = pf->rdma_mode & IIDC_RDMA_PROTOCOL_ROCEV2 ?
238274
IRDMA_ROCE_PROTOCOL_ONLY : IRDMA_IWARP_PROTOCOL_ONLY;
@@ -281,6 +317,10 @@ static int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_
281317
irdma_fill_device_info(iwdev, pf, vsi);
282318
rf = iwdev->rf;
283319

320+
err = irdma_init_interrupts(rf, pf);
321+
if (err)
322+
goto err_init_interrupts;
323+
284324
err = irdma_ctrl_init_hw(rf);
285325
if (err)
286326
goto err_ctrl_init;
@@ -311,6 +351,8 @@ static int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_
311351
err_rt_init:
312352
irdma_ctrl_deinit_hw(rf);
313353
err_ctrl_init:
354+
irdma_deinit_interrupts(rf, pf);
355+
err_init_interrupts:
314356
kfree(iwdev->rf);
315357
ib_dealloc_device(&iwdev->ibdev);
316358

drivers/infiniband/hw/irdma/main.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ extern struct auxiliary_driver i40iw_auxiliary_drv;
117117

118118
#define IRDMA_IRQ_NAME_STR_LEN (64)
119119

120+
#define IRDMA_NUM_AEQ_MSIX 1
121+
#define IRDMA_MIN_MSIX 2
122+
120123
enum init_completion_state {
121124
INVALID_STATE = 0,
122125
INITIAL_STATE,

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

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,25 @@ static int ice_devlink_set_parent(struct devlink_rate *devlink_rate,
11981198
return status;
11991199
}
12001200

1201+
static void ice_set_min_max_msix(struct ice_pf *pf)
1202+
{
1203+
struct devlink *devlink = priv_to_devlink(pf);
1204+
union devlink_param_value val;
1205+
int err;
1206+
1207+
err = devl_param_driverinit_value_get(devlink,
1208+
DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
1209+
&val);
1210+
if (!err)
1211+
pf->msix.min = val.vu32;
1212+
1213+
err = devl_param_driverinit_value_get(devlink,
1214+
DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
1215+
&val);
1216+
if (!err)
1217+
pf->msix.max = val.vu32;
1218+
}
1219+
12011220
/**
12021221
* ice_devlink_reinit_up - do reinit of the given PF
12031222
* @pf: pointer to the PF struct
@@ -1207,9 +1226,18 @@ static int ice_devlink_reinit_up(struct ice_pf *pf)
12071226
struct ice_vsi *vsi = ice_get_main_vsi(pf);
12081227
int err;
12091228

1229+
err = ice_init_hw(&pf->hw);
1230+
if (err) {
1231+
dev_err(ice_pf_to_dev(pf), "ice_init_hw failed: %d\n", err);
1232+
return err;
1233+
}
1234+
1235+
/* load MSI-X values */
1236+
ice_set_min_max_msix(pf);
1237+
12101238
err = ice_init_dev(pf);
12111239
if (err)
1212-
return err;
1240+
goto unroll_hw_init;
12131241

12141242
vsi->flags = ICE_VSI_FLAG_INIT;
12151243

@@ -1232,6 +1260,8 @@ static int ice_devlink_reinit_up(struct ice_pf *pf)
12321260
rtnl_unlock();
12331261
err_vsi_cfg:
12341262
ice_deinit_dev(pf);
1263+
unroll_hw_init:
1264+
ice_deinit_hw(&pf->hw);
12351265
return err;
12361266
}
12371267

@@ -1518,6 +1548,43 @@ static int ice_devlink_local_fwd_validate(struct devlink *devlink, u32 id,
15181548
return 0;
15191549
}
15201550

1551+
static int
1552+
ice_devlink_msix_max_pf_validate(struct devlink *devlink, u32 id,
1553+
union devlink_param_value val,
1554+
struct netlink_ext_ack *extack)
1555+
{
1556+
struct ice_pf *pf = devlink_priv(devlink);
1557+
1558+
if (val.vu32 > pf->hw.func_caps.common_cap.num_msix_vectors)
1559+
return -EINVAL;
1560+
1561+
return 0;
1562+
}
1563+
1564+
static int
1565+
ice_devlink_msix_min_pf_validate(struct devlink *devlink, u32 id,
1566+
union devlink_param_value val,
1567+
struct netlink_ext_ack *extack)
1568+
{
1569+
if (val.vu32 < ICE_MIN_MSIX)
1570+
return -EINVAL;
1571+
1572+
return 0;
1573+
}
1574+
1575+
static int ice_devlink_enable_rdma_validate(struct devlink *devlink, u32 id,
1576+
union devlink_param_value val,
1577+
struct netlink_ext_ack *extack)
1578+
{
1579+
struct ice_pf *pf = devlink_priv(devlink);
1580+
bool new_state = val.vbool;
1581+
1582+
if (new_state && !test_bit(ICE_FLAG_RDMA_ENA, pf->flags))
1583+
return -EOPNOTSUPP;
1584+
1585+
return 0;
1586+
}
1587+
15211588
enum ice_param_id {
15221589
ICE_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
15231590
ICE_DEVLINK_PARAM_ID_TX_SCHED_LAYERS,
@@ -1533,6 +1600,17 @@ static const struct devlink_param ice_dvl_rdma_params[] = {
15331600
ice_devlink_enable_iw_get,
15341601
ice_devlink_enable_iw_set,
15351602
ice_devlink_enable_iw_validate),
1603+
DEVLINK_PARAM_GENERIC(ENABLE_RDMA, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
1604+
NULL, NULL, ice_devlink_enable_rdma_validate),
1605+
};
1606+
1607+
static const struct devlink_param ice_dvl_msix_params[] = {
1608+
DEVLINK_PARAM_GENERIC(MSIX_VEC_PER_PF_MAX,
1609+
BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
1610+
NULL, NULL, ice_devlink_msix_max_pf_validate),
1611+
DEVLINK_PARAM_GENERIC(MSIX_VEC_PER_PF_MIN,
1612+
BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
1613+
NULL, NULL, ice_devlink_msix_min_pf_validate),
15361614
};
15371615

15381616
static const struct devlink_param ice_dvl_sched_params[] = {
@@ -1636,6 +1714,7 @@ void ice_devlink_unregister(struct ice_pf *pf)
16361714
int ice_devlink_register_params(struct ice_pf *pf)
16371715
{
16381716
struct devlink *devlink = priv_to_devlink(pf);
1717+
union devlink_param_value value;
16391718
struct ice_hw *hw = &pf->hw;
16401719
int status;
16411720

@@ -1644,10 +1723,39 @@ int ice_devlink_register_params(struct ice_pf *pf)
16441723
if (status)
16451724
return status;
16461725

1726+
status = devl_params_register(devlink, ice_dvl_msix_params,
1727+
ARRAY_SIZE(ice_dvl_msix_params));
1728+
if (status)
1729+
goto unregister_rdma_params;
1730+
16471731
if (hw->func_caps.common_cap.tx_sched_topo_comp_mode_en)
16481732
status = devl_params_register(devlink, ice_dvl_sched_params,
16491733
ARRAY_SIZE(ice_dvl_sched_params));
1734+
if (status)
1735+
goto unregister_msix_params;
1736+
1737+
value.vu32 = pf->msix.max;
1738+
devl_param_driverinit_value_set(devlink,
1739+
DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
1740+
value);
1741+
value.vu32 = pf->msix.min;
1742+
devl_param_driverinit_value_set(devlink,
1743+
DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
1744+
value);
1745+
1746+
value.vbool = test_bit(ICE_FLAG_RDMA_ENA, pf->flags);
1747+
devl_param_driverinit_value_set(devlink,
1748+
DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
1749+
value);
1750+
1751+
return 0;
16501752

1753+
unregister_msix_params:
1754+
devl_params_unregister(devlink, ice_dvl_msix_params,
1755+
ARRAY_SIZE(ice_dvl_msix_params));
1756+
unregister_rdma_params:
1757+
devl_params_unregister(devlink, ice_dvl_rdma_params,
1758+
ARRAY_SIZE(ice_dvl_rdma_params));
16511759
return status;
16521760
}
16531761

@@ -1658,6 +1766,8 @@ void ice_devlink_unregister_params(struct ice_pf *pf)
16581766

16591767
devl_params_unregister(devlink, ice_dvl_rdma_params,
16601768
ARRAY_SIZE(ice_dvl_rdma_params));
1769+
devl_params_unregister(devlink, ice_dvl_msix_params,
1770+
ARRAY_SIZE(ice_dvl_msix_params));
16611771

16621772
if (hw->func_caps.common_cap.tx_sched_topo_comp_mode_en)
16631773
devl_params_unregister(devlink, ice_dvl_sched_params,

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,6 @@
9696
#define ICE_MIN_LAN_OICR_MSIX 1
9797
#define ICE_MIN_MSIX (ICE_MIN_LAN_TXRX_MSIX + ICE_MIN_LAN_OICR_MSIX)
9898
#define ICE_FDIR_MSIX 2
99-
#define ICE_RDMA_NUM_AEQ_MSIX 4
100-
#define ICE_MIN_RDMA_MSIX 2
101-
#define ICE_ESWITCH_MSIX 1
10299
#define ICE_NO_VSI 0xffff
103100
#define ICE_VSI_MAP_CONTIG 0
104101
#define ICE_VSI_MAP_SCATTER 1
@@ -545,6 +542,14 @@ struct ice_agg_node {
545542
u8 valid;
546543
};
547544

545+
struct ice_pf_msix {
546+
u32 cur;
547+
u32 min;
548+
u32 max;
549+
u32 total;
550+
u32 rest;
551+
};
552+
548553
struct ice_pf {
549554
struct pci_dev *pdev;
550555
struct ice_adapter *adapter;
@@ -559,13 +564,7 @@ struct ice_pf {
559564
/* OS reserved IRQ details */
560565
struct msix_entry *msix_entries;
561566
struct ice_irq_tracker irq_tracker;
562-
/* First MSIX vector used by SR-IOV VFs. Calculated by subtracting the
563-
* number of MSIX vectors needed for all SR-IOV VFs from the number of
564-
* MSIX vectors allowed on this PF.
565-
*/
566-
u16 sriov_base_vector;
567-
unsigned long *sriov_irq_bm; /* bitmap to track irq usage */
568-
u16 sriov_irq_size; /* size of the irq_bm bitmap */
567+
struct ice_virt_irq_tracker virt_irq_tracker;
569568

570569
u16 ctrl_vsi_idx; /* control VSI index in pf->vsi array */
571570

@@ -615,7 +614,7 @@ struct ice_pf {
615614
struct msi_map ll_ts_irq; /* LL_TS interrupt MSIX vector */
616615
u16 max_pf_txqs; /* Total Tx queues PF wide */
617616
u16 max_pf_rxqs; /* Total Rx queues PF wide */
618-
u16 num_lan_msix; /* Total MSIX vectors for base driver */
617+
struct ice_pf_msix msix;
619618
u16 num_lan_tx; /* num LAN Tx queues setup */
620619
u16 num_lan_rx; /* num LAN Rx queues setup */
621620
u16 next_vsi; /* Next free slot in pf->vsi[] - 0-based! */

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -793,13 +793,11 @@ int ice_vsi_alloc_q_vectors(struct ice_vsi *vsi)
793793
return 0;
794794

795795
err_out:
796-
while (v_idx--)
797-
ice_free_q_vector(vsi, v_idx);
798796

799-
dev_err(dev, "Failed to allocate %d q_vector for VSI %d, ret=%d\n",
800-
vsi->num_q_vectors, vsi->vsi_num, err);
801-
vsi->num_q_vectors = 0;
802-
return err;
797+
dev_info(dev, "Failed to allocate %d q_vectors for VSI %d, new value %d",
798+
vsi->num_q_vectors, vsi->vsi_num, v_idx);
799+
vsi->num_q_vectors = v_idx;
800+
return v_idx ? 0 : err;
803801
}
804802

805803
/**

0 commit comments

Comments
 (0)