@@ -88,6 +88,8 @@ void idpf_intr_rel(struct idpf_adapter *adapter)
88
88
idpf_deinit_vector_stack (adapter );
89
89
kfree (adapter -> msix_entries );
90
90
adapter -> msix_entries = NULL ;
91
+ kfree (adapter -> rdma_msix_entries );
92
+ adapter -> rdma_msix_entries = NULL ;
91
93
}
92
94
93
95
/**
@@ -299,13 +301,33 @@ int idpf_req_rel_vector_indexes(struct idpf_adapter *adapter,
299
301
*/
300
302
int idpf_intr_req (struct idpf_adapter * adapter )
301
303
{
304
+ u16 num_lan_vecs , min_lan_vecs , num_rdma_vecs = 0 , min_rdma_vecs = 0 ;
302
305
u16 default_vports = idpf_get_default_vports (adapter );
303
306
int num_q_vecs , total_vecs , num_vec_ids ;
304
- int min_vectors , v_actual , err ;
307
+ int min_vectors , actual_vecs , err ;
305
308
unsigned int vector ;
306
309
u16 * vecids ;
310
+ int i ;
307
311
308
312
total_vecs = idpf_get_reserved_vecs (adapter );
313
+ num_lan_vecs = total_vecs ;
314
+ if (idpf_is_rdma_cap_ena (adapter )) {
315
+ num_rdma_vecs = idpf_get_reserved_rdma_vecs (adapter );
316
+ min_rdma_vecs = IDPF_MIN_RDMA_VEC ;
317
+
318
+ if (!num_rdma_vecs ) {
319
+ /* If idpf_get_reserved_rdma_vecs is 0, vectors are
320
+ * pulled from the LAN pool.
321
+ */
322
+ num_rdma_vecs = min_rdma_vecs ;
323
+ } else if (num_rdma_vecs < min_rdma_vecs ) {
324
+ dev_err (& adapter -> pdev -> dev ,
325
+ "Not enough vectors reserved for RDMA (min: %u, current: %u)\n" ,
326
+ min_rdma_vecs , num_rdma_vecs );
327
+ return - EINVAL ;
328
+ }
329
+ }
330
+
309
331
num_q_vecs = total_vecs - IDPF_MBX_Q_VEC ;
310
332
311
333
err = idpf_send_alloc_vectors_msg (adapter , num_q_vecs );
@@ -316,52 +338,76 @@ int idpf_intr_req(struct idpf_adapter *adapter)
316
338
return - EAGAIN ;
317
339
}
318
340
319
- min_vectors = IDPF_MBX_Q_VEC + IDPF_MIN_Q_VEC * default_vports ;
320
- v_actual = pci_alloc_irq_vectors (adapter -> pdev , min_vectors ,
321
- total_vecs , PCI_IRQ_MSIX );
322
- if (v_actual < min_vectors ) {
323
- dev_err (& adapter -> pdev -> dev , "Failed to allocate MSIX vectors: %d\n" ,
324
- v_actual );
325
- err = - EAGAIN ;
341
+ min_lan_vecs = IDPF_MBX_Q_VEC + IDPF_MIN_Q_VEC * default_vports ;
342
+ min_vectors = min_lan_vecs + min_rdma_vecs ;
343
+ actual_vecs = pci_alloc_irq_vectors (adapter -> pdev , min_vectors ,
344
+ total_vecs , PCI_IRQ_MSIX );
345
+ if (actual_vecs < 0 ) {
346
+ dev_err (& adapter -> pdev -> dev , "Failed to allocate minimum MSIX vectors required: %d\n" ,
347
+ min_vectors );
348
+ err = actual_vecs ;
326
349
goto send_dealloc_vecs ;
327
350
}
328
351
329
- adapter -> msix_entries = kcalloc (v_actual , sizeof (struct msix_entry ),
330
- GFP_KERNEL );
352
+ if (idpf_is_rdma_cap_ena (adapter )) {
353
+ if (actual_vecs < total_vecs ) {
354
+ dev_warn (& adapter -> pdev -> dev ,
355
+ "Warning: %d vectors requested, only %d available. Defaulting to minimum (%d) for RDMA and remaining for LAN.\n" ,
356
+ total_vecs , actual_vecs , IDPF_MIN_RDMA_VEC );
357
+ num_rdma_vecs = IDPF_MIN_RDMA_VEC ;
358
+ }
331
359
360
+ adapter -> rdma_msix_entries = kcalloc (num_rdma_vecs ,
361
+ sizeof (struct msix_entry ),
362
+ GFP_KERNEL );
363
+ if (!adapter -> rdma_msix_entries ) {
364
+ err = - ENOMEM ;
365
+ goto free_irq ;
366
+ }
367
+ }
368
+
369
+ num_lan_vecs = actual_vecs - num_rdma_vecs ;
370
+ adapter -> msix_entries = kcalloc (num_lan_vecs , sizeof (struct msix_entry ),
371
+ GFP_KERNEL );
332
372
if (!adapter -> msix_entries ) {
333
373
err = - ENOMEM ;
334
- goto free_irq ;
374
+ goto free_rdma_msix ;
335
375
}
336
376
337
377
adapter -> mb_vector .v_idx = le16_to_cpu (adapter -> caps .mailbox_vector_id );
338
378
339
- vecids = kcalloc (total_vecs , sizeof (u16 ), GFP_KERNEL );
379
+ vecids = kcalloc (actual_vecs , sizeof (u16 ), GFP_KERNEL );
340
380
if (!vecids ) {
341
381
err = - ENOMEM ;
342
382
goto free_msix ;
343
383
}
344
384
345
- num_vec_ids = idpf_get_vec_ids (adapter , vecids , total_vecs ,
385
+ num_vec_ids = idpf_get_vec_ids (adapter , vecids , actual_vecs ,
346
386
& adapter -> req_vec_chunks -> vchunks );
347
- if (num_vec_ids < v_actual ) {
387
+ if (num_vec_ids < actual_vecs ) {
348
388
err = - EINVAL ;
349
389
goto free_vecids ;
350
390
}
351
391
352
- for (vector = 0 ; vector < v_actual ; vector ++ ) {
392
+ for (vector = 0 ; vector < num_lan_vecs ; vector ++ ) {
353
393
adapter -> msix_entries [vector ].entry = vecids [vector ];
354
394
adapter -> msix_entries [vector ].vector =
355
395
pci_irq_vector (adapter -> pdev , vector );
356
396
}
397
+ for (i = 0 ; i < num_rdma_vecs ; vector ++ , i ++ ) {
398
+ adapter -> rdma_msix_entries [i ].entry = vecids [vector ];
399
+ adapter -> rdma_msix_entries [i ].vector =
400
+ pci_irq_vector (adapter -> pdev , vector );
401
+ }
357
402
358
- adapter -> num_req_msix = total_vecs ;
359
- adapter -> num_msix_entries = v_actual ;
360
403
/* 'num_avail_msix' is used to distribute excess vectors to the vports
361
404
* after considering the minimum vectors required per each default
362
405
* vport
363
406
*/
364
- adapter -> num_avail_msix = v_actual - min_vectors ;
407
+ adapter -> num_avail_msix = num_lan_vecs - min_lan_vecs ;
408
+ adapter -> num_msix_entries = num_lan_vecs ;
409
+ if (idpf_is_rdma_cap_ena (adapter ))
410
+ adapter -> num_rdma_msix_entries = num_rdma_vecs ;
365
411
366
412
/* Fill MSIX vector lifo stack with vector indexes */
367
413
err = idpf_init_vector_stack (adapter );
@@ -383,6 +429,9 @@ int idpf_intr_req(struct idpf_adapter *adapter)
383
429
free_msix :
384
430
kfree (adapter -> msix_entries );
385
431
adapter -> msix_entries = NULL ;
432
+ free_rdma_msix :
433
+ kfree (adapter -> rdma_msix_entries );
434
+ adapter -> rdma_msix_entries = NULL ;
386
435
free_irq :
387
436
pci_free_irq_vectors (adapter -> pdev );
388
437
send_dealloc_vecs :
0 commit comments