Hi David,
sorry for the absence. I attended a Workshop on SDN last week, and
today was quite a busy day.
I had a look in the interrupt branch of your mirage-platform repo,
cloned it and ran a few experiments.
The speeds I got were consistently between 2.45-2.6Gbps on my
machine (i7-3770, dual ch. DDR3 1600), which is a very good
number.
Unfortunatelly, I didn't have the time to further stress test it
and generate any TCP stack plots. This is the top item in my TODO
list.
I also went briefly through the additions/modifications in
hypervisor.c, main.c, activations.ml, netif.ml, main.ml
It seems that SCHEDOP_block + no-op handling + evtchn_poll +
VIRQ_TIMER-bind along with the rewriting of Activations (fix for
the silently dropped events) have done the trick.
A couple of questions:
- In file hypervisor.c, what is the purpose of "
force_evtchn_callback" ? I've seen it only being invoked via
"__sti()" and "__restore_flags()"
- In the updated design, when an event is received, then:
SCHEDOP_block returns,
event_poll is then invoked, and
finally Main.aux() is called.
Activations.run() is invoked in Main.aux() if no threads are
scheduled, and subsequently the domain is blocked again (until a
timer interrupt, or reception of another event). My question is
why don't we re-check right after "Activations.run()" the state of
t ? For example if packets are waiting to be sent, and netif gets
unblocked, why we block the domain directly again?
Also, thanks thanks for the credits in you updates :-)
D.
On 19/09/13 22:41, David Scott wrote:
Hi Dimos,
I've created a new patch set based on a mix of your ideas
and mine:
I've proposed switching to SCHEDOP_block with interrupts
enabled. Unlike in regular Mini-OS I don't think we need to do
anything in the hypervisor_callback, because we already have
code to poll the evtchn pending bits in evtchn_poll-- so we're
a bit of a hybrid: interrupts on for wakeups but the whole OS
is still based around a select/poll-style loop. I've left all
event channels unmasked and used the event_upcall_mask to turn
on/off event delivery globally. I've revamped the OCaml
Activations interface to remove one source of missing events.
So far the code is working ok in my testing. I ran
mirage-iperf and am getting 1642002 KBit/sec on my test
hardware -- I don't know if this is considered good or bad! I
ran your instrumented version (thanks for the exhaustive
instructions btw) and it drew some pretty graphs, but I'm not
enough of a TCP expert to interpret them properly.
Could you give this a go in your test environment and let
me know what you think?
I'm extremely suspicious of the console code -- it
shouldn't be necessary to include a delay in the print loop;
that's definitely worth investigating.
Cheers,
Dave
|