@@ -638,7 +638,7 @@ static bool __kvmgt_vgpu_exist(struct intel_vgpu *vgpu)
638638
639639 mutex_lock (& vgpu -> gvt -> lock );
640640 for_each_active_vgpu (vgpu -> gvt , itr , id ) {
641- if (!itr -> attached )
641+ if (!test_bit ( INTEL_VGPU_STATUS_ATTACHED , itr -> status ) )
642642 continue ;
643643
644644 if (vgpu -> vfio_device .kvm == itr -> vfio_device .kvm ) {
@@ -655,9 +655,6 @@ static int intel_vgpu_open_device(struct vfio_device *vfio_dev)
655655{
656656 struct intel_vgpu * vgpu = vfio_dev_to_vgpu (vfio_dev );
657657
658- if (vgpu -> attached )
659- return - EEXIST ;
660-
661658 if (!vgpu -> vfio_device .kvm ||
662659 vgpu -> vfio_device .kvm -> mm != current -> mm ) {
663660 gvt_vgpu_err ("KVM is required to use Intel vGPU\n" );
@@ -667,14 +664,14 @@ static int intel_vgpu_open_device(struct vfio_device *vfio_dev)
667664 if (__kvmgt_vgpu_exist (vgpu ))
668665 return - EEXIST ;
669666
670- vgpu -> attached = true;
671-
672667 vgpu -> track_node .track_write = kvmgt_page_track_write ;
673668 vgpu -> track_node .track_flush_slot = kvmgt_page_track_flush_slot ;
674669 kvm_get_kvm (vgpu -> vfio_device .kvm );
675670 kvm_page_track_register_notifier (vgpu -> vfio_device .kvm ,
676671 & vgpu -> track_node );
677672
673+ set_bit (INTEL_VGPU_STATUS_ATTACHED , vgpu -> status );
674+
678675 debugfs_create_ulong (KVMGT_DEBUGFS_FILENAME , 0444 , vgpu -> debugfs ,
679676 & vgpu -> nr_cache_entries );
680677
@@ -698,11 +695,10 @@ static void intel_vgpu_close_device(struct vfio_device *vfio_dev)
698695{
699696 struct intel_vgpu * vgpu = vfio_dev_to_vgpu (vfio_dev );
700697
701- if (!vgpu -> attached )
702- return ;
703-
704698 intel_gvt_release_vgpu (vgpu );
705699
700+ clear_bit (INTEL_VGPU_STATUS_ATTACHED , vgpu -> status );
701+
706702 debugfs_remove (debugfs_lookup (KVMGT_DEBUGFS_FILENAME , vgpu -> debugfs ));
707703
708704 kvm_page_track_unregister_notifier (vgpu -> vfio_device .kvm ,
@@ -718,8 +714,6 @@ static void intel_vgpu_close_device(struct vfio_device *vfio_dev)
718714 vgpu -> dma_addr_cache = RB_ROOT ;
719715
720716 intel_vgpu_release_msi_eventfd_ctx (vgpu );
721-
722- vgpu -> attached = false;
723717}
724718
725719static u64 intel_vgpu_get_bar_addr (struct intel_vgpu * vgpu , int bar )
@@ -1512,9 +1506,6 @@ static void intel_vgpu_remove(struct mdev_device *mdev)
15121506{
15131507 struct intel_vgpu * vgpu = dev_get_drvdata (& mdev -> dev );
15141508
1515- if (WARN_ON_ONCE (vgpu -> attached ))
1516- return ;
1517-
15181509 vfio_unregister_group_dev (& vgpu -> vfio_device );
15191510 vfio_put_device (& vgpu -> vfio_device );
15201511}
@@ -1559,7 +1550,7 @@ int intel_gvt_page_track_add(struct intel_vgpu *info, u64 gfn)
15591550 struct kvm_memory_slot * slot ;
15601551 int idx ;
15611552
1562- if (!info -> attached )
1553+ if (!test_bit ( INTEL_VGPU_STATUS_ATTACHED , info -> status ) )
15631554 return - ESRCH ;
15641555
15651556 idx = srcu_read_lock (& kvm -> srcu );
@@ -1589,8 +1580,8 @@ int intel_gvt_page_track_remove(struct intel_vgpu *info, u64 gfn)
15891580 struct kvm_memory_slot * slot ;
15901581 int idx ;
15911582
1592- if (!info -> attached )
1593- return 0 ;
1583+ if (!test_bit ( INTEL_VGPU_STATUS_ATTACHED , info -> status ) )
1584+ return - ESRCH ;
15941585
15951586 idx = srcu_read_lock (& kvm -> srcu );
15961587 slot = gfn_to_memslot (kvm , gfn );
@@ -1668,7 +1659,7 @@ int intel_gvt_dma_map_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
16681659 struct gvt_dma * entry ;
16691660 int ret ;
16701661
1671- if (!vgpu -> attached )
1662+ if (!test_bit ( INTEL_VGPU_STATUS_ATTACHED , vgpu -> status ) )
16721663 return - EINVAL ;
16731664
16741665 mutex_lock (& vgpu -> cache_lock );
@@ -1714,8 +1705,8 @@ int intel_gvt_dma_pin_guest_page(struct intel_vgpu *vgpu, dma_addr_t dma_addr)
17141705 struct gvt_dma * entry ;
17151706 int ret = 0 ;
17161707
1717- if (!vgpu -> attached )
1718- return - ENODEV ;
1708+ if (!test_bit ( INTEL_VGPU_STATUS_ATTACHED , vgpu -> status ) )
1709+ return - EINVAL ;
17191710
17201711 mutex_lock (& vgpu -> cache_lock );
17211712 entry = __gvt_cache_find_dma_addr (vgpu , dma_addr );
@@ -1742,7 +1733,7 @@ void intel_gvt_dma_unmap_guest_page(struct intel_vgpu *vgpu,
17421733{
17431734 struct gvt_dma * entry ;
17441735
1745- if (!vgpu -> attached )
1736+ if (!test_bit ( INTEL_VGPU_STATUS_ATTACHED , vgpu -> status ) )
17461737 return ;
17471738
17481739 mutex_lock (& vgpu -> cache_lock );
@@ -1778,7 +1769,7 @@ static void intel_gvt_test_and_emulate_vblank(struct intel_gvt *gvt)
17781769 idr_for_each_entry ((& (gvt )-> vgpu_idr ), (vgpu ), (id )) {
17791770 if (test_and_clear_bit (INTEL_GVT_REQUEST_EMULATE_VBLANK + id ,
17801771 (void * )& gvt -> service_request )) {
1781- if (vgpu -> active )
1772+ if (test_bit ( INTEL_VGPU_STATUS_ACTIVE , vgpu -> status ) )
17821773 intel_vgpu_emulate_vblank (vgpu );
17831774 }
17841775 }
0 commit comments