From c73deeb2903831b63025f9d2f38dc01e93346d1e Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 25 Jun 2018 16:09:15 +0200 Subject: [SERVER] Use likely/unlikely in uplink disk writing loop --- src/server/uplink.c | 8 ++++---- src/types.h | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/server/uplink.c b/src/server/uplink.c index 8a6a33a..c0babaa 100644 --- a/src/server/uplink.c +++ b/src/server/uplink.c @@ -594,17 +594,17 @@ static void uplink_handleReceive(dnbd3_connection_t *link) link->bytesReceived += inReply.size; spin_unlock( &link->image->lock ); // 1) Write to cache file - if ( link->image->cacheFd == -1 ) { + if ( unlikely( link->image->cacheFd == -1 ) ) { image_reopenCacheFd( link->image, false ); } - if ( link->image->cacheFd != -1 ) { + if ( likely( link->image->cacheFd != -1 ) ) { int err = 0; bool tryAgain = true; // Allow one retry in case we run out of space or the write fd became invalid uint32_t done = 0; ret = 0; while ( done < inReply.size ) { ret = (int)pwrite( link->image->cacheFd, link->recvBuffer + done, inReply.size - done, start + done ); - if ( ret == -1 ) { + if ( unlikely( ret == -1 ) ) { err = errno; if ( err == EINTR ) continue; if ( err == ENOSPC || err == EDQUOT ) { @@ -622,7 +622,7 @@ static void uplink_handleReceive(dnbd3_connection_t *link) logadd( LOG_DEBUG1, "Error trying to cache data for %s:%d -- errno=%d", link->image->name, (int)link->image->rid, err ); break; } - if ( ret <= 0 || (uint32_t)ret > inReply.size - done ) { + if ( unlikely( ret <= 0 || (uint32_t)ret > inReply.size - done ) ) { logadd( LOG_WARNING, "Unexpected return value %d from pwrite to %s:%d", ret, link->image->name, (int)link->image->rid ); break; } diff --git a/src/types.h b/src/types.h index fd7bd21..86b3469 100644 --- a/src/types.h +++ b/src/types.h @@ -40,6 +40,14 @@ #error "Please add define for your compiler for UNUSED, or define to nothing for your compiler if not supported" #endif +#if defined(__GNUC__) && __GNUC__ >= 3 +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + #ifdef __linux__ #define HAVE_THREAD_NAMES #define HAVE_FDATASYNC -- cgit v1.2.3-55-g7522