@@ -149,7 +149,7 @@ func (m *MemoryManager) DeregisterVM(vmID string) error {
149149}
150150
151151// Activate Creates an epoller to serve page faults for the VM
152- func (m * MemoryManager ) Activate (vmID string ) error {
152+ func (m * MemoryManager ) Activate (vmID string , conn * net. UnixConn ) error {
153153 logger := log .WithFields (log.Fields {"vmID" : vmID })
154154
155155 logger .Debug ("Activating instance in the memory manager" )
@@ -164,14 +164,6 @@ func (m *MemoryManager) Activate(vmID string) error {
164164
165165 logger .Debug ("TEST: Activate: fetch snapstate by vmID for UFFD" )
166166
167- // originID, ok := m.origins[vmID]
168-
169- // if !ok {
170- // logger.Debug("TEST: not loaded from snapshot")
171- // }
172-
173- // state, ok = m.instances[originID]
174-
175167 state , ok = m .instances [vmID ]
176168
177169 if ! ok {
@@ -187,29 +179,21 @@ func (m *MemoryManager) Activate(vmID string) error {
187179 return errors .New ("VM already active" )
188180 }
189181
190- select {
191- case <- m .startEpollingCh :
192- if err := state .mapGuestMemory (); err != nil {
193- logger .Error ("Failed to map guest memory" )
194- return err
195- }
196-
197- if err := state .getUFFD (); err != nil {
198- logger .Error ("Failed to get uffd" )
199- return err
200- }
182+ if err := state .mapGuestMemory (); err != nil {
183+ logger .Error ("Failed to map guest memory" )
184+ return err
185+ }
201186
202- state .setupStateOnActivate ()
187+ if err := state .getUFFD (conn ); err != nil {
188+ logger .Error ("Failed to get uffd" )
189+ return err
190+ }
203191
204- go state .pollUserPageFaults ( readyCh )
192+ state .setupStateOnActivate ( )
205193
206- <- readyCh
194+ go state . pollUserPageFaults ( readyCh )
207195
208- case <- time .After (100 * time .Second ):
209- return errors .New ("Uffd connection to firecracker timeout" )
210- default :
211- return errors .New ("Failed to start epoller" )
212- }
196+ <- readyCh
213197
214198 return nil
215199}
@@ -409,37 +393,25 @@ func (m *MemoryManager) GetUPFLatencyStats(vmID string) ([]*metrics.Metric, erro
409393 return state .latencyMetrics , nil
410394}
411395
412- func (m * MemoryManager ) ListenUffdSocket ( uffdSockAddr string ) error {
413- log .Debug ( "Start listening to uffd socket" )
396+ func (m * MemoryManager ) ListenUffd ( vmID string , uffdSockAddr string ) ( * net. UnixConn , error ) {
397+ logger := log .WithFields (log. Fields { "vmID" : vmID } )
414398
415- m .startEpollingOnce .Do (func () {
416- m .startEpollingCh = make (chan struct {})
417- })
399+ logger .Debug ("listening to uffd" )
418400
419- ln , err := net .Listen ("unix" , uffdSockAddr )
420- if err != nil {
421- log .Errorf ("Failed to listen on uffd socket: %v" , err )
422- return errors .New ("Failed to listen on uffd socket" )
423- }
424- defer ln .Close ()
401+ m .Lock ()
425402
426- for {
427- conn , err := ln .Accept ()
428- if err != nil {
429- log .Printf ("Failed to accept connection on uffd socket: %v" , err )
430- continue
431- }
432- go func (conn net.Conn ) {
433- defer conn .Close ()
434- if err := ln .Close (); err != nil {
435- log .Printf ("Failed to close uffd socket listener: %v" , err )
436- }
437- close (m .startEpollingCh )
438- }(conn )
439- break
403+ state , ok := m .instances [vmID ]
404+ if ! ok {
405+ m .Unlock ()
406+ logger .Error ("VM not registered with the memory manager" )
407+ return nil , errors .New ("VM not registered with the memory manager" )
440408 }
441409
442- return nil
410+ m .Unlock ()
411+
412+ conn , _ := state .ListenUffdSocket (uffdSockAddr )
413+
414+ return conn , nil
443415}
444416
445417// Deprecated
0 commit comments