@@ -285,12 +285,13 @@ void vp_del_vqs(struct virtio_device *vdev)
285
285
}
286
286
287
287
static int vp_find_vqs_msix (struct virtio_device * vdev , unsigned int nvqs ,
288
- struct virtqueue * vqs [], vq_callback_t * callbacks [],
289
- const char * const names [], bool per_vq_vectors ,
290
- const bool * ctx ,
291
- struct irq_affinity * desc )
288
+ struct virtqueue * vqs [],
289
+ struct virtqueue_info vqs_info [] ,
290
+ bool per_vq_vectors ,
291
+ struct irq_affinity * desc )
292
292
{
293
293
struct virtio_pci_device * vp_dev = to_vp_device (vdev );
294
+ struct virtqueue_info * vqi ;
294
295
u16 msix_vec ;
295
296
int i , err , nvectors , allocated_vectors , queue_idx = 0 ;
296
297
@@ -301,9 +302,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
301
302
if (per_vq_vectors ) {
302
303
/* Best option: one for change interrupt, one per vq. */
303
304
nvectors = 1 ;
304
- for (i = 0 ; i < nvqs ; ++ i )
305
- if (names [i ] && callbacks [i ])
305
+ for (i = 0 ; i < nvqs ; ++ i ) {
306
+ vqi = & vqs_info [i ];
307
+ if (vqi -> name && vqi -> callback )
306
308
++ nvectors ;
309
+ }
307
310
} else {
308
311
/* Second best: one for change, shared for all vqs. */
309
312
nvectors = 2 ;
@@ -317,20 +320,20 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
317
320
vp_dev -> per_vq_vectors = per_vq_vectors ;
318
321
allocated_vectors = vp_dev -> msix_used_vectors ;
319
322
for (i = 0 ; i < nvqs ; ++ i ) {
320
- if (!names [i ]) {
323
+ vqi = & vqs_info [i ];
324
+ if (!vqi -> name ) {
321
325
vqs [i ] = NULL ;
322
326
continue ;
323
327
}
324
328
325
- if (!callbacks [ i ] )
329
+ if (!vqi -> callback )
326
330
msix_vec = VIRTIO_MSI_NO_VECTOR ;
327
331
else if (vp_dev -> per_vq_vectors )
328
332
msix_vec = allocated_vectors ++ ;
329
333
else
330
334
msix_vec = VP_MSIX_VQ_VECTOR ;
331
- vqs [i ] = vp_setup_vq (vdev , queue_idx ++ , callbacks [i ], names [i ],
332
- ctx ? ctx [i ] : false,
333
- msix_vec );
335
+ vqs [i ] = vp_setup_vq (vdev , queue_idx ++ , vqi -> callback ,
336
+ vqi -> name , vqi -> ctx , msix_vec );
334
337
if (IS_ERR (vqs [i ])) {
335
338
err = PTR_ERR (vqs [i ]);
336
339
goto error_find ;
@@ -343,7 +346,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
343
346
snprintf (vp_dev -> msix_names [msix_vec ],
344
347
sizeof * vp_dev -> msix_names ,
345
348
"%s-%s" ,
346
- dev_name (& vp_dev -> vdev .dev ), names [ i ] );
349
+ dev_name (& vp_dev -> vdev .dev ), vqi -> name );
347
350
err = request_irq (pci_irq_vector (vp_dev -> pci_dev , msix_vec ),
348
351
vring_interrupt , 0 ,
349
352
vp_dev -> msix_names [msix_vec ],
@@ -361,8 +364,8 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
361
364
}
362
365
363
366
static int vp_find_vqs_intx (struct virtio_device * vdev , unsigned int nvqs ,
364
- struct virtqueue * vqs [], vq_callback_t * callbacks [],
365
- const char * const names [], const bool * ctx )
367
+ struct virtqueue * vqs [],
368
+ struct virtqueue_info vqs_info [] )
366
369
{
367
370
struct virtio_pci_device * vp_dev = to_vp_device (vdev );
368
371
int i , err , queue_idx = 0 ;
@@ -379,12 +382,14 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
379
382
vp_dev -> intx_enabled = 1 ;
380
383
vp_dev -> per_vq_vectors = false;
381
384
for (i = 0 ; i < nvqs ; ++ i ) {
382
- if (!names [i ]) {
385
+ struct virtqueue_info * vqi = & vqs_info [i ];
386
+
387
+ if (!vqi -> name ) {
383
388
vqs [i ] = NULL ;
384
389
continue ;
385
390
}
386
- vqs [i ] = vp_setup_vq (vdev , queue_idx ++ , callbacks [ i ], names [ i ] ,
387
- ctx ? ctx [ i ] : false ,
391
+ vqs [i ] = vp_setup_vq (vdev , queue_idx ++ , vqi -> callback ,
392
+ vqi -> name , vqi -> ctx ,
388
393
VIRTIO_MSI_NO_VECTOR );
389
394
if (IS_ERR (vqs [i ])) {
390
395
err = PTR_ERR (vqs [i ]);
@@ -400,25 +405,24 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
400
405
401
406
/* the config->find_vqs() implementation */
402
407
int vp_find_vqs (struct virtio_device * vdev , unsigned int nvqs ,
403
- struct virtqueue * vqs [], vq_callback_t * callbacks [],
404
- const char * const names [], const bool * ctx ,
408
+ struct virtqueue * vqs [], struct virtqueue_info vqs_info [],
405
409
struct irq_affinity * desc )
406
410
{
407
411
int err ;
408
412
409
413
/* Try MSI-X with one vector per queue. */
410
- err = vp_find_vqs_msix (vdev , nvqs , vqs , callbacks , names , true, ctx , desc );
414
+ err = vp_find_vqs_msix (vdev , nvqs , vqs , vqs_info , true, desc );
411
415
if (!err )
412
416
return 0 ;
413
417
/* Fallback: MSI-X with one vector for config, one shared for queues. */
414
- err = vp_find_vqs_msix (vdev , nvqs , vqs , callbacks , names , false, ctx , desc );
418
+ err = vp_find_vqs_msix (vdev , nvqs , vqs , vqs_info , false, desc );
415
419
if (!err )
416
420
return 0 ;
417
421
/* Is there an interrupt? If not give up. */
418
422
if (!(to_vp_device (vdev )-> pci_dev -> irq ))
419
423
return err ;
420
424
/* Finally fall back to regular interrupts. */
421
- return vp_find_vqs_intx (vdev , nvqs , vqs , callbacks , names , ctx );
425
+ return vp_find_vqs_intx (vdev , nvqs , vqs , vqs_info );
422
426
}
423
427
424
428
const char * vp_bus_name (struct virtio_device * vdev )
0 commit comments