@@ -85,6 +85,8 @@ static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl,
8585static int hardware_enable_all (void );
8686static void hardware_disable_all (void );
8787
88+ static void kvm_io_bus_destroy (struct kvm_io_bus * bus );
89+
8890static bool kvm_rebooting ;
8991
9092static bool largepages_enabled = true;
@@ -367,7 +369,7 @@ static int kvm_init_mmu_notifier(struct kvm *kvm)
367369
368370static struct kvm * kvm_create_vm (void )
369371{
370- int r = 0 ;
372+ int r = 0 , i ;
371373 struct kvm * kvm = kvm_arch_create_vm ();
372374#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
373375 struct page * page ;
@@ -391,6 +393,14 @@ static struct kvm *kvm_create_vm(void)
391393 goto out_err ;
392394 if (init_srcu_struct (& kvm -> srcu ))
393395 goto out_err ;
396+ for (i = 0 ; i < KVM_NR_BUSES ; i ++ ) {
397+ kvm -> buses [i ] = kzalloc (sizeof (struct kvm_io_bus ),
398+ GFP_KERNEL );
399+ if (!kvm -> buses [i ]) {
400+ cleanup_srcu_struct (& kvm -> srcu );
401+ goto out_err ;
402+ }
403+ }
394404
395405#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
396406 page = alloc_page (GFP_KERNEL | __GFP_ZERO );
@@ -416,11 +426,9 @@ static struct kvm *kvm_create_vm(void)
416426 atomic_inc (& kvm -> mm -> mm_count );
417427 spin_lock_init (& kvm -> mmu_lock );
418428 spin_lock_init (& kvm -> requests_lock );
419- kvm_io_bus_init (& kvm -> pio_bus );
420429 kvm_eventfd_init (kvm );
421430 mutex_init (& kvm -> lock );
422431 mutex_init (& kvm -> irq_lock );
423- kvm_io_bus_init (& kvm -> mmio_bus );
424432 init_rwsem (& kvm -> slots_lock );
425433 atomic_set (& kvm -> users_count , 1 );
426434 spin_lock (& kvm_lock );
@@ -435,6 +443,8 @@ static struct kvm *kvm_create_vm(void)
435443out_err :
436444 hardware_disable_all ();
437445out_err_nodisable :
446+ for (i = 0 ; i < KVM_NR_BUSES ; i ++ )
447+ kfree (kvm -> buses [i ]);
438448 kfree (kvm -> memslots );
439449 kfree (kvm );
440450 return ERR_PTR (r );
@@ -480,15 +490,16 @@ void kvm_free_physmem(struct kvm *kvm)
480490
481491static void kvm_destroy_vm (struct kvm * kvm )
482492{
493+ int i ;
483494 struct mm_struct * mm = kvm -> mm ;
484495
485496 kvm_arch_sync_events (kvm );
486497 spin_lock (& kvm_lock );
487498 list_del (& kvm -> vm_list );
488499 spin_unlock (& kvm_lock );
489500 kvm_free_irq_routing (kvm );
490- kvm_io_bus_destroy ( & kvm -> pio_bus );
491- kvm_io_bus_destroy (& kvm -> mmio_bus );
501+ for ( i = 0 ; i < KVM_NR_BUSES ; i ++ )
502+ kvm_io_bus_destroy (kvm -> buses [ i ] );
492503 kvm_coalesced_mmio_free (kvm );
493504#if defined(CONFIG_MMU_NOTIFIER ) && defined(KVM_ARCH_WANT_MMU_NOTIFIER )
494505 mmu_notifier_unregister (& kvm -> mmu_notifier , kvm -> mm );
@@ -1949,12 +1960,7 @@ static struct notifier_block kvm_reboot_notifier = {
19491960 .priority = 0 ,
19501961};
19511962
1952- void kvm_io_bus_init (struct kvm_io_bus * bus )
1953- {
1954- memset (bus , 0 , sizeof (* bus ));
1955- }
1956-
1957- void kvm_io_bus_destroy (struct kvm_io_bus * bus )
1963+ static void kvm_io_bus_destroy (struct kvm_io_bus * bus )
19581964{
19591965 int i ;
19601966
@@ -1963,73 +1969,87 @@ void kvm_io_bus_destroy(struct kvm_io_bus *bus)
19631969
19641970 kvm_iodevice_destructor (pos );
19651971 }
1972+ kfree (bus );
19661973}
19671974
19681975/* kvm_io_bus_write - called under kvm->slots_lock */
1969- int kvm_io_bus_write (struct kvm_io_bus * bus , gpa_t addr ,
1976+ int kvm_io_bus_write (struct kvm * kvm , enum kvm_bus bus_idx , gpa_t addr ,
19701977 int len , const void * val )
19711978{
19721979 int i ;
1980+ struct kvm_io_bus * bus = rcu_dereference (kvm -> buses [bus_idx ]);
19731981 for (i = 0 ; i < bus -> dev_count ; i ++ )
19741982 if (!kvm_iodevice_write (bus -> devs [i ], addr , len , val ))
19751983 return 0 ;
19761984 return - EOPNOTSUPP ;
19771985}
19781986
19791987/* kvm_io_bus_read - called under kvm->slots_lock */
1980- int kvm_io_bus_read (struct kvm_io_bus * bus , gpa_t addr , int len , void * val )
1988+ int kvm_io_bus_read (struct kvm * kvm , enum kvm_bus bus_idx , gpa_t addr ,
1989+ int len , void * val )
19811990{
19821991 int i ;
1992+ struct kvm_io_bus * bus = rcu_dereference (kvm -> buses [bus_idx ]);
1993+
19831994 for (i = 0 ; i < bus -> dev_count ; i ++ )
19841995 if (!kvm_iodevice_read (bus -> devs [i ], addr , len , val ))
19851996 return 0 ;
19861997 return - EOPNOTSUPP ;
19871998}
19881999
1989- int kvm_io_bus_register_dev (struct kvm * kvm , struct kvm_io_bus * bus ,
1990- struct kvm_io_device * dev )
2000+ /* Caller must have write lock on slots_lock. */
2001+ int kvm_io_bus_register_dev (struct kvm * kvm , enum kvm_bus bus_idx ,
2002+ struct kvm_io_device * dev )
19912003{
1992- int ret ;
1993-
1994- down_write (& kvm -> slots_lock );
1995- ret = __kvm_io_bus_register_dev (bus , dev );
1996- up_write (& kvm -> slots_lock );
2004+ struct kvm_io_bus * new_bus , * bus ;
19972005
1998- return ret ;
1999- }
2000-
2001- /* An unlocked version. Caller must have write lock on slots_lock. */
2002- int __kvm_io_bus_register_dev (struct kvm_io_bus * bus ,
2003- struct kvm_io_device * dev )
2004- {
2006+ bus = kvm -> buses [bus_idx ];
20052007 if (bus -> dev_count > NR_IOBUS_DEVS - 1 )
20062008 return - ENOSPC ;
20072009
2008- bus -> devs [bus -> dev_count ++ ] = dev ;
2010+ new_bus = kzalloc (sizeof (struct kvm_io_bus ), GFP_KERNEL );
2011+ if (!new_bus )
2012+ return - ENOMEM ;
2013+ memcpy (new_bus , bus , sizeof (struct kvm_io_bus ));
2014+ new_bus -> devs [new_bus -> dev_count ++ ] = dev ;
2015+ rcu_assign_pointer (kvm -> buses [bus_idx ], new_bus );
2016+ synchronize_srcu_expedited (& kvm -> srcu );
2017+ kfree (bus );
20092018
20102019 return 0 ;
20112020}
20122021
2013- void kvm_io_bus_unregister_dev ( struct kvm * kvm ,
2014- struct kvm_io_bus * bus ,
2015- struct kvm_io_device * dev )
2022+ /* Caller must have write lock on slots_lock. */
2023+ int kvm_io_bus_unregister_dev ( struct kvm * kvm , enum kvm_bus bus_idx ,
2024+ struct kvm_io_device * dev )
20162025{
2017- down_write (& kvm -> slots_lock );
2018- __kvm_io_bus_unregister_dev (bus , dev );
2019- up_write (& kvm -> slots_lock );
2020- }
2026+ int i , r ;
2027+ struct kvm_io_bus * new_bus , * bus ;
20212028
2022- /* An unlocked version. Caller must have write lock on slots_lock. */
2023- void __kvm_io_bus_unregister_dev (struct kvm_io_bus * bus ,
2024- struct kvm_io_device * dev )
2025- {
2026- int i ;
2029+ new_bus = kzalloc (sizeof (struct kvm_io_bus ), GFP_KERNEL );
2030+ if (!new_bus )
2031+ return - ENOMEM ;
20272032
2028- for (i = 0 ; i < bus -> dev_count ; i ++ )
2029- if (bus -> devs [i ] == dev ) {
2030- bus -> devs [i ] = bus -> devs [-- bus -> dev_count ];
2033+ bus = kvm -> buses [bus_idx ];
2034+ memcpy (new_bus , bus , sizeof (struct kvm_io_bus ));
2035+
2036+ r = - ENOENT ;
2037+ for (i = 0 ; i < new_bus -> dev_count ; i ++ )
2038+ if (new_bus -> devs [i ] == dev ) {
2039+ r = 0 ;
2040+ new_bus -> devs [i ] = new_bus -> devs [-- new_bus -> dev_count ];
20312041 break ;
20322042 }
2043+
2044+ if (r ) {
2045+ kfree (new_bus );
2046+ return r ;
2047+ }
2048+
2049+ rcu_assign_pointer (kvm -> buses [bus_idx ], new_bus );
2050+ synchronize_srcu_expedited (& kvm -> srcu );
2051+ kfree (bus );
2052+ return r ;
20332053}
20342054
20352055static struct notifier_block kvm_cpu_notifier = {
0 commit comments