]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: stream_interface: Avoid calling si_cs_send/recv if not needed.
authorOlivier Houchard <ohouchard@haproxy.com>
Mon, 22 Oct 2018 14:01:09 +0000 (16:01 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 22 Oct 2018 14:05:08 +0000 (16:05 +0200)
Don't bother calling si_cs_send and si_cs_recv if we're either already
subscribe, or if the output buffer is empty for si_cs_send.

src/stream.c
src/stream_interface.c

index 200556fe42b88dd21e58fa3641110f42278a7444..8df5c75639d20c8b7787420e5f644d4a13fc9bae 100644 (file)
@@ -1670,12 +1670,20 @@ struct task *process_stream(struct task *t, void *context, unsigned short state)
        /* First, attempd to do I/Os */
        cs = objt_cs(si_f->end);
        if (cs) {
-               si_cs_send(cs);
-               si_cs_recv(cs);
+               if (!(si_f->wait_event.wait_reason & SUB_CAN_SEND) &&
+                   co_data(si_oc(si_f)))
+                       si_cs_send(cs);
+               if (!(si_f->wait_event.wait_reason & SUB_CAN_RECV) &&
+                   !(si_f->flags & SI_FL_WAIT_ROOM))
+                       si_cs_recv(cs);
        }
        cs = objt_cs(si_b->end);
        if (cs) {
-               si_cs_send(cs);
+               if (!(si_b->wait_event.wait_reason & SUB_CAN_SEND) &&
+                   co_data(si_oc(si_b)))
+                       si_cs_send(cs);
+               if (!(si_b->wait_event.wait_reason & SUB_CAN_RECV) &&
+                   !(si_b->flags & SI_FL_WAIT_ROOM))
                si_cs_recv(cs);
        }
 redo:
@@ -2447,11 +2455,17 @@ redo:
                cs = objt_cs(si_f->end);
                ret = 0;
                if (cs && !(cs->conn->flags & CO_FL_ERROR) &&
-                   !(cs->flags & CS_FL_ERROR) && !(si_oc(si_f)->flags & CF_SHUTW))
+                   !(cs->flags & CS_FL_ERROR) &&
+                   !(si_oc(si_f)->flags & CF_SHUTW) &&
+                   !(si_f->wait_event.wait_reason & SUB_CAN_SEND) &&
+                   co_data(si_oc(si_f)))
                        ret = si_cs_send(cs);
                cs = objt_cs(si_b->end);
                if (cs && !(cs->conn->flags & CO_FL_ERROR) &&
-                   !(cs->flags & CS_FL_ERROR) && !(si_oc(si_b)->flags & CF_SHUTW))
+                   !(cs->flags & CS_FL_ERROR) &&
+                   !(si_oc(si_b)->flags & CF_SHUTW) &&
+                   !(si_b->wait_event.wait_reason & SUB_CAN_SEND) &&
+                   co_data(si_oc(si_b)))
                        ret |= si_cs_send(cs);
 
                if (ret)
index 8057d2751483f0bc06dc89cc25247396550a9929..04eedf2be823a2fcb9e4305192953b9af741b72b 100644 (file)
@@ -726,7 +726,7 @@ struct task *si_cs_io_cb(struct task *t, void *ctx, unsigned short state)
        if (!cs)
                return NULL;
 redo:
-       if (!(si->wait_event.wait_reason & SUB_CAN_SEND))
+       if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si)))
                ret = si_cs_send(cs);
        if (!(si->wait_event.wait_reason & SUB_CAN_RECV))
                ret |= si_cs_recv(cs);
@@ -978,7 +978,8 @@ static void stream_int_chk_snd_conn(struct stream_interface *si)
            !(si->flags & SI_FL_WAIT_DATA))       /* not waiting for data */
                return;
 
-       si_cs_send(cs);
+       if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si)))
+               si_cs_send(cs);
        tasklet_wakeup(si->wait_event.task);
        if (cs->flags & CS_FL_ERROR || cs->conn->flags & CO_FL_ERROR) {
                /* Write error on the file descriptor */