Skip to content

Commit 7cb1f62

Browse files
zhaofengliarkivm
authored andcommitted
ixgbe: Add sashstore test back
1 parent b5140b2 commit 7cb1f62

File tree

1 file changed

+135
-2
lines changed

1 file changed

+135
-2
lines changed

sys/driver/ixgbe/src/lib.rs

Lines changed: 135 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ struct Ixgbe {
6969
impl Ixgbe {
7070
fn new() -> Ixgbe {
7171
unsafe {
72-
SASHSTORE = Some(SashStore::with_capacity(1));
72+
// SASHSTORE = Some(SashStore::with_capacity((1 << 20)));
73+
SASHSTORE = Some(SashStore::with_capacity(1 << 21));
7374
}
7475

7576
Ixgbe {
@@ -198,6 +199,135 @@ impl pci_driver::PciDriver for Ixgbe {
198199
}
199200
}
200201

202+
fn run_sashstoretest(dev: &Ixgbe, pkt_size: u16) {
203+
let batch_sz = 32;
204+
let mut rx_packets: VecDeque<Vec<u8>> = VecDeque::with_capacity(batch_sz);
205+
let mut tx_packets: VecDeque<Vec<u8>> = VecDeque::with_capacity(batch_sz);
206+
let mut submit_rx_hist = Base2Histogram::new();
207+
let mut submit_tx_hist = Base2Histogram::new();
208+
209+
for i in 0..batch_sz {
210+
rx_packets.push_front(Vec::with_capacity(2048));
211+
}
212+
213+
if let Some(device) = dev.device.borrow_mut().as_mut() {
214+
let idev: &mut Intel8259x = device;
215+
let mut sum: usize = 0;
216+
let mut fwd_sum: usize = 0;
217+
218+
let start = rdtsc();
219+
let end = start + 60 * 2_600_000_000;
220+
221+
let mut tx_elapsed = 0;
222+
let mut rx_elapsed = 0;
223+
224+
let mut submit_rx: usize = 0;
225+
let mut submit_tx: usize = 0;
226+
let mut loop_count: usize = 0;
227+
228+
loop {
229+
loop_count = loop_count.wrapping_add(1);
230+
231+
submit_rx += rx_packets.len();
232+
submit_rx_hist.record(rx_packets.len() as u64);
233+
//println!("call rx_submit_poll packet {}", packets.len());
234+
let rx_start = rdtsc();
235+
let ret = idev.device.submit_and_poll(&mut rx_packets, &mut tx_packets, false, false);
236+
rx_elapsed += rdtsc() - rx_start;
237+
sum += ret;
238+
239+
for mut pkt in tx_packets.iter_mut() {
240+
if let Some((padding, payload)) = packettool::get_mut_udp_payload(pkt) {
241+
if let Some(mut sashstore) = unsafe { SASHSTORE.as_mut() } {
242+
let payloadptr = payload as *mut _ as *mut u8;
243+
let mut payloadvec = unsafe {
244+
Vec::from_raw_parts(
245+
payloadptr,
246+
payload.len(),
247+
2048 - padding, // FIXME: Awful
248+
)
249+
};
250+
251+
// println!("Before handle: payloadvec.capacity() = {}, len() = {}", payloadvec.capacity(), payloadvec.len());
252+
let responsevec = unsafe { sashstore.handle_network_request(payloadvec) };
253+
254+
// assert!(responsevec.as_ptr() == payloadptr);
255+
// println!("Handled: {:x?} -> {:x?}", responsevec.as_ptr(), payloadptr);
256+
// println!("After handle: responsevec.capacity() = {}, len() = {}", responsevec.capacity(), responsevec.len());
257+
if responsevec.as_ptr() != payloadptr {
258+
unsafe {
259+
ptr::copy(responsevec.as_ptr(), payloadptr, responsevec.len());
260+
}
261+
}
262+
263+
// println!("Before set_len: {}", pkt.len());
264+
unsafe {
265+
pkt.set_len(padding + responsevec.len());
266+
}
267+
// println!("After set_len: padding={}, resposevec.len() = {}, set to {}", padding, responsevec.len(), pkt.len());
268+
269+
packettool::swap_udp_ips(pkt);
270+
packettool::swap_mac(pkt);
271+
packettool::fix_ip_length(pkt);
272+
packettool::fix_ip_checksum(pkt);
273+
packettool::fix_udp_length(pkt);
274+
packettool::fix_udp_checksum(pkt);
275+
276+
// println!("To send: {:x?}", pkt);
277+
} else {
278+
println!("No sashstore???");
279+
}
280+
} else {
281+
// println!("Not a UDP packet: {:x?}", &pkt);
282+
}
283+
}
284+
285+
submit_tx += tx_packets.len();
286+
submit_tx_hist.record(tx_packets.len() as u64);
287+
let tx_start = rdtsc();
288+
let ret = idev.device.submit_and_poll(&mut tx_packets, &mut rx_packets, true, false);
289+
tx_elapsed += rdtsc() - tx_start;
290+
fwd_sum += ret;
291+
292+
//print!("tx: submitted {} collect {}\n", ret, rx_packets.len());
293+
294+
if rx_packets.len() == 0 && tx_packets.len() < batch_sz * 4 {
295+
//println!("-> Allocating new rx_ptx batch");
296+
for i in 0..batch_sz {
297+
rx_packets.push_front(Vec::with_capacity(2048));
298+
}
299+
}
300+
301+
if rdtsc() > end {
302+
break;
303+
}
304+
}
305+
306+
let elapsed = rdtsc() - start;
307+
for hist in alloc::vec![submit_rx_hist, submit_tx_hist] {
308+
println!("hist:");
309+
// Iterate buckets that have observations
310+
for bucket in hist.iter().filter(|b| b.count > 0) {
311+
print!("({:5}, {:5}): {}", bucket.start, bucket.end, bucket.count);
312+
print!("\n");
313+
}
314+
}
315+
316+
sashstore_redleaf::indexmap::print_stats();
317+
318+
println!("Received {} forwarded {}", sum, fwd_sum);
319+
println!(" ==> submit_rx {} (avg {}) submit_tx {} (avg {}) loop_count {}",
320+
submit_rx, submit_rx / loop_count, submit_tx, submit_tx / loop_count, loop_count);
321+
println!(" ==> rx batching {}B: {} packets took {} cycles (avg = {})",
322+
pkt_size, sum, rx_elapsed, rx_elapsed / sum as u64);
323+
println!(" ==> tx batching {}B: {} packets took {} cycles (avg = {})",
324+
pkt_size, fwd_sum, tx_elapsed, tx_elapsed / fwd_sum as u64);
325+
println!("==> fwd batch {}B: {} iterations took {} cycles (avg = {})", pkt_size, fwd_sum, elapsed, elapsed / fwd_sum as u64);
326+
idev.dump_stats();
327+
//dev.dump_tx_descs();
328+
}
329+
}
330+
201331
#[no_mangle]
202332
pub fn ixgbe_init(s: Box<dyn Syscall + Send + Sync>,
203333
heap: Box<dyn Heap + Send + Sync>,
@@ -229,6 +359,8 @@ pub fn ixgbe_init(s: Box<dyn Syscall + Send + Sync>,
229359
libbenchnet::run_tx_udptest(&ixgbe, 64, false);
230360
}*/
231361

362+
//run_sashstoretest(&ixgbe, 64);
363+
232364
/*
233365
for _ in 0..5 {
234366
libbenchnet::run_rx_udptest_with_delay(&ixgbe, 64, false, 0);
@@ -270,7 +402,8 @@ pub fn ixgbe_init(s: Box<dyn Syscall + Send + Sync>,
270402

271403
// This function is called on panic.
272404
#[panic_handler]
273-
fn panic(_info: &PanicInfo) -> ! {
405+
fn panic(info: &PanicInfo) -> ! {
406+
println!("{:?}", info);
274407
sys_backtrace();
275408
loop {}
276409
}

0 commit comments

Comments
 (0)