Commit e753402a authored by paul luse's avatar paul luse Committed by Tomasz Zawadzki
Browse files

lib/accel: add RPC to select which accel module should be used



Startup RPC only to avoid issues trying to switch while in use.

Signed-off-by: default avatarpaul luse <paul.e.luse@intel.com>
Change-Id: I7f1801905de0927f3610c4065182dd8fa88cdfdd
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/660


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent aa3cf733
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -39,6 +39,15 @@
#include "spdk/accel_engine.h"
#include "spdk/queue.h"

enum accel_module {
	ACCEL_SW = 0,
	ACCEL_AUTO,
	ACCEL_CBDMA,
	ACCEL_MODULE_MAX
};

int accel_set_module(enum accel_module *opts);

struct spdk_accel_task {
	spdk_accel_completion_cb	cb;
	uint8_t				offload_ctx[0];
+1 −1
Original line number Diff line number Diff line
@@ -35,6 +35,6 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

LIBNAME = accel
C_SRCS = accel_engine.c
C_SRCS = accel_engine.c accel_engine_rpc.c

include $(SPDK_ROOT_DIR)/mk/spdk.lib.mk
+28 −5
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ static struct spdk_accel_engine *g_sw_accel_engine = NULL;
static struct spdk_accel_module_if *g_accel_engine_module = NULL;
static spdk_accel_fini_cb g_fini_cb_fn = NULL;
static void *g_fini_cb_arg = NULL;
enum accel_module g_active_accel_module = ACCEL_AUTO;

/* Global list of registered accelerator modules */
static TAILQ_HEAD(, spdk_accel_module_if) spdk_accel_module_list =
@@ -65,6 +66,14 @@ struct accel_io_channel {
	struct spdk_io_channel		*ch;
};

int
accel_set_module(enum accel_module *opts)
{
	g_active_accel_module = *opts;

	return 0;
}

/* Registration of hw modules (currently supports only 1) */
void
spdk_accel_hw_engine_register(struct spdk_accel_engine *accel_engine)
@@ -144,17 +153,31 @@ accel_engine_create_cb(void *io_device, void *ctx_buf)
{
	struct accel_io_channel	*accel_ch = ctx_buf;

	/* If they specify CBDMA and its not available, fail */
	if (g_active_accel_module == ACCEL_CBDMA && g_hw_accel_engine == NULL) {
		SPDK_ERRLOG("CBDMA acceleration engine specified but not available.\n");
		return -EINVAL;
	}

	/* For either HW or AUTO */
	if (g_active_accel_module > ACCEL_SW) {
		if (g_hw_accel_engine != NULL) {
			accel_ch->ch = g_hw_accel_engine->get_io_channel();
			if (accel_ch->ch != NULL) {
				accel_ch->engine = g_hw_accel_engine;
				SPDK_NOTICELOG("Acceleration framework using module: CBDMA\n");
				return 0;
			}
		}
	}

	/* Choose SW either because auto was selected and there was no HW,
	 * or because SW was selected.
	 */
	accel_ch->ch = g_sw_accel_engine->get_io_channel();
	assert(accel_ch->ch != NULL);
	accel_ch->engine = g_sw_accel_engine;
	SPDK_NOTICELOG("Acceleration framework using module: SOFTWARE\n");
	return 0;
}

+85 −0
Original line number Diff line number Diff line
/*-
 *   BSD LICENSE
 *
 *   Copyright (c) Intel Corporation.
 *   All rights reserved.
 *
 *   Redistribution and use in source and binary forms, with or without
 *   modification, are permitted provided that the following conditions
 *   are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in
 *       the documentation and/or other materials provided with the
 *       distribution.
 *     * Neither the name of Intel Corporation nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "spdk_internal/accel_engine.h"
#include "spdk/rpc.h"
#include "spdk/util.h"
#include "spdk/string.h"
#include "spdk_internal/log.h"

struct rpc_accel_set_module {
	enum accel_module module;
};

static const struct spdk_json_object_decoder rpc_accel_set_module_decoder[] = {
	{"module", offsetof(struct rpc_accel_set_module, module), spdk_json_decode_uint32},
};

static void
spdk_rpc_accel_set_module(struct spdk_jsonrpc_request *request,
			  const struct spdk_json_val *params)
{
	struct rpc_accel_set_module req = {};
	struct spdk_json_write_ctx *w;
	int rc = 0;

	if (spdk_json_decode_object(params, rpc_accel_set_module_decoder,
				    SPDK_COUNTOF(rpc_accel_set_module_decoder),
				    &req)) {
		SPDK_ERRLOG("spdk_json_decode_object failed\n");
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR,
						 "spdk_json_decode_object failed");
		return;
	}

	if (req.module >= ACCEL_MODULE_MAX) {
		spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
						     "Module value %d should be less than %d", req.module,
						     ACCEL_MODULE_MAX);
		return;
	}

	rc = accel_set_module(&req.module);
	if (rc) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, spdk_strerror(-rc));
		return;
	}

	w = spdk_jsonrpc_begin_result(request);
	if (w != NULL) {
		spdk_json_write_bool(w, true);
		spdk_jsonrpc_end_result(request, w);
	}
}
SPDK_RPC_REGISTER("accel_set_module", spdk_rpc_accel_set_module,
		  SPDK_RPC_STARTUP)
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ DEPDIRS-reduce := log util
DEPDIRS-thread := log util

DEPDIRS-blob := log util thread
DEPDIRS-accel := thread
DEPDIRS-accel := thread log rpc thread util $(JSON_LIBS)
DEPDIRS-jsonrpc := log util json
DEPDIRS-virtio := log util json thread

Loading