[v2,1/2] eal: add eal option to configure iova mode

Message ID 1537297807-19584-1-git-send-email-eric.zhang@windriver.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series [v2,1/2] eal: add eal option to configure iova mode |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

eric zhang Sept. 18, 2018, 7:10 p.m. UTC
  From: Santosh Shukla <santosh.shukla@caviumnetworks.com>

In the case of user don't want to use bus iova scheme and want
to override.

For that, Adding eal option --iova-mode=<string> where valid input
string is 'pa' or 'va'.

Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 lib/librte_eal/common/eal_common_options.c | 30 ++++++++++++++++++++++++++++++
 lib/librte_eal/common/eal_internal_cfg.h   |  1 +
 lib/librte_eal/common/eal_options.h        |  2 ++
 3 files changed, 33 insertions(+)
  

Comments

Hemant Agrawal Sept. 26, 2018, 7:10 a.m. UTC | #1
On 9/19/2018 12:40 AM, eric zhang wrote:
> From: Santosh Shukla <santosh.shukla@caviumnetworks.com>
>
> In the case of user don't want to use bus iova scheme and want
> to override.
>
> For that, Adding eal option --iova-mode=<string> where valid input
> string is 'pa' or 'va'.
>
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Just wondering if you want to add some description in:
1. Prog Guide - EAL section
2. EAL Command line options for testpmd 
(https://doc.dpdk.org/guides/testpmd_app_ug/run_app.html?highlight=eal)

Otherwise LGTM

Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> ---
>   lib/librte_eal/common/eal_common_options.c | 30 ++++++++++++++++++++++++++++++
>   lib/librte_eal/common/eal_internal_cfg.h   |  1 +
>   lib/librte_eal/common/eal_options.h        |  2 ++
>   3 files changed, 33 insertions(+)
>
> diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
> index 996a034..ab2a28c 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -82,6 +82,7 @@
>   	{OPT_HELP,              0, NULL, OPT_HELP_NUM             },
>   	{OPT_HUGE_DIR,          1, NULL, OPT_HUGE_DIR_NUM         },
>   	{OPT_HUGE_UNLINK,       0, NULL, OPT_HUGE_UNLINK_NUM      },
> +	{OPT_IOVA_MODE,	        1, NULL, OPT_IOVA_MODE_NUM        },
>   	{OPT_LCORES,            1, NULL, OPT_LCORES_NUM           },
>   	{OPT_LOG_LEVEL,         1, NULL, OPT_LOG_LEVEL_NUM        },
>   	{OPT_MASTER_LCORE,      1, NULL, OPT_MASTER_LCORE_NUM     },
> @@ -218,6 +219,7 @@ struct device_option {
>   #endif
>   	internal_cfg->vmware_tsc_map = 0;
>   	internal_cfg->create_uio_dev = 0;
> +	internal_cfg->iova_mode = -1;
>   	internal_cfg->mbuf_pool_ops_name = RTE_MBUF_DEFAULT_MEMPOOL_OPS;
>   }
>   
> @@ -994,6 +996,25 @@ static int xdigit2val(unsigned char c)
>   	return RTE_PROC_INVALID;
>   }
>   
> +static int
> +eal_parse_iova_mode(const char *name)
> +{
> +	int mode;
> +
> +	if (name == NULL)
> +		return -1;
> +
> +	if (!strcmp("pa", name))
> +		mode = RTE_IOVA_PA;
> +	else if (!strcmp("va", name))
> +		mode = RTE_IOVA_VA;
> +	else
> +		return -1;
> +
> +	internal_config.iova_mode = mode;
> +	return 0;
> +}
> +
>   int
>   eal_parse_common_option(int opt, const char *optarg,
>   			struct internal_config *conf)
> @@ -1158,6 +1179,13 @@ static int xdigit2val(unsigned char c)
>   		}
>   		core_parsed = 1;
>   		break;
> +	case OPT_IOVA_MODE_NUM:
> +		if (eal_parse_iova_mode(optarg) < 0) {
> +			RTE_LOG(ERR, EAL, "invalid parameters for --"
> +				OPT_IOVA_MODE "\n");
> +			return -1;
> +		}
> +		break;
>   
>   	/* don't know what to do, leave this to caller */
>   	default:
> @@ -1306,6 +1334,8 @@ static int xdigit2val(unsigned char c)
>   	       "  -h, --help          This help\n"
>   	       "\nEAL options for DEBUG use only:\n"
>   	       "  --"OPT_HUGE_UNLINK"       Unlink hugepage files after init\n"
> +	       "  --"OPT_IOVA_MODE"         Set iova mode. 'pa' for IOVA_PA\n"
> +	       "                            'va' for IOVA_VA\n"
>   	       "  --"OPT_NO_HUGE"           Use malloc instead of hugetlbfs\n"
>   	       "  --"OPT_NO_PCI"            Disable PCI\n"
>   	       "  --"OPT_NO_HPET"           Disable HPET\n"
> diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h
> index fa6ccbe..29bf53f 100644
> --- a/lib/librte_eal/common/eal_internal_cfg.h
> +++ b/lib/librte_eal/common/eal_internal_cfg.h
> @@ -83,6 +83,7 @@ struct internal_config {
>   	const char *hugepage_dir;         /**< specific hugetlbfs directory to use */
>   	const char *mbuf_pool_ops_name;   /**< mbuf pool ops name */
>   	unsigned num_hugepage_sizes;      /**< how many sizes on this system */
> +	enum rte_iova_mode iova_mode ;    /**< Set iova mode on this system  */
>   	struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
>   };
>   extern struct internal_config internal_config; /**< Global EAL configuration. */
> diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h
> index 30e6bb4..7786189 100644
> --- a/lib/librte_eal/common/eal_options.h
> +++ b/lib/librte_eal/common/eal_options.h
> @@ -83,6 +83,8 @@ enum {
>   	OPT_VFIO_INTR_NUM,
>   #define OPT_VMWARE_TSC_MAP    "vmware-tsc-map"
>   	OPT_VMWARE_TSC_MAP_NUM,
> +#define OPT_IOVA_MODE          "iova-mode"
> +	OPT_IOVA_MODE_NUM,
>   	OPT_LONG_MAX_NUM
>   };
>
  
