@@ -56,8 +56,6 @@ struct vmci_guest_device {
56
56
57
57
bool exclusive_vectors ;
58
58
59
- struct tasklet_struct datagram_tasklet ;
60
- struct tasklet_struct bm_tasklet ;
61
59
struct wait_queue_head inout_wq ;
62
60
63
61
void * data_buffer ;
@@ -304,9 +302,8 @@ static int vmci_check_host_caps(struct pci_dev *pdev)
304
302
* This function assumes that it has exclusive access to the data
305
303
* in register(s) for the duration of the call.
306
304
*/
307
- static void vmci_dispatch_dgs (unsigned long data )
305
+ static void vmci_dispatch_dgs (struct vmci_guest_device * vmci_dev )
308
306
{
309
- struct vmci_guest_device * vmci_dev = (struct vmci_guest_device * )data ;
310
307
u8 * dg_in_buffer = vmci_dev -> data_buffer ;
311
308
struct vmci_datagram * dg ;
312
309
size_t dg_in_buffer_size = VMCI_MAX_DG_SIZE ;
@@ -465,10 +462,8 @@ static void vmci_dispatch_dgs(unsigned long data)
465
462
* Scans the notification bitmap for raised flags, clears them
466
463
* and handles the notifications.
467
464
*/
468
- static void vmci_process_bitmap (unsigned long data )
465
+ static void vmci_process_bitmap (struct vmci_guest_device * dev )
469
466
{
470
- struct vmci_guest_device * dev = (struct vmci_guest_device * )data ;
471
-
472
467
if (!dev -> notification_bitmap ) {
473
468
dev_dbg (dev -> dev , "No bitmap present in %s\n" , __func__ );
474
469
return ;
@@ -486,13 +481,13 @@ static irqreturn_t vmci_interrupt(int irq, void *_dev)
486
481
struct vmci_guest_device * dev = _dev ;
487
482
488
483
/*
489
- * If we are using MSI-X with exclusive vectors then we simply schedule
490
- * the datagram tasklet , since we know the interrupt was meant for us.
484
+ * If we are using MSI-X with exclusive vectors then we simply call
485
+ * vmci_dispatch_dgs() , since we know the interrupt was meant for us.
491
486
* Otherwise we must read the ICR to determine what to do.
492
487
*/
493
488
494
489
if (dev -> exclusive_vectors ) {
495
- tasklet_schedule ( & dev -> datagram_tasklet );
490
+ vmci_dispatch_dgs ( dev );
496
491
} else {
497
492
unsigned int icr ;
498
493
@@ -502,12 +497,12 @@ static irqreturn_t vmci_interrupt(int irq, void *_dev)
502
497
return IRQ_NONE ;
503
498
504
499
if (icr & VMCI_ICR_DATAGRAM ) {
505
- tasklet_schedule ( & dev -> datagram_tasklet );
500
+ vmci_dispatch_dgs ( dev );
506
501
icr &= ~VMCI_ICR_DATAGRAM ;
507
502
}
508
503
509
504
if (icr & VMCI_ICR_NOTIFICATION ) {
510
- tasklet_schedule ( & dev -> bm_tasklet );
505
+ vmci_process_bitmap ( dev );
511
506
icr &= ~VMCI_ICR_NOTIFICATION ;
512
507
}
513
508
@@ -536,7 +531,7 @@ static irqreturn_t vmci_interrupt_bm(int irq, void *_dev)
536
531
struct vmci_guest_device * dev = _dev ;
537
532
538
533
/* For MSI-X we can just assume it was meant for us. */
539
- tasklet_schedule ( & dev -> bm_tasklet );
534
+ vmci_process_bitmap ( dev );
540
535
541
536
return IRQ_HANDLED ;
542
537
}
@@ -638,10 +633,6 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
638
633
vmci_dev -> iobase = iobase ;
639
634
vmci_dev -> mmio_base = mmio_base ;
640
635
641
- tasklet_init (& vmci_dev -> datagram_tasklet ,
642
- vmci_dispatch_dgs , (unsigned long )vmci_dev );
643
- tasklet_init (& vmci_dev -> bm_tasklet ,
644
- vmci_process_bitmap , (unsigned long )vmci_dev );
645
636
init_waitqueue_head (& vmci_dev -> inout_wq );
646
637
647
638
if (mmio_base != NULL ) {
@@ -808,8 +799,9 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
808
799
* Request IRQ for legacy or MSI interrupts, or for first
809
800
* MSI-X vector.
810
801
*/
811
- error = request_irq (pci_irq_vector (pdev , 0 ), vmci_interrupt ,
812
- IRQF_SHARED , KBUILD_MODNAME , vmci_dev );
802
+ error = request_threaded_irq (pci_irq_vector (pdev , 0 ), NULL ,
803
+ vmci_interrupt , IRQF_SHARED ,
804
+ KBUILD_MODNAME , vmci_dev );
813
805
if (error ) {
814
806
dev_err (& pdev -> dev , "Irq %u in use: %d\n" ,
815
807
pci_irq_vector (pdev , 0 ), error );
@@ -823,19 +815,21 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
823
815
* between the vectors.
824
816
*/
825
817
if (vmci_dev -> exclusive_vectors ) {
826
- error = request_irq (pci_irq_vector (pdev , 1 ),
827
- vmci_interrupt_bm , 0 , KBUILD_MODNAME ,
828
- vmci_dev );
818
+ error = request_threaded_irq (pci_irq_vector (pdev , 1 ), NULL ,
819
+ vmci_interrupt_bm , 0 ,
820
+ KBUILD_MODNAME , vmci_dev );
829
821
if (error ) {
830
822
dev_err (& pdev -> dev ,
831
823
"Failed to allocate irq %u: %d\n" ,
832
824
pci_irq_vector (pdev , 1 ), error );
833
825
goto err_free_irq ;
834
826
}
835
827
if (caps_in_use & VMCI_CAPS_DMA_DATAGRAM ) {
836
- error = request_irq (pci_irq_vector (pdev , 2 ),
837
- vmci_interrupt_dma_datagram ,
838
- 0 , KBUILD_MODNAME , vmci_dev );
828
+ error = request_threaded_irq (pci_irq_vector (pdev , 2 ),
829
+ NULL ,
830
+ vmci_interrupt_dma_datagram ,
831
+ 0 , KBUILD_MODNAME ,
832
+ vmci_dev );
839
833
if (error ) {
840
834
dev_err (& pdev -> dev ,
841
835
"Failed to allocate irq %u: %d\n" ,
@@ -871,8 +865,6 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
871
865
872
866
err_free_irq :
873
867
free_irq (pci_irq_vector (pdev , 0 ), vmci_dev );
874
- tasklet_kill (& vmci_dev -> datagram_tasklet );
875
- tasklet_kill (& vmci_dev -> bm_tasklet );
876
868
877
869
err_disable_msi :
878
870
pci_free_irq_vectors (pdev );
@@ -943,9 +935,6 @@ static void vmci_guest_remove_device(struct pci_dev *pdev)
943
935
free_irq (pci_irq_vector (pdev , 0 ), vmci_dev );
944
936
pci_free_irq_vectors (pdev );
945
937
946
- tasklet_kill (& vmci_dev -> datagram_tasklet );
947
- tasklet_kill (& vmci_dev -> bm_tasklet );
948
-
949
938
if (vmci_dev -> notification_bitmap ) {
950
939
/*
951
940
* The device reset above cleared the bitmap state of the
0 commit comments