Skip to content

Commit e92cfa5

Browse files
727Hsjhuangshijia
andauthored
fix(vsock): defer receiving and update credit (#13)
- Increases ring buffer size from default to 32KB for vsock connections - Modifies event handling to notify upper layer of received data without reading it immediately - Adds explicit credit update triggers after recv operations --- Co-authored-by: huangshijia <[email protected]>
1 parent 16f1ae8 commit e92cfa5

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

axdriver_virtio/src/socket.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ impl<H: Hal, T: Transport> VirtIoSocketDev<H, T> {
2424
pub fn try_new(transport: T) -> DevResult<Self> {
2525
let virtio_socket = VirtIOSocket::<H, _>::new(transport).map_err(as_dev_err)?;
2626
Ok(Self {
27-
inner: InnerDev::new(virtio_socket),
27+
inner: InnerDev::new_with_capacity(virtio_socket, 32 * 1024), // 32KB buffer
2828
})
2929
}
3030
}
@@ -73,9 +73,12 @@ impl<H: Hal, T: Transport> VsockDriverOps for VirtIoSocketDev<H, T> {
7373

7474
fn recv(&mut self, cid: VsockConnId, buf: &mut [u8]) -> DevResult<usize> {
7575
let (peer_addr, src_port) = map_conn_id(cid);
76-
self.inner
76+
let res = self
77+
.inner
7778
.recv(peer_addr, src_port, buf)
78-
.map_err(as_dev_err)
79+
.map_err(as_dev_err);
80+
self.inner.update_credit(peer_addr, src_port);
81+
res
7982
}
8083

8184
fn recv_avail(&mut self, cid: VsockConnId) -> DevResult<usize> {
@@ -97,15 +100,15 @@ impl<H: Hal, T: Transport> VsockDriverOps for VirtIoSocketDev<H, T> {
97100
.map_err(as_dev_err)
98101
}
99102

100-
fn poll_event(&mut self, buf: &mut [u8]) -> DevResult<Option<VsockDriverEvent>> {
103+
fn poll_event(&mut self) -> DevResult<Option<VsockDriverEvent>> {
101104
match self.inner.poll() {
102105
Ok(None) => {
103106
// no event
104107
Ok(None)
105108
}
106109
Ok(Some(event)) => {
107110
// translate event
108-
let result = convert_vsock_event(event, &mut self.inner, buf)?;
111+
let result = convert_vsock_event(event, &mut self.inner)?;
109112
Ok(Some(result))
110113
}
111114
Err(e) => {
@@ -119,7 +122,6 @@ impl<H: Hal, T: Transport> VsockDriverOps for VirtIoSocketDev<H, T> {
119122
fn convert_vsock_event<H: Hal, T: Transport>(
120123
event: VsockEvent,
121124
inner: &mut InnerDev<H, T>,
122-
buf: &mut [u8],
123125
) -> DevResult<VsockDriverEvent> {
124126
let cid = VsockConnId {
125127
peer_addr: axdriver_vsock::VsockAddr {
@@ -133,10 +135,8 @@ fn convert_vsock_event<H: Hal, T: Transport>(
133135
VsockEventType::ConnectionRequest => Ok(VsockDriverEvent::ConnectionRequest(cid)),
134136
VsockEventType::Connected => Ok(VsockDriverEvent::Connected(cid)),
135137
VsockEventType::Received { length } => {
136-
let read = inner
137-
.recv(event.source, event.destination.port, &mut buf[..length])
138-
.map_err(as_dev_err)?;
139-
Ok(VsockDriverEvent::Received(cid, read))
138+
// Do not read data here, let the upper layer decide when to read.
139+
Ok(VsockDriverEvent::Received(cid, length))
140140
}
141141
VsockEventType::Disconnected { reason: _ } => Ok(VsockDriverEvent::Disconnected(cid)),
142142
_ => Ok(VsockDriverEvent::Unknown),

axdriver_vsock/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ pub trait VsockDriverOps: BaseDriverOps {
7979
fn abort(&mut self, cid: VsockConnId) -> DevResult<()>;
8080

8181
/// poll event from driver
82-
fn poll_event(&mut self, buf: &mut [u8]) -> DevResult<Option<VsockDriverEvent>>;
82+
fn poll_event(&mut self) -> DevResult<Option<VsockDriverEvent>>;
8383
}

0 commit comments

Comments
 (0)