Commit 80326017 authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Tomasz Zawadzki
Browse files

lib/accel: Avoid accessing bounce buffers



Bounce buffers are big structures, they only used
when accel module doesn't support memory domains.
But each task initializes orig_iovs of source and
destination bounce buffers, accel sequence check
these pointers for NULL. As result, we access 2
cache lines just to check these pointers.
Instead, since function accel_set_bounce_buffer sets
task iovs to point to boucne iovs, we rework
check and avoid loading bounce buffers into cache
until they really needed.

Original version (x86, --disable-debug) produces
a bit more efficient asm code, but as noted above,
we can save 2 cache lines per sequence

if (task->bounce.s.orig_iovs != NULL) {
48 83 bb 18 01 00 00    cmpq   $0x0,0x118(%rbx)

if (task->s.iovs == &task->bounce.s.iov) {
48 8d 83 38 01 00 00    lea    0x138(%rbx),%rax
48 39 43 50             cmp    %rax,0x50(%rbx)

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: Iae7582979548edc7a6045daa122b9c7ee4bd878e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19038


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 7dbad851
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -309,8 +309,8 @@ _get_task(struct accel_io_channel *accel_ch, spdk_accel_completion_cb cb_fn, voi
	accel_task->cb_fn = cb_fn;
	accel_task->cb_arg = cb_arg;
	accel_task->accel_ch = accel_ch;
	accel_task->bounce.s.orig_iovs = NULL;
	accel_task->bounce.d.orig_iovs = NULL;
	accel_task->s.iovs = NULL;
	accel_task->d.iovs = NULL;

	return accel_task;
}
@@ -1625,7 +1625,8 @@ accel_process_sequence(struct spdk_accel_sequence *seq)
				accel_sequence_set_fail(seq, rc);
				break;
			}
			if (task->bounce.s.orig_iovs != NULL) {
			if (task->s.iovs == &task->bounce.s.iov) {
				assert(task->bounce.s.orig_iovs);
				accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_PULL_DATA);
				break;
			}
@@ -1648,7 +1649,8 @@ accel_process_sequence(struct spdk_accel_sequence *seq)
			accel_task_pull_data(seq, task);
			break;
		case ACCEL_SEQUENCE_STATE_COMPLETE_TASK:
			if (task->bounce.d.orig_iovs != NULL) {
			if (task->d.iovs == &task->bounce.d.iov) {
				assert(task->bounce.d.orig_iovs);
				accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_PUSH_DATA);
				break;
			}