Snap for 11037554 from f887fe9efd39635949325ef12078aa6498a422c9 to 24D1-release

Change-Id: I17b27311d15aeda36d1c565c67da9630993b10fa
diff --git a/src/main.rs b/src/main.rs
index 3f785a2..4325e64 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -234,13 +234,13 @@
         )
         .map_err(BackendError::CouldNotCreateDaemon)?;
 
-        let mut vring_workers = daemon.get_epoll_handlers();
+        let mut epoll_handlers = daemon.get_epoll_handlers();
 
         for thread in backend.threads.iter() {
             thread
                 .lock()
                 .unwrap()
-                .set_vring_worker(Some(vring_workers.remove(0)));
+                .register_listeners(epoll_handlers.remove(0));
         }
 
         daemon.start(listener).unwrap();
diff --git a/src/vhu_vsock_thread.rs b/src/vhu_vsock_thread.rs
index fcefc4a..850ad0c 100644
--- a/src/vhu_vsock_thread.rs
+++ b/src/vhu_vsock_thread.rs
@@ -63,8 +63,6 @@
     host_sock_path: String,
     /// Listener listening for new connections on the host.
     host_listener: UnixListener,
-    /// Instance of VringWorker.
-    vring_worker: Option<Arc<VringEpollHandler<ArcVhostBknd, VringRwLock, ()>>>,
     /// epoll fd to which new host connections are added.
     epoll_file: File,
     /// VsockThreadBackend instance.
@@ -151,7 +149,6 @@
             host_sock: host_sock.as_raw_fd(),
             host_sock_path: uds_path,
             host_listener: host_sock,
-            vring_worker: None,
             epoll_file,
             thread_backend,
             guest_cid,
@@ -242,20 +239,15 @@
         self.epoll_file.as_raw_fd()
     }
 
-    /// Set self's VringWorker.
-    pub fn set_vring_worker(
+    /// Register our listeners in the VringEpollHandler
+    pub fn register_listeners(
         &mut self,
-        vring_worker: Option<Arc<VringEpollHandler<ArcVhostBknd, VringRwLock, ()>>>,
+        epoll_handler: Arc<VringEpollHandler<ArcVhostBknd, VringRwLock, ()>>,
     ) {
-        self.vring_worker = vring_worker;
-        self.vring_worker
-            .as_ref()
-            .unwrap()
+        epoll_handler
             .register_listener(self.get_epoll_fd(), EventSet::IN, u64::from(BACKEND_EVENT))
             .unwrap();
-        self.vring_worker
-            .as_ref()
-            .unwrap()
+        epoll_handler
             .register_listener(
                 self.sibling_event_fd.as_raw_fd(),
                 EventSet::IN,
diff --git a/src/vsock_conn.rs b/src/vsock_conn.rs
index 058c2e1..0a766df 100644
--- a/src/vsock_conn.rs
+++ b/src/vsock_conn.rs
@@ -6,7 +6,7 @@
     os::unix::prelude::{AsRawFd, RawFd},
 };
 
-use log::info;
+use log::{error, info};
 use virtio_vsock::packet::{VsockPacket, PKT_HEADER_SIZE};
 use vm_memory::{bitmap::BitmapSlice, Bytes, VolatileSlice};
 
@@ -174,11 +174,22 @@
                         pkt.set_op(VSOCK_OP_RW).set_len(read_cnt as u32);
 
                         // Re-register the stream file descriptor for read and write events
-                        VhostUserVsockThread::epoll_register(
+                        if VhostUserVsockThread::epoll_modify(
                             self.epoll_fd,
                             self.stream.as_raw_fd(),
                             epoll::Events::EPOLLIN | epoll::Events::EPOLLOUT,
-                        )?;
+                        )
+                        .is_err()
+                        {
+                            if let Err(e) = VhostUserVsockThread::epoll_register(
+                                self.epoll_fd,
+                                self.stream.as_raw_fd(),
+                                epoll::Events::EPOLLIN | epoll::Events::EPOLLOUT,
+                            ) {
+                                // TODO: let's move this logic out of this func, and handle it properly
+                                error!("epoll_register failed: {:?}, but proceed further.", e);
+                            }
+                        };
                     }
 
                     // Update the rx_cnt with the amount of data in the vsock packet.
@@ -253,12 +264,14 @@
                 )
                 .is_err()
                 {
-                    VhostUserVsockThread::epoll_register(
+                    if let Err(e) = VhostUserVsockThread::epoll_register(
                         self.epoll_fd,
                         self.stream.as_raw_fd(),
                         epoll::Events::EPOLLIN | epoll::Events::EPOLLOUT,
-                    )
-                    .unwrap();
+                    ) {
+                        // TODO: let's move this logic out of this func, and handle it properly
+                        error!("epoll_register failed: {:?}, but proceed further.", e);
+                    }
                 };
             }
             VSOCK_OP_CREDIT_REQUEST => {
@@ -680,13 +693,15 @@
         );
 
         // VSOCK_OP_RW: finite data read from stream/file
-        conn_local.stream.write_all(b"hello").unwrap();
+        let payload = b"hello";
+        conn_local.stream.write_all(payload).unwrap();
         conn_local.rx_queue.enqueue(RxOps::Rw);
         let op_zero_read = conn_local.recv_pkt(&mut pkt);
-        // below error due to epoll add
-        assert!(op_zero_read.is_err());
+        assert!(op_zero_read.is_ok());
         assert_eq!(pkt.op(), VSOCK_OP_RW);
         assert!(!conn_local.rx_queue.pending_rx());
+        assert_eq!(conn_local.rx_cnt, Wrapping(payload.len() as u32));
+        assert_eq!(conn_local.last_fwd_cnt, Wrapping(1024));
         assert_eq!(pkt.len(), 5);
         let buf = &mut [0u8; 5];
         assert!(pkt.data_slice().unwrap().read_slice(buf, 0).is_ok());