From 683eeb59b8d05b637a4671469a9ce75efe1899a0 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Thu, 4 Jan 2018 13:52:10 -0700 Subject: [PATCH] scsi: annotate unlikely checks in read/write The normal execution path for read/write commands is that none of the checks fail; annotate all of the checks in spdk_bdev_scsi_readwrite() with spdk_unlikely to encourage the compiler to generate the happy path as straight-line code and move the error handling out of line. Change-Id: Id0e606c78f0b99662e5c27e3bfa32535de20aa13 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/393700 Reviewed-by: Ben Walker Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu Reviewed-by: --- lib/scsi/scsi_bdev.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index e32d36db3..bce696052 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -43,6 +43,7 @@ #include "spdk/env.h" #include "spdk/bdev.h" #include "spdk/endian.h" +#include "spdk/likely.h" #include "spdk/string.h" #include "spdk/util.h" @@ -1430,8 +1431,8 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev, task->data_transferred = 0; - if (task->dxfer_dir != SPDK_SCSI_DIR_NONE && - task->dxfer_dir != (is_read ? SPDK_SCSI_DIR_FROM_DEV : SPDK_SCSI_DIR_TO_DEV)) { + if (spdk_unlikely(task->dxfer_dir != SPDK_SCSI_DIR_NONE && + task->dxfer_dir != (is_read ? SPDK_SCSI_DIR_FROM_DEV : SPDK_SCSI_DIR_TO_DEV))) { SPDK_ERRLOG("Incorrect data direction\n"); spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION, SPDK_SCSI_SENSE_NO_SENSE, @@ -1441,7 +1442,7 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev, } bdev_num_blocks = spdk_bdev_get_num_blocks(bdev); - if (bdev_num_blocks <= lba || bdev_num_blocks - lba < xfer_len) { + if (spdk_unlikely(bdev_num_blocks <= lba || bdev_num_blocks - lba < xfer_len)) { SPDK_DEBUGLOG(SPDK_LOG_SCSI, "end of media\n"); spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION, SPDK_SCSI_SENSE_ILLEGAL_REQUEST, @@ -1450,14 +1451,14 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev, return SPDK_SCSI_TASK_COMPLETE; } - if (xfer_len == 0) { + if (spdk_unlikely(xfer_len == 0)) { task->status = SPDK_SCSI_STATUS_GOOD; return SPDK_SCSI_TASK_COMPLETE; } /* Transfer Length is limited to the Block Limits VPD page Maximum Transfer Length */ max_xfer_len = SPDK_WORK_BLOCK_SIZE / spdk_bdev_get_block_size(bdev); - if (xfer_len > max_xfer_len) { + if (spdk_unlikely(xfer_len > max_xfer_len)) { SPDK_ERRLOG("xfer_len %" PRIu32 " > maximum transfer length %" PRIu32 "\n", xfer_len, max_xfer_len); spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,