[ovs-dev] [TCP_CRR 1/6] dpif-linux: Remove poll_fd_woke() optimization from dpif_linux_recv().
Ben Pfaff
blp at nicira.com
Thu Nov 24 18:05:53 UTC 2011
Maybe the commit message is badly phrased: the change that this
*reverts* yields a 37% benefit, so this patch actually yields a 37%
*slowdown*. But it's a necessary prerequisite for the later
improvements.
I'll reword the commit message.
On Thu, Nov 24, 2011 at 09:05:08AM -0800, Justin Pettit wrote:
> Wow. Great catch.
>
> The description says it stopped calling poll_fd_woke() (which it's
> ultimately doing), but the call in this function is nl_sock_woke().
>
> It might be nice to explain why this improvement works over a
> theoretical optimization.
>
> --Justin
>
>
> On Nov 22, 2011, at 3:12 PM, Ben Pfaff wrote:
>
> > This optimization on its own provides about 37% benefit against a
> > load of a single netperf CRR test, but at the same time it penalizes
> > ovs-benchmark by about 11%. We can get back the CRR performance
> > loss, and more, other ways, so the first step is to revert this
> > patch.
> > ---
> > lib/dpif-linux.c | 47 +++++++++++++++++++++++------------------------
> > 1 files changed, 23 insertions(+), 24 deletions(-)
> >
> > diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
> > index 88193c3..4b4ac55 100644
> > --- a/lib/dpif-linux.c
> > +++ b/lib/dpif-linux.c
> > @@ -1097,39 +1097,38 @@ dpif_linux_recv(struct dpif *dpif_, struct dpif_upcall *upcall)
> >
> > for (i = 0; i < N_UPCALL_SOCKS; i++) {
> > struct nl_sock *upcall_sock;
> > + int dp_ifindex;
> > +
> > dpif->last_read_upcall = (dpif->last_read_upcall + 1) &
> > (N_UPCALL_SOCKS - 1);
> > upcall_sock = dpif->upcall_socks[dpif->last_read_upcall];
> >
> > - if (nl_sock_woke(upcall_sock)) {
> > - int dp_ifindex;
> >
> > - for (;;) {
> > - struct ofpbuf *buf;
> > - int error;
> > + for (;;) {
> > + struct ofpbuf *buf;
> > + int error;
> >
> > - if (++read_tries > 50) {
> > - return EAGAIN;
> > - }
> > + if (++read_tries > 50) {
> > + return EAGAIN;
> > + }
> >
> > - error = nl_sock_recv(upcall_sock, &buf, false);
> > - if (error == EAGAIN) {
> > - break;
> > - } else if (error) {
> > - return error;
> > - }
> > + error = nl_sock_recv(upcall_sock, &buf, false);
> > + if (error == EAGAIN) {
> > + break;
> > + } else if (error) {
> > + return error;
> > + }
> >
> > - error = parse_odp_packet(buf, upcall, &dp_ifindex);
> > - if (!error
> > - && dp_ifindex == dpif->dp_ifindex
> > - && dpif->listen_mask & (1u << upcall->type)) {
> > - return 0;
> > - }
> > + error = parse_odp_packet(buf, upcall, &dp_ifindex);
> > + if (!error
> > + && dp_ifindex == dpif->dp_ifindex
> > + && dpif->listen_mask & (1u << upcall->type)) {
> > + return 0;
> > + }
> >
> > - ofpbuf_delete(buf);
> > - if (error) {
> > - return error;
> > - }
> > + ofpbuf_delete(buf);
> > + if (error) {
> > + return error;
> > }
> > }
> > }
> > --
> > 1.7.4.4
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list