Burakov, Anatoly Sept. 26, 2018, 12:42 p.m. UTC | #2
On 18-Sep-18 8:10 PM, eric zhang wrote:
> From: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> 
> In the case of user don't want to use bus iova scheme and want
> to override.
> 
> For that, Adding eal option --iova-mode=<string> where valid input
> string is 'pa' or 'va'.
> 
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
> ---

Needs documentation update in Programmer's Guide to explain why such a 
thing might be needed, and update EAL parameter guides.

For the patch itself,
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
  
eric zhang Oct. 1, 2018, 4 p.m. UTC | #3
On 09/26/2018 08:42 AM, Burakov, Anatoly wrote:
> On 18-Sep-18 8:10 PM, eric zhang wrote:
>> From: Santosh Shukla <santosh.shukla@caviumnetworks.com>
>>
>> In the case of user don't want to use bus iova scheme and want
>> to override.
>>
>> For that, Adding eal option --iova-mode=<string> where valid input
>> string is 'pa' or 'va'.
>>
>> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
>> Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
>> ---
>
> Needs documentation update in Programmer's Guide to explain why such a 
> thing might be needed, and update EAL parameter guides.
>
> For the patch itself,
> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
Thanks Anatoly. Documentations were updated and patch is at 
http://patchwork.dpdk.org/patch/45785/. Would you please give a review?

Eric
  
Ferruh Yigit Oct. 2, 2018, 8:30 a.m. UTC | #4
On 10/1/2018 5:00 PM, Eric Zhang wrote:
> 
> 
> On 09/26/2018 08:42 AM, Burakov, Anatoly wrote:
>> On 18-Sep-18 8:10 PM, eric zhang wrote:
>>> From: Santosh Shukla <santosh.shukla@caviumnetworks.com>
>>>
>>> In the case of user don't want to use bus iova scheme and want
>>> to override.
>>>
>>> For that, Adding eal option --iova-mode=<string> where valid input
>>> string is 'pa' or 'va'.
>>>
>>> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
>>> Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
>>> ---
>>
>> Needs documentation update in Programmer's Guide to explain why such a 
>> thing might be needed, and update EAL parameter guides.
>>
>> For the patch itself,
>> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
> Thanks Anatoly. Documentations were updated and patch is at 
> http://patchwork.dpdk.org/patch/45785/. Would you please give a review?

