Commit dce597cb authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

accel/error: add support for crc32c



It is now possible to corrupt the result of crc32c operations.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I5ac8779aff605debabdc549e23b5d8ae2d883b0a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20440


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent 38a1f6bf
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ struct accel_error_channel {
};

struct accel_error_task {
	struct accel_error_channel	*ch;
	spdk_accel_completion_cb	cb_fn;
	void				*cb_arg;
};
@@ -35,14 +36,41 @@ accel_error_get_task_ctx(struct spdk_accel_task *task)
	return (void *)((uint8_t *)task + g_task_offset);
}

static void
accel_error_corrupt_task(struct spdk_accel_task *task)
{
	switch (task->op_code) {
	case SPDK_ACCEL_OPC_CRC32C:
		*task->crc_dst += 1;
		break;
	default:
		break;
	}
}

static void
accel_error_task_complete_cb(void *arg, int status)
{
	struct spdk_accel_task *task = arg;
	struct accel_error_task *errtask = accel_error_get_task_ctx(task);
	struct accel_error_channel *ch = errtask->ch;
	struct accel_error_inject_info *info = &ch->injects[task->op_code];
	spdk_accel_completion_cb cb_fn = errtask->cb_fn;
	void *cb_arg = errtask->cb_arg;

	info->count++;
	if (info->count <= info->opts.count) {
		switch (info->opts.type) {
		case ACCEL_ERROR_INJECT_CORRUPT:
			accel_error_corrupt_task(task);
			break;
		default:
			break;
		}
	} else {
		info->opts.type = ACCEL_ERROR_INJECT_DISABLE;
	}

	cb_fn(cb_arg, status);
}

@@ -52,6 +80,7 @@ accel_error_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *tas
	struct accel_error_channel *errch = spdk_io_channel_get_ctx(ch);
	struct accel_error_task *errtask = accel_error_get_task_ctx(task);

	errtask->ch = errch;
	errtask->cb_fn = task->cb_fn;
	errtask->cb_arg = task->cb_arg;
	task->cb_fn = accel_error_task_complete_cb;
@@ -158,8 +187,13 @@ accel_error_module_fini(void *unused)
static bool
accel_error_supports_opcode(enum spdk_accel_opcode opcode)
{
	switch (opcode) {
	case SPDK_ACCEL_OPC_CRC32C:
		return true;
	default:
		return false;
	}
}

static struct spdk_io_channel *
accel_error_get_io_channel(void)