From patchwork Mon Apr 3 12:13:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fan Zhang X-Patchwork-Id: 23153 X-Patchwork-Delegate: pablo.de.lara.guarch@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 1E62E2C18; Mon, 3 Apr 2017 14:12:25 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 8F8A32B9B for ; Mon, 3 Apr 2017 14:12:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1491221542; x=1522757542; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=Zt1D2bhU3KG+HudwHg7pbUmbW5HPX5d7KaVumkGeRRo=; b=kv55J3kUZiIf18HmXR0oAp8DwLOoSWIIcG9bChPYZCndSD7s3qwVxUiC W+P2xg8ymmX+gHmM3U9b7LP557dMqQ==; Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Apr 2017 05:12:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,270,1486454400"; d="scan'208";a="68496359" Received: from silpixa00381633.ir.intel.com (HELO silpixa00381633.ger.corp.intel.com) ([10.237.222.114]) by orsmga002.jf.intel.com with ESMTP; 03 Apr 2017 05:12:08 -0700 From: Fan Zhang To: dev@dpdk.org Cc: pablo.de.lara.guarch@intel.com, sergio.gonzalez.monroy@intel.com, declan.doherty@intel.com Date: Mon, 3 Apr 2017 13:13:46 +0100 Message-Id: <1491221626-19644-1-git-send-email-roy.fan.zhang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1490891463-65687-1-git-send-email-roy.fan.zhang@intel.com> References: <1490891463-65687-1-git-send-email-roy.fan.zhang@intel.com> Subject: [dpdk-dev] [PATCH v3] crypto/scheduler: add more EAL options X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch adds initial mode and ordering enable/disable EAL options to cryptodev scheduler PMD. Signed-off-by: Fan Zhang --- v3: - Fixed mode not set bug v2: - Updated for added scheduling modes - Updated documentation doc/guides/cryptodevs/scheduler.rst | 14 +++ drivers/crypto/scheduler/rte_cryptodev_scheduler.h | 7 ++ drivers/crypto/scheduler/scheduler_pmd.c | 140 +++++++++++++++++++-- 3 files changed, 152 insertions(+), 9 deletions(-) diff --git a/doc/guides/cryptodevs/scheduler.rst b/doc/guides/cryptodevs/scheduler.rst index d516ba8..8b45a13 100644 --- a/doc/guides/cryptodevs/scheduler.rst +++ b/doc/guides/cryptodevs/scheduler.rst @@ -94,6 +94,14 @@ two calls: here. Multiple cryptodevs can be attached initially by presenting this parameter multiple times. +* mode: Specify the scheduling mode of the PMD. The supported scheduling + mode parameter values are specified in the "Cryptodev Scheduler Modes + Overview" section. + +* ordering: Specify the status of the crypto operations ordering feature. + The value of this paramter can be "enable" or "disable". This feature + is disabled by default. + Example: .. code-block:: console @@ -122,6 +130,8 @@ operation: * **CDEV_SCHED_MODE_ROUNDROBIN:** + *Initialization mode parameter*: **round-robin** + Round-robin mode, which distributes the enqueued burst of crypto ops among its slaves in a round-robin manner. This mode may help to fill the throughput gap between the physical core and the existing cryptodevs @@ -129,6 +139,8 @@ operation: * **CDEV_SCHED_MODE_PKT_SIZE_DISTR:** + *Initialization mode parameter*: **packet-size-distr** + Packet-size based distribution mode, which works with 2 slaves, the primary slave and the secondary slave, and distributes the enqueued crypto operations to them based on their data lengths. A crypto operation will be @@ -144,6 +156,8 @@ operation: * **CDEV_SCHED_MODE_FAILOVER:** + *Initialization mode parameter*: **fail-over** + Fail-over mode, which works with 2 slaves, the primary slave and the secondary slave. In this mode, the scheduler will enqueue the incoming crypto operation burst to the primary slave. When one or more crypto diff --git a/drivers/crypto/scheduler/rte_cryptodev_scheduler.h b/drivers/crypto/scheduler/rte_cryptodev_scheduler.h index 306dfea..fce746e 100644 --- a/drivers/crypto/scheduler/rte_cryptodev_scheduler.h +++ b/drivers/crypto/scheduler/rte_cryptodev_scheduler.h @@ -40,6 +40,13 @@ extern "C" { #endif +/* round-robin scheduling mode */ +#define SCHEDULER_MODE_NAME_ROUND_ROBIN round-robin +/* packet-size based distribution scheduling mode */ +#define SCHEDULER_MODE_NAME_PKT_SIZE_DISTR packet-size-distr +/* fail-over mode */ +#define SCHEDULER_MODE_NAME_FAIL_OVER fail-over + /** * Crypto scheduler PMD operation modes */ diff --git a/drivers/crypto/scheduler/scheduler_pmd.c b/drivers/crypto/scheduler/scheduler_pmd.c index c1679ec..5f2b7f6 100644 --- a/drivers/crypto/scheduler/scheduler_pmd.c +++ b/drivers/crypto/scheduler/scheduler_pmd.c @@ -45,10 +45,14 @@ struct scheduler_init_params { struct rte_crypto_vdev_init_params def_p; uint32_t nb_slaves; uint8_t slaves[MAX_SLAVES_NUM]; + enum rte_cryptodev_scheduler_mode mode; + uint32_t enable_ordering; }; #define RTE_CRYPTODEV_VDEV_NAME ("name") #define RTE_CRYPTODEV_VDEV_SLAVE ("slave") +#define RTE_CRYPTODEV_VDEV_MODE ("mode") +#define RTE_CRYPTODEV_VDEV_ORDERING ("ordering") #define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG ("max_nb_queue_pairs") #define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG ("max_nb_sessions") #define RTE_CRYPTODEV_VDEV_SOCKET_ID ("socket_id") @@ -56,11 +60,32 @@ struct scheduler_init_params { const char *scheduler_valid_params[] = { RTE_CRYPTODEV_VDEV_NAME, RTE_CRYPTODEV_VDEV_SLAVE, + RTE_CRYPTODEV_VDEV_MODE, + RTE_CRYPTODEV_VDEV_ORDERING, RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG, RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG, RTE_CRYPTODEV_VDEV_SOCKET_ID }; +struct scheduler_parse_map { + const char *name; + uint32_t val; +}; + +const struct scheduler_parse_map scheduler_mode_map[] = { + {RTE_STR(SCHEDULER_MODE_NAME_ROUND_ROBIN), + CDEV_SCHED_MODE_ROUNDROBIN}, + {RTE_STR(SCHEDULER_MODE_NAME_PKT_SIZE_DISTR), + CDEV_SCHED_MODE_PKT_SIZE_DISTR}, + {RTE_STR(SCHEDULER_MODE_NAME_FAIL_OVER), + CDEV_SCHED_MODE_FAILOVER} +}; + +const struct scheduler_parse_map scheduler_ordering_map[] = { + {"enable", 1}, + {"disable", 0} +}; + static int attach_init_slaves(uint8_t scheduler_id, const uint8_t *slaves, const uint8_t nb_slaves) @@ -79,8 +104,7 @@ attach_init_slaves(uint8_t scheduler_id, return status; } - RTE_LOG(INFO, PMD, " Attached slave cryptodev %s\n", - dev->data->name); + RTE_LOG(INFO, PMD, " Attached Slave %s\n", dev->data->name); } return 0; @@ -93,9 +117,11 @@ cryptodev_scheduler_create(const char *name, char crypto_dev_name[RTE_CRYPTODEV_NAME_MAX_LEN] = {0}; struct rte_cryptodev *dev; struct scheduler_ctx *sched_ctx; + uint32_t i; + int ret; if (init_params->def_p.name[0] == '\0') { - int ret = rte_cryptodev_pmd_create_dev_name( + ret = rte_cryptodev_pmd_create_dev_name( crypto_dev_name, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); @@ -124,8 +150,46 @@ cryptodev_scheduler_create(const char *name, sched_ctx->max_nb_queue_pairs = init_params->def_p.max_nb_queue_pairs; - return attach_init_slaves(dev->data->dev_id, init_params->slaves, + ret = attach_init_slaves(dev->data->dev_id, init_params->slaves, init_params->nb_slaves); + if (ret < 0) { + rte_cryptodev_pmd_release_device(dev); + return ret; + } + + if (sched_ctx->mode > CDEV_SCHED_MODE_USERDEFINED && + sched_ctx->mode < CDEV_SCHED_MODE_COUNT) { + ret = rte_crpytodev_scheduler_mode_set(dev->data->dev_id, + init_params->mode); + if (ret < 0) { + rte_cryptodev_pmd_release_device(dev); + return ret; + } + + for (i = 0; i < RTE_DIM(scheduler_mode_map); i++) { + if (scheduler_mode_map[i].val != sched_ctx->mode) + continue; + + RTE_LOG(INFO, PMD, " Scheduling mode = %s\n", + scheduler_mode_map[i].name); + break; + } + } + + sched_ctx->reordering_enabled = init_params->enable_ordering; + + for (i = 0; i < RTE_DIM(scheduler_ordering_map); i++) { + if (scheduler_ordering_map[i].val != + sched_ctx->reordering_enabled) + continue; + + RTE_LOG(INFO, PMD, " Packet ordering = %s\n", + scheduler_ordering_map[i].name); + + break; + } + + return 0; } static int @@ -183,7 +247,7 @@ parse_integer_arg(const char *key __rte_unused, *i = atoi(value); if (*i < 0) { CS_LOG_ERR("Argument has to be positive.\n"); - return -1; + return -EINVAL; } return 0; @@ -200,7 +264,7 @@ parse_name_arg(const char *key __rte_unused, CS_LOG_ERR("Invalid name %s, should be less than " "%u bytes.\n", value, RTE_CRYPTODEV_NAME_MAX_LEN - 1); - return -1; + return -EINVAL; } strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); @@ -219,12 +283,12 @@ parse_slave_arg(const char *key __rte_unused, if (!dev) { RTE_LOG(ERR, PMD, "Invalid slave name %s.\n", value); - return -1; + return -EINVAL; } if (param->nb_slaves >= MAX_SLAVES_NUM - 1) { CS_LOG_ERR("Too many slaves.\n"); - return -1; + return -ENOMEM; } param->slaves[param->nb_slaves] = dev->data->dev_id; @@ -234,6 +298,52 @@ parse_slave_arg(const char *key __rte_unused, } static int +parse_mode_arg(const char *key __rte_unused, + const char *value, void *extra_args) +{ + struct scheduler_init_params *param = extra_args; + uint32_t i; + + for (i = 0; i < RTE_DIM(scheduler_mode_map); i++) { + if (strcmp(value, scheduler_mode_map[i].name) == 0) { + param->mode = (enum rte_cryptodev_scheduler_mode) + scheduler_mode_map[i].val; + break; + } + } + + if (i == RTE_DIM(scheduler_mode_map)) { + CS_LOG_ERR("Unrecognized input.\n"); + return -EINVAL; + } + + return 0; +} + +static int +parse_ordering_arg(const char *key __rte_unused, + const char *value, void *extra_args) +{ + struct scheduler_init_params *param = extra_args; + uint32_t i; + + for (i = 0; i < RTE_DIM(scheduler_ordering_map); i++) { + if (strcmp(value, scheduler_ordering_map[i].name) == 0) { + param->enable_ordering = + scheduler_ordering_map[i].val; + break; + } + } + + if (i == RTE_DIM(scheduler_ordering_map)) { + CS_LOG_ERR("Unrecognized input.\n"); + return -EINVAL; + } + + return 0; +} + +static int scheduler_parse_init_params(struct scheduler_init_params *params, const char *input_args) { @@ -280,6 +390,16 @@ scheduler_parse_init_params(struct scheduler_init_params *params, if (ret < 0) goto free_kvlist; + ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_MODE, + &parse_mode_arg, params); + if (ret < 0) + goto free_kvlist; + + ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_ORDERING, + &parse_ordering_arg, params); + if (ret < 0) + goto free_kvlist; + if (params->def_p.socket_id >= number_of_sockets()) { CDEV_LOG_ERR("Invalid socket id specified to create " "the virtual crypto device on"); @@ -303,7 +423,9 @@ cryptodev_scheduler_probe(const char *name, const char *input_args) "" }, .nb_slaves = 0, - .slaves = {0} + .slaves = {0}, + .mode = CDEV_SCHED_MODE_NOT_SET, + .enable_ordering = 0 }; scheduler_parse_init_params(&init_params, input_args);