I suggest sending a new version of this patchset with that patch included,
instead of two separate patches.
Makes life easy for people that needs to follow that dependency and good for
keeping record for future.
  

Patch

diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 996a034..ab2a28c 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -82,6 +82,7 @@ 
 	{OPT_HELP,              0, NULL, OPT_HELP_NUM             },
 	{OPT_HUGE_DIR,          1, NULL, OPT_HUGE_DIR_NUM         },
 	{OPT_HUGE_UNLINK,       0, NULL, OPT_HUGE_UNLINK_NUM      },
+	{OPT_IOVA_MODE,	        1, NULL, OPT_IOVA_MODE_NUM        },
 	{OPT_LCORES,            1, NULL, OPT_LCORES_NUM           },
 	{OPT_LOG_LEVEL,         1, NULL, OPT_LOG_LEVEL_NUM        },
 	{OPT_MASTER_LCORE,      1, NULL, OPT_MASTER_LCORE_NUM     },
@@ -218,6 +219,7 @@  struct device_option {
 #endif
 	internal_cfg->vmware_tsc_map = 0;
 	internal_cfg->create_uio_dev = 0;
+	internal_cfg->iova_mode = -1;
 	internal_cfg->mbuf_pool_ops_name = RTE_MBUF_DEFAULT_MEMPOOL_OPS;
 }
 
@@ -994,6 +996,25 @@  static int xdigit2val(unsigned char c)
 	return RTE_PROC_INVALID;
 }
 
+static int
+eal_parse_iova_mode(const char *name)
+{
+	int mode;
+
+	if (name == NULL)
+		return -1;
+
+	if (!strcmp("pa", name))
+		mode = RTE_IOVA_PA;
+	else if (!strcmp("va", name))
+		mode = RTE_IOVA_VA;
+	else
+		return -1;
+
+	internal_config.iova_mode = mode;
+	return 0;
+}
+
 int
 eal_parse_common_option(int opt, const char *optarg,
 			struct internal_config *conf)
@@ -1158,6 +1179,13 @@  static int xdigit2val(unsigned char c)
 		}
 		core_parsed = 1;
 		break;
+	case OPT_IOVA_MODE_NUM:
+		if (eal_parse_iova_mode(optarg) < 0) {
+			RTE_LOG(ERR, EAL, "invalid parameters for --"
+				OPT_IOVA_MODE "\n");
+			return -1;
+		}
+		break;
 
 	/* don't know what to do, leave this to caller */
 	default:
@@ -1306,6 +1334,8 @@  static int xdigit2val(unsigned char c)
 	       "  -h, --help          This help\n"
 	       "\nEAL options for DEBUG use only:\n"
 	       "  --"OPT_HUGE_UNLINK"       Unlink hugepage files after init\n"
+	       "  --"OPT_IOVA_MODE"         Set iova mode. 'pa' for IOVA_PA\n"
+	       "                            'va' for IOVA_VA\n"
 	       "  --"OPT_NO_HUGE"           Use malloc instead of hugetlbfs\n"
 	       "  --"OPT_NO_PCI"            Disable PCI\n"
 	       "  --"OPT_NO_HPET"           Disable HPET\n"
diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h
index fa6ccbe..29bf53f 100644
--- a/lib/librte_eal/common/eal_internal_cfg.h
+++ b/lib/librte_eal/common/eal_internal_cfg.h
@@ -83,6 +83,7 @@  struct internal_config {
 	const char *hugepage_dir;         /**< specific hugetlbfs directory to use */
 	const char *mbuf_pool_ops_name;   /**< mbuf pool ops name */
 	unsigned num_hugepage_sizes;      /**< how many sizes on this system */
+	enum rte_iova_mode iova_mode ;    /**< Set iova mode on this system  */
 	struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
 };
 extern struct internal_config internal_config; /**< Global EAL configuration. */
diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h
index 30e6bb4..7786189 100644
--- a/lib/librte_eal/common/eal_options.h
+++ b/lib/librte_eal/common/eal_options.h
@@ -83,6 +83,8 @@  enum {
 	OPT_VFIO_INTR_NUM,
 #define OPT_VMWARE_TSC_MAP    "vmware-tsc-map"
 	OPT_VMWARE_TSC_MAP_NUM,
+#define OPT_IOVA_MODE          "iova-mode"
+	OPT_IOVA_MODE_NUM,
 	OPT_LONG_MAX_NUM
 };