From 9bf46610a9d20962854016032de4567974e87957 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 21 Jun 2013 22:58:31 +0100 Subject: [PATCH] os: Immediately queue initial WriteToClient If we immediately put the WriteToClient() buffer into the socket's write queue, not only do we benefit from sending the response back to client earlier, but we also avoid the overhead of copying the data into our own staging buffer and causing extra work in the next select(). The write is effectively free as typically we may only send one reply per client per select() call, so the cost of the FlushClient() is the same. shmget10: 26400 -> 110000 getimage10: 25000 -> 108000 shmget500: 3160 -> 13500 getimage500: 1000 -> 1010 The knock-on effect is that on a mostly idle composited desktop, the CPU overhead is dominated by the memmove in WriteToClient, which is in turn eliminated by this patch. Reviewed-by: Adam Jackson Signed-off-by: Chris Wilson --- os/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os/io.c b/os/io.c index 0d980ab9f..d34bc39b7 100644 --- a/os/io.c +++ b/os/io.c @@ -814,7 +814,7 @@ WriteToClient(ClientPtr who, int count, const void *__buf) } } #endif - if (oco->count + count + padBytes > oco->size) { + if (oco->count == 0 || oco->count + count + padBytes > oco->size) { FD_CLR(oc->fd, &OutputPending); if (!XFD_ANYSET(&OutputPending)) { CriticalOutputPending = FALSE;