Commit b1ad3a29 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Jim Harris
Browse files

bdev/crypto: complete IOs on ENOMEM from accel



spdk_bdev_queue_io_wait() can only be used when one of bdev submission
functions returns ENOMEM (i.e. there are no more spdk_bdev_ios on that
IO channel).  Using it in any other case, e.g. on spdk_accel_append_*()
returning ENOMEM, will most likely result in failure.  Therefore, to
avoid that, the IOs are completed with NOMEM status relying on the bdev
layer to retry them.

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

 (master)

(cherry picked from commit 3824f6e3)
Change-Id: Ie0f03496e5d3180c481815b3f1b021e74ae2f46d
Signed-off-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17741


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent e70fc908
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -282,8 +282,8 @@ _complete_internal_read(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg
		} else {
			if (rc == -ENOMEM) {
				SPDK_DEBUGLOG(vbdev_crypto, "No memory, queue the IO.\n");
				/* We will repeat crypto operation later */
				vbdev_crypto_queue_io(orig_io, CRYPTO_IO_READ_DONE);
				spdk_bdev_io_complete(orig_io, SPDK_BDEV_IO_STATUS_NOMEM);
				spdk_bdev_free_io(bdev_io);
				return;
			} else {
				SPDK_ERRLOG("Failed to decrypt, rc %d\n", rc);
@@ -393,7 +393,7 @@ crypto_write_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io
		spdk_bdev_io_put_aux_buf(bdev_io, aux_buf);
		if (rc == -ENOMEM) {
			SPDK_DEBUGLOG(vbdev_crypto, "No memory, queue the IO.\n");
			vbdev_crypto_queue_io(bdev_io, CRYPTO_IO_NEW);
			spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_NOMEM);
		} else {
			SPDK_ERRLOG("Failed to submit crypto operation!\n");
			spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
+7 −12
Original line number Diff line number Diff line
@@ -283,13 +283,10 @@ test_error_paths(void)

	/* test error returned by accel fw */
	MOCK_SET(spdk_accel_submit_encrypt, -ENOMEM);
	g_completion_called = false;
	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
	CU_ASSERT(g_io_ctx->bdev_io_wait.bdev == &g_crypto_bdev.crypto_bdev);
	CU_ASSERT(g_io_ctx->bdev_io_wait.cb_fn == vbdev_crypto_resubmit_io);
	CU_ASSERT(g_io_ctx->bdev_io_wait.cb_arg == g_bdev_io);
	CU_ASSERT(g_io_ctx->resubmit_state == CRYPTO_IO_NEW);
	memset(&g_io_ctx->bdev_io_wait, 0, sizeof(g_io_ctx->bdev_io_wait));
	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_NOMEM);
	CU_ASSERT(g_completion_called);

	MOCK_SET(spdk_accel_submit_encrypt, -EINVAL);
	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
@@ -365,15 +362,13 @@ test_error_paths(void)
	/* test error returned by accel fw */
	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
	MOCK_SET(spdk_accel_submit_decrypt, -ENOMEM);
	g_completion_called = false;
	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
	poll_threads();
	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
	CU_ASSERT(g_io_ctx->bdev_io_wait.bdev == &g_crypto_bdev.crypto_bdev);
	CU_ASSERT(g_io_ctx->bdev_io_wait.cb_fn == vbdev_crypto_resubmit_io);
	CU_ASSERT(g_io_ctx->bdev_io_wait.cb_arg == g_bdev_io);
	CU_ASSERT(g_io_ctx->resubmit_state == CRYPTO_IO_READ_DONE);
	memset(&g_io_ctx->bdev_io_wait, 0, sizeof(g_io_ctx->bdev_io_wait));
	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_NOMEM);
	CU_ASSERT(g_completion_called);
	MOCK_CLEAR(spdk_accel_submit_decrypt);
	g_completion_called = false;

	/* test error returned in accel cpl */
	ut_spdk_accel_submit_decrypt_cb_rc = -EINVAL;