Hi, some bugs in libxcb cause Xlib performance regressions in lenny. Those seem to hit ltsp users in particular pretty badly, so I'd like to fix this in a stable update.
Proposed debdiff follows, with the following changes: - use a 16k buffer instead of 4k; this is maybe not strictly necessary, but would make lenny's version consistent with both traditional Xlib (as used in etch and before) and recent libxcb (>= 1.2) - disable the Nagle algorithm for TCP sockets; this one would make latency on tcp sockets pretty horrible - a few file descriptor leaks in connect error paths, which I included mostly because it made cherry-picking the TCP_NODELAY patch easier Cheers, Julien libxcb-1.1/debian/changelog | 10 ++++++++++ src/xcb_util.c | 21 ++++++++++++++++----- src/xcbint.h | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) diff -u libxcb-1.1/debian/changelog libxcb-1.1/debian/changelog --- libxcb-1.1/debian/changelog +++ libxcb-1.1/debian/changelog @@ -1,3 +1,13 @@ +libxcb (1.1-1.2) stable; urgency=low + + * Non-maintainer upload to fix important performance issues + (closes: #487635). + * Fix some fd leaks in _xcb_open_*() + * Increase libxcb buffer size to 16k from 4k + * Disable Nagle on TCP socket + + -- Julien Cristau <[email protected]> Wed, 27 May 2009 20:06:47 +0200 + libxcb (1.1-1.1) unstable; urgency=low * Non-maintainer upload. only in patch2: unchanged: --- libxcb-1.1.orig/src/xcbint.h +++ libxcb-1.1/src/xcbint.h @@ -72,7 +72,7 @@ pthread_cond_t cond; int writing; - char queue[4096]; + char queue[16384]; int queue_len; unsigned int request; only in patch2: unchanged: --- libxcb-1.1.orig/src/xcb_util.c +++ libxcb-1.1/src/xcb_util.c @@ -30,6 +30,7 @@ #include <sys/socket.h> #include <sys/un.h> #include <netinet/in.h> +#include <netinet/tcp.h> #ifdef DNETCONN #include <netdnet/dnetdb.h> #include <netdnet/dn.h> @@ -192,8 +193,10 @@ accessdata.acc_accl = strlen((char *)accessdata.acc_acc); setsockopt(fd, DNPROTO_NSP, SO_CONACCESS, &accessdata, sizeof(accessdata)); - if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) + if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { + close(fd); return -1; + } return fd; } #endif @@ -233,9 +236,15 @@ for(addr = results; addr; addr = addr->ai_next) { fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); - if(fd >= 0 && connect(fd, addr->ai_addr, addr->ai_addrlen) >= 0) - break; - fd = -1; + if(fd >= 0) { + int on = 1; + setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); + + if (connect(fd, addr->ai_addr, addr->ai_addrlen) >= 0) + break; + close(fd); + fd = -1; + } } freeaddrinfo(results); return fd; @@ -254,8 +263,10 @@ fd = socket(AF_UNIX, SOCK_STREAM, 0); if(fd == -1) return -1; - if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) + if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { + close(fd); return -1; + } return fd; } -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

