From: Olivier Houchard Date: Mon, 22 Oct 2018 14:01:09 +0000 (+0200) Subject: MINOR: stream_interface: Avoid calling si_cs_send/recv if not needed. X-Git-Tag: v1.9-dev5~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31f04e44162f9d4b55ce9032264a919e959cd7cc;p=thirdparty%2Fhaproxy.git MINOR: stream_interface: Avoid calling si_cs_send/recv if not needed. 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. --- diff --git a/src/stream.c b/src/stream.c index 200556fe42..8df5c75639 100644 --- a/src/stream.c +++ b/src/stream.c @@ -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) diff --git a/src/stream_interface.c b/src/stream_interface.c index 8057d27514..04eedf2be8 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -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 */