@@ -124,26 +124,6 @@ impl Vcpu {
124124 } )
125125 }
126126
127- /// Deassociates `self` from the current thread.
128- ///
129- /// Should be called if the current `self` had called `init_thread_local_data()` and
130- /// now needs to move to a different thread.
131- ///
132- /// Fails if `self` was not previously associated with the current thread.
133- fn reset_thread_local_data ( & mut self ) -> Result < ( ) , VcpuError > {
134- // Best-effort to clean up TLS. If the `Vcpu` was moved to another thread
135- // _before_ running this, then there is nothing we can do.
136- Self :: TLS_VCPU_PTR . with ( |cell : & VcpuCell | {
137- if let Some ( vcpu_ptr) = cell. get ( ) {
138- if std:: ptr:: eq ( vcpu_ptr, self ) {
139- Self :: TLS_VCPU_PTR . with ( |cell : & VcpuCell | cell. take ( ) ) ;
140- return Ok ( ( ) ) ;
141- }
142- }
143- Err ( VcpuError :: VcpuTlsNotPresent )
144- } )
145- }
146-
147127 /// Runs `func` for the `Vcpu` associated with the current thread.
148128 ///
149129 /// It requires that `init_thread_local_data()` was run on this thread.
@@ -615,7 +595,25 @@ fn handle_kvm_exit(
615595
616596impl Drop for Vcpu {
617597 fn drop ( & mut self ) {
618- let _ = self . reset_thread_local_data ( ) ;
598+ Self :: TLS_VCPU_PTR . with ( |cell| {
599+ // The reason for not asserting TLS being set here is that
600+ // it can happen that Vcpu::Drop is called on vcpus which never were
601+ // put on their threads. This can happen if some error occurs during Vmm
602+ // setup before `start_threaded` call.
603+ if let Some ( vcpu_ptr) = cell. get ( ) {
604+ // During normal runtime there is a strong assumption that vcpus will be
605+ // put on their own threads, thus TLS will be initialized with the
606+ // correct pointer.
607+ // In test we do not put vcpus on separate threads, so TLS will have a value
608+ // of the last created vcpu.
609+ #[ cfg( not( test) ) ]
610+ assert ! ( std:: ptr:: eq( vcpu_ptr, self ) ) ;
611+
612+ // Have to do this trick because `update` method is
613+ // not stable on Cell.
614+ Self :: TLS_VCPU_PTR . with ( |cell| cell. take ( ) ) ;
615+ }
616+ } )
619617 }
620618}
621619
@@ -1039,15 +1037,12 @@ pub(crate) mod tests {
10391037 }
10401038
10411039 // Reset vcpu TLS.
1042- vcpu . reset_thread_local_data ( ) . unwrap ( ) ;
1040+ Vcpu :: TLS_VCPU_PTR . with ( |cell| cell . take ( ) ) ;
10431041
10441042 // Running on the TLS vcpu after TLS reset should fail.
10451043 unsafe {
10461044 Vcpu :: run_on_thread_local ( |_| ( ) ) . unwrap_err ( ) ;
10471045 }
1048-
1049- // Second reset should return error.
1050- vcpu. reset_thread_local_data ( ) . unwrap_err ( ) ;
10511046 }
10521047
10531048 #[ test]
0 commit comments