@@ -69,7 +69,8 @@ struct Ixgbe {
69
69
impl Ixgbe {
70
70
fn new ( ) -> Ixgbe {
71
71
unsafe {
72
- SASHSTORE = Some ( SashStore :: with_capacity ( 1 ) ) ;
72
+ // SASHSTORE = Some(SashStore::with_capacity((1 << 20)));
73
+ SASHSTORE = Some ( SashStore :: with_capacity ( 1 << 21 ) ) ;
73
74
}
74
75
75
76
Ixgbe {
@@ -198,6 +199,135 @@ impl pci_driver::PciDriver for Ixgbe {
198
199
}
199
200
}
200
201
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
+
201
331
#[ no_mangle]
202
332
pub fn ixgbe_init ( s : Box < dyn Syscall + Send + Sync > ,
203
333
heap : Box < dyn Heap + Send + Sync > ,
@@ -229,6 +359,8 @@ pub fn ixgbe_init(s: Box<dyn Syscall + Send + Sync>,
229
359
libbenchnet::run_tx_udptest(&ixgbe, 64, false);
230
360
}*/
231
361
362
+ //run_sashstoretest(&ixgbe, 64);
363
+
232
364
/*
233
365
for _ in 0..5 {
234
366
libbenchnet::run_rx_udptest_with_delay(&ixgbe, 64, false, 0);
@@ -270,7 +402,8 @@ pub fn ixgbe_init(s: Box<dyn Syscall + Send + Sync>,
270
402
271
403
// This function is called on panic.
272
404
#[ panic_handler]
273
- fn panic ( _info : & PanicInfo ) -> ! {
405
+ fn panic ( info : & PanicInfo ) -> ! {
406
+ println ! ( "{:?}" , info) ;
274
407
sys_backtrace ( ) ;
275
408
loop { }
276
409
}
0 commit comments