DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal
@ 2014-09-22  8:37 David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option David Marchand
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:37 UTC (permalink / raw)
  To: dev

Following Neil comments, here is a patchset to rework the eal options parsing.
I tried to have everything common to linux and bsd in a single file.

I ran a little make test on linux, it looks fine (at least I have as many fails
as before my changes).

There is still work in this part, but I want to stop here.
If anyone wants to continue ... :-)


-- 
David Marchand

David Marchand (7):
  eal: remove unused --use-device option
  eal: factorise unsupported option handling
  eal: remove duplicate handling of white/black list
  eal: fix checkpatch issues before moving code
  eal: merge bsd and linux common options parsing
  eal: rework long options parsing
  eal: indent files

 lib/librte_eal/bsdapp/eal/Makefile          |    1 +
 lib/librte_eal/bsdapp/eal/eal.c             |  388 +++--------------------
 lib/librte_eal/common/eal_common_options.c  |  392 +++++++++++++++++++++++
 lib/librte_eal/common/include/eal_options.h |   84 +++++
 lib/librte_eal/linuxapp/eal/Makefile        |    1 +
 lib/librte_eal/linuxapp/eal/eal.c           |  457 +++++----------------------
 6 files changed, 593 insertions(+), 730 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_options.c
 create mode 100644 lib/librte_eal/common/include/eal_options.h

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
@ 2014-09-22  8:37 ` David Marchand
  2014-09-22 12:22   ` Neil Horman
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 2/7] eal: factorise unsupported option handling David Marchand
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:37 UTC (permalink / raw)
  To: dev

Following commit cac6d08c8bde2fdb57806c49038187cdb54219a8 and
4bf3fe634a4d9dfce90c4167f3a47d0e2ddf1e64, this option is not available anymore.

Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/bsdapp/eal/eal.c   |    7 -------
 lib/librte_eal/linuxapp/eal/eal.c |    7 -------
 2 files changed, 14 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 2f84742..ffdc441 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -89,7 +89,6 @@
 #define OPT_NO_HUGE     "no-huge"
 #define OPT_FILE_PREFIX "file-prefix"
 #define OPT_SOCKET_MEM  "socket-mem"
-#define OPT_USE_DEVICE "use-device"
 #define OPT_PCI_WHITELIST "pci-whitelist"
 #define OPT_PCI_BLACKLIST "pci-blacklist"
 #define OPT_VDEV        "vdev"
@@ -645,12 +644,6 @@ eal_parse_args(int argc, char **argv)
 						"FreeBSD\n");
 				return -1;
 			}
-			else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
-				printf("The --use-device option is deprecated, please use\n"
-					"--whitelist or --vdev instead.\n");
-				eal_usage(prgname);
-				return -1;
-			}
 			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
 						optarg) < 0) {
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 38cace6..633e3b8 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -92,7 +92,6 @@
 #define OPT_NO_HUGE     "no-huge"
 #define OPT_FILE_PREFIX "file-prefix"
 #define OPT_SOCKET_MEM  "socket-mem"
-#define OPT_USE_DEVICE  "use-device"
 #define OPT_PCI_WHITELIST "pci-whitelist"
 #define OPT_PCI_BLACKLIST "pci-blacklist"
 #define OPT_VDEV        "vdev"
@@ -880,12 +879,6 @@ eal_parse_args(int argc, char **argv)
 					return -1;
 				}
 			}
-			else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
-				printf("The --use-device option is deprecated, please use\n"
-					"--whitelist or --vdev instead.\n");
-				eal_usage(prgname);
-				return -1;
-			}
 			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
 						optarg) < 0) {
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 2/7] eal: factorise unsupported option handling
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option David Marchand
@ 2014-09-22  8:37 ` David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 3/7] eal: remove duplicate handling of white/black list David Marchand
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:37 UTC (permalink / raw)
  To: dev

Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/bsdapp/eal/eal.c   |   21 ++++++---------------
 lib/librte_eal/linuxapp/eal/eal.c |    6 ++++++
 2 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index ffdc441..7e9f3aa 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -626,24 +626,9 @@ eal_parse_args(int argc, char **argv)
 			else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
 				internal_config.no_shconf = 1;
 			}
-			else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
-				RTE_LOG(ERR, EAL, "Option "OPT_HUGE_DIR" is not supported on"
-						"FreeBSD\n");
-				return -1;
-			}
 			else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
 				internal_config.process_type = eal_parse_proc_type(optarg);
 			}
-			else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
-				RTE_LOG(ERR, EAL, "Option "OPT_FILE_PREFIX" is not supported on"
-						"FreeBSD\n");
-				return -1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
-				RTE_LOG(ERR, EAL, "Option "OPT_SOCKET_MEM" is not supported on"
-						"FreeBSD\n");
-				return -1;
-			}
 			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
 						optarg) < 0) {
@@ -684,6 +669,12 @@ eal_parse_args(int argc, char **argv)
 					return -1;
 				}
 				internal_config.log_level = log;
+			} else {
+				RTE_LOG(ERR, EAL, "Option %s is not supported "
+					"on FreeBSD\n",
+					lgopts[option_index].name);
+				eal_usage(prgname);
+				return -1;
 			}
 			break;
 
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 633e3b8..bf63744 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -938,6 +938,12 @@ eal_parse_args(int argc, char **argv)
 			}
 			else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
 				internal_config.create_uio_dev = 1;
+			} else {
+				RTE_LOG(ERR, EAL, "Option %s is not supported "
+					"on Linux\n",
+					lgopts[option_index].name);
+				eal_usage(prgname);
+				return -1;
 			}
 			break;
 
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 3/7] eal: remove duplicate handling of white/black list
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 2/7] eal: factorise unsupported option handling David Marchand
@ 2014-09-22  8:37 ` David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 4/7] eal: fix checkpatch issues before moving code David Marchand
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:37 UTC (permalink / raw)
  To: dev

We can handle both short and long options for those in the same case.

Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/bsdapp/eal/eal.c   |   18 ++----------------
 lib/librte_eal/linuxapp/eal/eal.c |   18 ++----------------
 2 files changed, 4 insertions(+), 32 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 7e9f3aa..8599a35 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -513,8 +513,8 @@ eal_parse_args(int argc, char **argv)
 		{OPT_PROC_TYPE, 1, 0, 0},
 		{OPT_FILE_PREFIX, 1, 0, 0},
 		{OPT_SOCKET_MEM, 1, 0, 0},
-		{OPT_PCI_WHITELIST, 1, 0, 0},
-		{OPT_PCI_BLACKLIST, 1, 0, 0},
+		{OPT_PCI_WHITELIST, 1, 0, 'w'},
+		{OPT_PCI_BLACKLIST, 1, 0, 'b'},
 		{OPT_VDEV, 1, 0, 0},
 		{OPT_SYSLOG, 1, NULL, 0},
 		{OPT_LOG_LEVEL, 1, NULL, 0},
@@ -629,20 +629,6 @@ eal_parse_args(int argc, char **argv)
 			else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
 				internal_config.process_type = eal_parse_proc_type(optarg);
 			}
-			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
-				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
-						optarg) < 0) {
-					eal_usage(prgname);
-					return -1;
-				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_PCI_WHITELIST)) {
-				if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
-						optarg) < 0) {
-					eal_usage(prgname);
-					return -1;
-				}
-			}
 			else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
 						optarg) < 0) {
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index bf63744..655c454 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -718,8 +718,8 @@ eal_parse_args(int argc, char **argv)
 		{OPT_PROC_TYPE, 1, 0, 0},
 		{OPT_FILE_PREFIX, 1, 0, 0},
 		{OPT_SOCKET_MEM, 1, 0, 0},
-		{OPT_PCI_WHITELIST, 1, 0, 0},
-		{OPT_PCI_BLACKLIST, 1, 0, 0},
+		{OPT_PCI_WHITELIST, 1, 0, 'w'},
+		{OPT_PCI_BLACKLIST, 1, 0, 'b'},
 		{OPT_VDEV, 1, 0, 0},
 		{OPT_SYSLOG, 1, NULL, 0},
 		{OPT_LOG_LEVEL, 1, NULL, 0},
@@ -879,20 +879,6 @@ eal_parse_args(int argc, char **argv)
 					return -1;
 				}
 			}
-			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
-				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
-						optarg) < 0) {
-					eal_usage(prgname);
-					return -1;
-				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_PCI_WHITELIST)) {
-				if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
-						optarg) < 0) {
-					eal_usage(prgname);
-					return -1;
-				}
-			}
 			else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
 						optarg) < 0) {
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 4/7] eal: fix checkpatch issues before moving code
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
                   ` (2 preceding siblings ...)
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 3/7] eal: remove duplicate handling of white/black list David Marchand
@ 2014-09-22  8:37 ` David Marchand
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 5/7] eal: merge bsd and linux common options parsing David Marchand
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:37 UTC (permalink / raw)
  To: dev

Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/bsdapp/eal/eal.c   |   21 +++++++------------
 lib/librte_eal/linuxapp/eal/eal.c |   42 +++++++++++++------------------------
 2 files changed, 21 insertions(+), 42 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 8599a35..81d1a65 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -613,30 +613,23 @@ eal_parse_args(int argc, char **argv)
 		case 0:
 			if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
 				internal_config.no_hugetlbfs = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
 				internal_config.no_pci = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
 				internal_config.no_hpet = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
 				internal_config.vmware_tsc_map = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
 				internal_config.no_shconf = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
 				internal_config.process_type = eal_parse_proc_type(optarg);
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
 						optarg) < 0) {
 					eal_usage(prgname);
 					return -1;
 				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
 				if (eal_parse_syslog(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_SYSLOG "\n");
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 655c454..3393550 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -839,8 +839,7 @@ eal_parse_args(int argc, char **argv)
 		case 0:
 			if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
 				internal_config.no_hugetlbfs = 1;
-			}
-			if (!strcmp(lgopts[option_index].name, OPT_XEN_DOM0)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_XEN_DOM0)) {
 		#ifdef RTE_LIBRTE_XEN_DOM0
 				internal_config.xen_dom0_support = 1;
 		#else
@@ -849,44 +848,34 @@ eal_parse_args(int argc, char **argv)
 					" RTE_LIBRTE_XEN_DOM0=y\n");
 				return -1;
 		#endif
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
 				internal_config.no_pci = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
 				internal_config.no_hpet = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
 				internal_config.vmware_tsc_map = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
 				internal_config.no_shconf = 1;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
 				internal_config.hugepage_dir = optarg;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
 				internal_config.process_type = eal_parse_proc_type(optarg);
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
 				internal_config.hugefile_prefix = optarg;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
 				if (eal_parse_socket_mem(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_SOCKET_MEM "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
 				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
 						optarg) < 0) {
 					eal_usage(prgname);
 					return -1;
 				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
 				if (eal_parse_syslog(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_SYSLOG "\n");
@@ -905,24 +894,21 @@ eal_parse_args(int argc, char **argv)
 					return -1;
 				}
 				internal_config.log_level = log;
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_BASE_VIRTADDR)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_BASE_VIRTADDR)) {
 				if (eal_parse_base_virtaddr(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameter for --"
 							OPT_BASE_VIRTADDR "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
 				if (eal_parse_vfio_intr(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_VFIO_INTR "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			}
-			else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
+			} else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
 				internal_config.create_uio_dev = 1;
 			} else {
 				RTE_LOG(ERR, EAL, "Option %s is not supported "
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 5/7] eal: merge bsd and linux common options parsing
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
                   ` (3 preceding siblings ...)
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 4/7] eal: fix checkpatch issues before moving code David Marchand
@ 2014-09-22  8:37 ` David Marchand
  2014-09-22  8:38 ` [dpdk-dev] [PATCH 6/7] eal: rework long " David Marchand
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:37 UTC (permalink / raw)
  To: dev

All common options are now in a single file.
Common usage() has been moved as well.

Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/bsdapp/eal/Makefile          |    1 +
 lib/librte_eal/bsdapp/eal/eal.c             |  340 +++---------------------
 lib/librte_eal/common/eal_common_options.c  |  379 +++++++++++++++++++++++++++
 lib/librte_eal/common/include/eal_options.h |   58 ++++
 lib/librte_eal/linuxapp/eal/Makefile        |    1 +
 lib/librte_eal/linuxapp/eal/eal.c           |  370 ++++----------------------
 6 files changed, 519 insertions(+), 630 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_options.c
 create mode 100644 lib/librte_eal/common/include/eal_options.h

diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 8f44273..aaa174e 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -71,6 +71,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_string_fns.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_devargs.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_dev.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_options.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
 #CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 81d1a65..58f00fd 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -79,26 +79,10 @@
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
-
-#define OPT_HUGE_DIR    "huge-dir"
-#define OPT_PROC_TYPE   "proc-type"
-#define OPT_NO_SHCONF   "no-shconf"
-#define OPT_NO_HPET     "no-hpet"
-#define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
-#define OPT_NO_PCI      "no-pci"
-#define OPT_NO_HUGE     "no-huge"
-#define OPT_FILE_PREFIX "file-prefix"
-#define OPT_SOCKET_MEM  "socket-mem"
-#define OPT_PCI_WHITELIST "pci-whitelist"
-#define OPT_PCI_BLACKLIST "pci-blacklist"
-#define OPT_VDEV        "vdev"
-#define OPT_SYSLOG      "syslog"
-#define OPT_LOG_LEVEL   "log-level"
+#include "eal_options.h"
 
 #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL)
 
-#define BITS_PER_HEX 4
-
 /* Allow the application to print its usage message too if set */
 static rte_usage_hook_t	rte_application_usage_hook = NULL;
 /* early configuration structure, when memory config is not mmapped */
@@ -285,34 +269,8 @@ rte_config_init(void)
 static void
 eal_usage(const char *prgname)
 {
-	printf("\nUsage: %s -c COREMASK -n NUM [-m NB] [-r NUM] [-b <domain:bus:devid.func>]"
-	       "[--proc-type primary|secondary|auto] \n\n"
-	       "EAL options:\n"
-	       "  -c COREMASK  : A hexadecimal bitmask of cores to run on\n"
-	       "  -n NUM       : Number of memory channels\n"
-	       "  -v           : Display version information on startup\n"
-	       "  -m MB        : memory to allocate\n"
-	       "  -r NUM       : force number of memory ranks (don't detect)\n"
-	       "  --"OPT_LOG_LEVEL"  : set default log level\n"
-	       "  --"OPT_PROC_TYPE"  : type of this process\n"
-	       "  --"OPT_PCI_BLACKLIST", -b: add a PCI device in black list.\n"
-	       "               Prevent EAL from using this PCI device. The argument\n"
-	       "               format is <domain:bus:devid.func>.\n"
-	       "  --"OPT_PCI_WHITELIST", -w: add a PCI device in white list.\n"
-	       "               Only use the specified PCI devices. The argument format\n"
-	       "               is <[domain:]bus:devid.func>. This option can be present\n"
-	       "               several times (once per device).\n"
-	       "               [NOTE: PCI whitelist cannot be used with -b option]\n"
-	       "  --"OPT_VDEV": add a virtual device.\n"
-	       "               The argument format is <driver><id>[,key=val,...]\n"
-	       "               (ex: --vdev=eth_pcap0,iface=eth2).\n"
-	       "  --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of native RDTSC\n"
-	       "\nEAL options for DEBUG use only:\n"
-	       "  --"OPT_NO_HUGE"  : use malloc instead of hugetlbfs\n"
-	       "  --"OPT_NO_PCI"   : disable pci\n"
-	       "  --"OPT_NO_SHCONF": no shared config (mmap'd files)\n"
-	       "\n",
-	       prgname);
+	printf("\nUsage: %s ", prgname);
+	eal_common_usage();
 	/* Allow the application to print its usage message too if hook is set */
 	if ( rte_application_usage_hook ) {
 		printf("===== Application Usage =====\n\n");
@@ -333,136 +291,6 @@ rte_set_application_usage_hook( rte_usage_hook_t usage_func )
 	return old_func;
 }
 
-/*
- * Parse the coremask given as argument (hexadecimal string) and fill
- * the global configuration (core role and core count) with the parsed
- * value.
- */
-static int xdigit2val(unsigned char c)
-{
-	int val;
-	if(isdigit(c))
-		val = c - '0';
-	else if(isupper(c))
-		val = c - 'A' + 10;
-	else
-		val = c - 'a' + 10;
-	return val;
-}
-static int
-eal_parse_coremask(const char *coremask)
-{
-	struct rte_config *cfg = rte_eal_get_configuration();
-	int i, j, idx = 0 ;
-	unsigned count = 0;
-	char c;
-	int val;
-
-	if (coremask == NULL)
-		return -1;
-	/* Remove all blank characters ahead and after .
-	 * Remove 0x/0X if exists.
-	 */
-	while (isblank(*coremask))
-		coremask++;
-	if (coremask[0] == '0' && ((coremask[1] == 'x')
-		||  (coremask[1] == 'X')) )
-		coremask += 2;
-	i = strnlen(coremask, sysconf(_SC_ARG_MAX));
-	while ((i > 0) && isblank(coremask[i - 1]))
-		i--;
-	if (i == 0)
-		return -1;
-
-	for (i = i - 1; i >= 0 && idx < RTE_MAX_LCORE; i--) {
-		c = coremask[i];
-		if (isxdigit(c) == 0) {
-			/* invalid characters */
-			return (-1);
-		}
-		val = xdigit2val(c);
-		for(j = 0; j < BITS_PER_HEX && idx < RTE_MAX_LCORE; j++, idx++) {
-			if((1 << j) & val) {
-				cfg->lcore_role[idx] = ROLE_RTE;
-				if(count == 0)
-					cfg->master_lcore = idx;
-				count++;
-			} else  {
-				cfg->lcore_role[idx] = ROLE_OFF;
-			}
-		}
-	}
-	for(; i >= 0; i--)
-		if(coremask[i] != '0')
-			return -1;
-	for(; idx < RTE_MAX_LCORE; idx++)
-		cfg->lcore_role[idx] = ROLE_OFF;
-	if(count == 0)
-		return -1;
-	return 0;
-}
-
-static int
-eal_parse_syslog(const char *facility)
-{
-	int i;
-	static struct {
-		const char *name;
-		int value;
-	} map[] = {
-		{ "auth", LOG_AUTH },
-		{ "cron", LOG_CRON },
-		{ "daemon", LOG_DAEMON },
-		{ "ftp", LOG_FTP },
-		{ "kern", LOG_KERN },
-		{ "lpr", LOG_LPR },
-		{ "mail", LOG_MAIL },
-		{ "news", LOG_NEWS },
-		{ "syslog", LOG_SYSLOG },
-		{ "user", LOG_USER },
-		{ "uucp", LOG_UUCP },
-		{ "local0", LOG_LOCAL0 },
-		{ "local1", LOG_LOCAL1 },
-		{ "local2", LOG_LOCAL2 },
-		{ "local3", LOG_LOCAL3 },
-		{ "local4", LOG_LOCAL4 },
-		{ "local5", LOG_LOCAL5 },
-		{ "local6", LOG_LOCAL6 },
-		{ "local7", LOG_LOCAL7 },
-		{ NULL, 0 }
-	};
-
-	for (i = 0; map[i].name; i++) {
-		if (!strcmp(facility, map[i].name)) {
-			internal_config.syslog_facility = map[i].value;
-			return 0;
-		}
-	}
-	return -1;
-}
-
-static int
-eal_parse_log_level(const char *level, uint32_t *log_level)
-{
-	char *end;
-	unsigned long tmp;
-
-	errno = 0;
-	tmp = strtoul(level, &end, 0);
-
-	/* check for errors */
-	if ((errno != 0) || (level[0] == '\0') ||
-	    end == NULL || (*end != '\0'))
-		return -1;
-
-	/* log_level is a uint32_t */
-	if (tmp >= UINT32_MAX)
-		return -1;
-
-	*log_level = tmp;
-	return 0;
-}
-
 static inline size_t
 eal_get_hugepage_mem_size(void)
 {
@@ -481,19 +309,6 @@ eal_get_hugepage_mem_size(void)
 	return (size < SIZE_MAX) ? (size_t)(size) : SIZE_MAX;
 }
 
-static enum rte_proc_type_t
-eal_parse_proc_type(const char *arg)
-{
-	if (strncasecmp(arg, "primary", sizeof("primary")) == 0)
-		return RTE_PROC_PRIMARY;
-	if (strncasecmp(arg, "secondary", sizeof("secondary")) == 0)
-		return RTE_PROC_SECONDARY;
-	if (strncasecmp(arg, "auto", sizeof("auto")) == 0)
-		return RTE_PROC_AUTO;
-
-	return RTE_PROC_INVALID;
-}
-
 /* Parse the argument given in the command line of the application */
 static int
 eal_parse_args(int argc, char **argv)
@@ -503,23 +318,6 @@ eal_parse_args(int argc, char **argv)
 	int option_index;
 	int coremask_ok = 0;
 	char *prgname = argv[0];
-	static struct option lgopts[] = {
-		{OPT_NO_HUGE, 0, 0, 0},
-		{OPT_NO_PCI, 0, 0, 0},
-		{OPT_NO_HPET, 0, 0, 0},
-		{OPT_VMWARE_TSC_MAP, 0, 0, 0},
-		{OPT_HUGE_DIR, 1, 0, 0},
-		{OPT_NO_SHCONF, 0, 0, 0},
-		{OPT_PROC_TYPE, 1, 0, 0},
-		{OPT_FILE_PREFIX, 1, 0, 0},
-		{OPT_SOCKET_MEM, 1, 0, 0},
-		{OPT_PCI_WHITELIST, 1, 0, 'w'},
-		{OPT_PCI_BLACKLIST, 1, 0, 'b'},
-		{OPT_VDEV, 1, 0, 0},
-		{OPT_SYSLOG, 1, NULL, 0},
-		{OPT_LOG_LEVEL, 1, NULL, 0},
-		{0, 0, 0, 0}
-	};
 
 	argvopt = argv;
 
@@ -547,117 +345,51 @@ eal_parse_args(int argc, char **argv)
 
 	internal_config.vmware_tsc_map = 0;
 
-	while ((opt = getopt_long(argc, argvopt, "b:w:c:m:n:r:v",
-				  lgopts, &option_index)) != EOF) {
+	while ((opt = getopt_long(argc, argvopt, eal_short_options,
+				  eal_long_options, &option_index)) != EOF) {
 
-		switch (opt) {
-		/* blacklist */
-		case 'b':
-			if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
-					optarg) < 0) {
-				eal_usage(prgname);
-				return (-1);
-			}
-			break;
-		/* whitelist */
-		case 'w':
-			if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
-					optarg) < 0) {
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-		/* coremask */
-		case 'c':
-			if (eal_parse_coremask(optarg) < 0) {
-				RTE_LOG(ERR, EAL, "invalid coremask\n");
-				eal_usage(prgname);
-				return -1;
-			}
-			coremask_ok = 1;
-			break;
-		/* size of memory */
-		case 'm':
-			internal_config.memory = atoi(optarg);
-			internal_config.memory *= 1024ULL;
-			internal_config.memory *= 1024ULL;
-			break;
-		/* force number of channels */
-		case 'n':
-			internal_config.force_nchannel = atoi(optarg);
-			if (internal_config.force_nchannel == 0 ||
-			    internal_config.force_nchannel > 4) {
-				RTE_LOG(ERR, EAL, "invalid channel number\n");
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-		/* force number of ranks */
-		case 'r':
-			internal_config.force_nrank = atoi(optarg);
-			if (internal_config.force_nrank == 0 ||
-			    internal_config.force_nrank > 16) {
-				RTE_LOG(ERR, EAL, "invalid rank number\n");
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-		case 'v':
-			/* since message is explicitly requested by user, we
-			 * write message at highest log level so it can always be seen
-			 * even if info or warning messages are disabled */
-			RTE_LOG(CRIT, EAL, "RTE Version: '%s'\n", rte_version());
-			break;
+		int ret;
+
+		/* getopt is not happy, stop right now */
+		if (opt == '?')
+			return -1;
 
+		ret = eal_parse_common_option(opt, optarg, option_index,
+					      &internal_config);
+		/* common parser is not happy */
+		if (ret < 0) {
+			eal_usage(prgname);
+			return -1;
+		}
+		/* common parser handled this option */
+		if (ret == 0) {
+			/* special case, note that the common parser accepted
+			 * the coremask option */
+			if (opt == 'c')
+				coremask_ok = 1;
+			continue;
+		}
+
+		switch (opt) {
 		/* long options */
 		case 0:
-			if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
-				internal_config.no_hugetlbfs = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
-				internal_config.no_pci = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
-				internal_config.no_hpet = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
-				internal_config.vmware_tsc_map = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
-				internal_config.no_shconf = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
-				internal_config.process_type = eal_parse_proc_type(optarg);
-			} else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
-				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
-						optarg) < 0) {
-					eal_usage(prgname);
-					return -1;
-				}
-			} else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
-				if (eal_parse_syslog(optarg) < 0) {
-					RTE_LOG(ERR, EAL, "invalid parameters for --"
-							OPT_SYSLOG "\n");
-					eal_usage(prgname);
-					return -1;
-				}
-			} else if (!strcmp(lgopts[option_index].name,
-					 OPT_LOG_LEVEL)) {
-				uint32_t log;
-
-				if (eal_parse_log_level(optarg, &log) < 0) {
-					RTE_LOG(ERR, EAL,
-						"invalid parameters for --"
-						OPT_LOG_LEVEL "\n");
-					eal_usage(prgname);
-					return -1;
-				}
-				internal_config.log_level = log;
-			} else {
+			{
 				RTE_LOG(ERR, EAL, "Option %s is not supported "
 					"on FreeBSD\n",
-					lgopts[option_index].name);
+					eal_long_options[option_index].name);
 				eal_usage(prgname);
 				return -1;
 			}
 			break;
 
 		default:
+			if (isprint(opt)) {
+				RTE_LOG(ERR, EAL, "Option %c is not supported "
+					"on FreeBSD\n", opt);
+			} else {
+				RTE_LOG(ERR, EAL, "Option %d is not supported "
+					"on FreeBSD\n", opt);
+			}
 			eal_usage(prgname);
 			return -1;
 		}
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
new file mode 100644
index 0000000..ead4300
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -0,0 +1,379 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2014 6WIND S.A.
+ *
+ *   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 <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <ctype.h>
+#include <limits.h>
+#include <errno.h>
+#include <getopt.h>
+
+#include <rte_eal.h>
+#include <rte_log.h>
+#include <rte_lcore.h>
+#include <rte_version.h>
+#include <rte_devargs.h>
+
+#include "eal_internal_cfg.h"
+#include "eal_options.h"
+
+#define BITS_PER_HEX 4
+
+const char
+eal_short_options[] =
+	"b:" /* pci-blacklist */
+	"w:" /* pci-whitelist */
+	"c:"
+	"d:"
+	"m:"
+	"n:"
+	"r:"
+	"v";
+
+const struct option
+eal_long_options[] = {
+	{OPT_HUGE_DIR, 1, 0, 0},
+	{OPT_PROC_TYPE, 1, 0, 0},
+	{OPT_NO_SHCONF, 0, 0, 0},
+	{OPT_NO_HPET, 0, 0, 0},
+	{OPT_VMWARE_TSC_MAP, 0, 0, 0},
+	{OPT_NO_PCI, 0, 0, 0},
+	{OPT_NO_HUGE, 0, 0, 0},
+	{OPT_FILE_PREFIX, 1, 0, 0},
+	{OPT_SOCKET_MEM, 1, 0, 0},
+	{OPT_PCI_WHITELIST, 1, 0, 'w'},
+	{OPT_PCI_BLACKLIST, 1, 0, 'b'},
+	{OPT_VDEV, 1, 0, 0},
+	{OPT_SYSLOG, 1, NULL, 0},
+	{OPT_LOG_LEVEL, 1, NULL, 0},
+	{OPT_BASE_VIRTADDR, 1, 0, 0},
+	{OPT_XEN_DOM0, 0, 0, 0},
+	{OPT_CREATE_UIO_DEV, 1, NULL, 0},
+	{OPT_VFIO_INTR, 1, NULL, 0},
+	{0, 0, 0, 0}
+};
+
+/*
+ * Parse the coremask given as argument (hexadecimal string) and fill
+ * the global configuration (core role and core count) with the parsed
+ * value.
+ */
+static int xdigit2val(unsigned char c)
+{
+	int val;
+
+	if (isdigit(c))
+		val = c - '0';
+	else if (isupper(c))
+		val = c - 'A' + 10;
+	else
+		val = c - 'a' + 10;
+	return val;
+}
+
+static int
+eal_parse_coremask(const char *coremask)
+{
+	struct rte_config *cfg = rte_eal_get_configuration();
+	int i, j, idx = 0;
+	unsigned count = 0;
+	char c;
+	int val;
+
+	if (coremask == NULL)
+		return -1;
+	/* Remove all blank characters ahead and after .
+	 * Remove 0x/0X if exists.
+	 */
+	while (isblank(*coremask))
+		coremask++;
+	if (coremask[0] == '0' && ((coremask[1] == 'x')
+		|| (coremask[1] == 'X')))
+		coremask += 2;
+	i = strnlen(coremask, PATH_MAX);
+	while ((i > 0) && isblank(coremask[i - 1]))
+		i--;
+	if (i == 0)
+		return -1;
+
+	for (i = i - 1; i >= 0 && idx < RTE_MAX_LCORE; i--) {
+		c = coremask[i];
+		if (isxdigit(c) == 0) {
+			/* invalid characters */
+			return -1;
+		}
+		val = xdigit2val(c);
+		for (j = 0; j < BITS_PER_HEX && idx < RTE_MAX_LCORE; j++, idx++)
+		{
+			if ((1 << j) & val) {
+				if (!lcore_config[idx].detected) {
+					RTE_LOG(ERR, EAL, "lcore %u "
+					        "unavailable\n", idx);
+					return -1;
+				}
+				cfg->lcore_role[idx] = ROLE_RTE;
+				if (count == 0)
+					cfg->master_lcore = idx;
+				count++;
+			} else {
+				cfg->lcore_role[idx] = ROLE_OFF;
+			}
+		}
+	}
+	for (; i >= 0; i--)
+		if (coremask[i] != '0')
+			return -1;
+	for (; idx < RTE_MAX_LCORE; idx++)
+		cfg->lcore_role[idx] = ROLE_OFF;
+	if (count == 0)
+		return -1;
+	/* Update the count of enabled logical cores of the EAL configuration */
+	cfg->lcore_count = count;
+	return 0;
+}
+
+static int
+eal_parse_syslog(const char *facility, struct internal_config *conf)
+{
+	int i;
+	static struct {
+		const char *name;
+		int value;
+	} map[] = {
+		{ "auth", LOG_AUTH },
+		{ "cron", LOG_CRON },
+		{ "daemon", LOG_DAEMON },
+		{ "ftp", LOG_FTP },
+		{ "kern", LOG_KERN },
+		{ "lpr", LOG_LPR },
+		{ "mail", LOG_MAIL },
+		{ "news", LOG_NEWS },
+		{ "syslog", LOG_SYSLOG },
+		{ "user", LOG_USER },
+		{ "uucp", LOG_UUCP },
+		{ "local0", LOG_LOCAL0 },
+		{ "local1", LOG_LOCAL1 },
+		{ "local2", LOG_LOCAL2 },
+		{ "local3", LOG_LOCAL3 },
+		{ "local4", LOG_LOCAL4 },
+		{ "local5", LOG_LOCAL5 },
+		{ "local6", LOG_LOCAL6 },
+		{ "local7", LOG_LOCAL7 },
+		{ NULL, 0 }
+	};
+
+	for (i = 0; map[i].name; i++) {
+		if (!strcmp(facility, map[i].name)) {
+			conf->syslog_facility = map[i].value;
+			return 0;
+		}
+	}
+	return -1;
+}
+
+static int
+eal_parse_log_level(const char *level, uint32_t *log_level)
+{
+	char *end;
+	unsigned long tmp;
+
+	errno = 0;
+	tmp = strtoul(level, &end, 0);
+
+	/* check for errors */
+	if ((errno != 0) || (level[0] == '\0') ||
+	    end == NULL || (*end != '\0'))
+		return -1;
+
+	/* log_level is a uint32_t */
+	if (tmp >= UINT32_MAX)
+		return -1;
+
+	*log_level = tmp;
+	return 0;
+}
+
+static enum rte_proc_type_t
+eal_parse_proc_type(const char *arg)
+{
+	if (strncasecmp(arg, "primary", sizeof("primary")) == 0)
+		return RTE_PROC_PRIMARY;
+	if (strncasecmp(arg, "secondary", sizeof("secondary")) == 0)
+		return RTE_PROC_SECONDARY;
+	if (strncasecmp(arg, "auto", sizeof("auto")) == 0)
+		return RTE_PROC_AUTO;
+
+	return RTE_PROC_INVALID;
+}
+
+int
+eal_parse_common_option(int opt, const char *optarg, int longindex,
+			struct internal_config *conf)
+{
+	switch (opt) {
+	/* blacklist */
+	case 'b':
+		if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
+				optarg) < 0) {
+			return -1;
+		}
+		break;
+	/* whitelist */
+	case 'w':
+		if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
+				optarg) < 0) {
+			return -1;
+		}
+		break;
+	/* coremask */
+	case 'c':
+		if (eal_parse_coremask(optarg) < 0) {
+			RTE_LOG(ERR, EAL, "invalid coremask\n");
+			return -1;
+		}
+		break;
+	/* size of memory */
+	case 'm':
+		conf->memory = atoi(optarg);
+		conf->memory *= 1024ULL;
+		conf->memory *= 1024ULL;
+		break;
+	/* force number of channels */
+	case 'n':
+		conf->force_nchannel = atoi(optarg);
+		if (conf->force_nchannel == 0 ||
+		    conf->force_nchannel > 4) {
+			RTE_LOG(ERR, EAL, "invalid channel number\n");
+			return -1;
+		}
+		break;
+	/* force number of ranks */
+	case 'r':
+		conf->force_nrank = atoi(optarg);
+		if (conf->force_nrank == 0 ||
+		    conf->force_nrank > 16) {
+			RTE_LOG(ERR, EAL, "invalid rank number\n");
+			return -1;
+		}
+		break;
+	case 'v':
+		/* since message is explicitly requested by user, we
+		 * write message at highest log level so it can always
+		 * be seen
+		 * even if info or warning messages are disabled */
+		RTE_LOG(CRIT, EAL, "RTE Version: '%s'\n", rte_version());
+		break;
+
+	/* long options */
+	case 0:
+		if (!strcmp(eal_long_options[longindex].name, OPT_NO_HUGE)) {
+			conf->no_hugetlbfs = 1;
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_PCI)) {
+			conf->no_pci = 1;
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_HPET)) {
+			conf->no_hpet = 1;
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_VMWARE_TSC_MAP)) {
+			conf->vmware_tsc_map = 1;
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_SHCONF)) {
+			conf->no_shconf = 1;
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_PROC_TYPE)) {
+			conf->process_type = eal_parse_proc_type(optarg);
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_VDEV)) {
+			if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
+					optarg) < 0) {
+				return -1;
+			}
+		} else if (!strcmp(eal_long_options[longindex].name, OPT_SYSLOG)) {
+			if (eal_parse_syslog(optarg, conf) < 0) {
+				RTE_LOG(ERR, EAL, "invalid parameters for --"
+						OPT_SYSLOG "\n");
+				return -1;
+			}
+		} else if (!strcmp(eal_long_options[longindex].name,
+				 OPT_LOG_LEVEL)) {
+			uint32_t log;
+
+			if (eal_parse_log_level(optarg, &log) < 0) {
+				RTE_LOG(ERR, EAL,
+					"invalid parameters for --"
+					OPT_LOG_LEVEL "\n");
+				return -1;
+			}
+			conf->log_level = log;
+		}
+
+		break;
+
+	/* don't know what to do, leave this to caller */
+	default:
+		return 1;
+
+	}
+
+	return 0;
+}
+
+void
+eal_common_usage(void)
+{
+	printf("-c COREMASK -n NUM [-m NB] [-r NUM] [-b <domain:bus:devid.func>]"
+	       "[--proc-type primary|secondary|auto]\n\n"
+	       "EAL common options:\n"
+	       "  -c COREMASK  : A hexadecimal bitmask of cores to run on\n"
+	       "  -n NUM       : Number of memory channels\n"
+	       "  -v           : Display version information on startup\n"
+	       "  -m MB        : memory to allocate (see also --"OPT_SOCKET_MEM")\n"
+	       "  -r NUM       : force number of memory ranks (don't detect)\n"
+	       "  --"OPT_SYSLOG"     : set syslog facility\n"
+	       "  --"OPT_LOG_LEVEL"  : set default log level\n"
+	       "  --"OPT_PROC_TYPE"  : type of this process\n"
+	       "  --"OPT_PCI_BLACKLIST", -b: add a PCI device in black list.\n"
+	       "               Prevent EAL from using this PCI device. The argument\n"
+	       "               format is <domain:bus:devid.func>.\n"
+	       "  --"OPT_PCI_WHITELIST", -w: add a PCI device in white list.\n"
+	       "               Only use the specified PCI devices. The argument format\n"
+	       "               is <[domain:]bus:devid.func>. This option can be present\n"
+	       "               several times (once per device).\n"
+	       "               [NOTE: PCI whitelist cannot be used with -b option]\n"
+	       "  --"OPT_VDEV": add a virtual device.\n"
+	       "               The argument format is <driver><id>[,key=val,...]\n"
+	       "               (ex: --vdev=eth_pcap0,iface=eth2).\n"
+	       "  --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of native RDTSC\n"
+	       "\nEAL options for DEBUG use only:\n"
+	       "  --"OPT_NO_HUGE"  : use malloc instead of hugetlbfs\n"
+	       "  --"OPT_NO_PCI"   : disable pci\n"
+	       "  --"OPT_NO_HPET"  : disable hpet\n"
+	       "  --"OPT_NO_SHCONF": no shared config (mmap'd files)\n"
+	       "\n");
+}
diff --git a/lib/librte_eal/common/include/eal_options.h b/lib/librte_eal/common/include/eal_options.h
new file mode 100644
index 0000000..4e6b90d
--- /dev/null
+++ b/lib/librte_eal/common/include/eal_options.h
@@ -0,0 +1,58 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2014 6WIND S.A.
+ *
+ *   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.
+ */
+
+#define OPT_PCI_WHITELIST "pci-whitelist"
+#define OPT_PCI_BLACKLIST "pci-blacklist"
+
+#define OPT_HUGE_DIR    "huge-dir"
+#define OPT_PROC_TYPE   "proc-type"
+#define OPT_NO_SHCONF   "no-shconf"
+#define OPT_NO_HPET     "no-hpet"
+#define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
+#define OPT_NO_PCI      "no-pci"
+#define OPT_NO_HUGE     "no-huge"
+#define OPT_FILE_PREFIX "file-prefix"
+#define OPT_SOCKET_MEM  "socket-mem"
+#define OPT_VDEV        "vdev"
+#define OPT_SYSLOG      "syslog"
+#define OPT_LOG_LEVEL   "log-level"
+#define OPT_BASE_VIRTADDR   "base-virtaddr"
+#define OPT_XEN_DOM0    "xen-dom0"
+#define OPT_CREATE_UIO_DEV "create-uio-dev"
+#define OPT_VFIO_INTR    "vfio-intr"
+
+extern const char eal_short_options[];
+extern const struct option eal_long_options[];
+
+int eal_parse_common_option(int opt, const char *argv, int longindex,
+			    struct internal_config *conf);
+void eal_common_usage(void);
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 756d6b0..c99433e 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -82,6 +82,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_string_fns.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_devargs.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_dev.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_options.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
 CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 3393550..d82debf 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -82,25 +82,7 @@
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
-
-#define OPT_HUGE_DIR    "huge-dir"
-#define OPT_PROC_TYPE   "proc-type"
-#define OPT_NO_SHCONF   "no-shconf"
-#define OPT_NO_HPET     "no-hpet"
-#define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
-#define OPT_NO_PCI      "no-pci"
-#define OPT_NO_HUGE     "no-huge"
-#define OPT_FILE_PREFIX "file-prefix"
-#define OPT_SOCKET_MEM  "socket-mem"
-#define OPT_PCI_WHITELIST "pci-whitelist"
-#define OPT_PCI_BLACKLIST "pci-blacklist"
-#define OPT_VDEV        "vdev"
-#define OPT_SYSLOG      "syslog"
-#define OPT_LOG_LEVEL   "log-level"
-#define OPT_BASE_VIRTADDR   "base-virtaddr"
-#define OPT_XEN_DOM0    "xen-dom0"
-#define OPT_CREATE_UIO_DEV "create-uio-dev"
-#define OPT_VFIO_INTR    "vfio-intr"
+#include "eal_options.h"
 
 #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL)
 
@@ -108,8 +90,6 @@
 
 #define HIGHEST_RPL 3
 
-#define BITS_PER_HEX 4
-
 /* Allow the application to print its usage message too if set */
 static rte_usage_hook_t	rte_application_usage_hook = NULL;
 
@@ -372,47 +352,21 @@ eal_hugedirs_unlock(void)
 static void
 eal_usage(const char *prgname)
 {
-	printf("\nUsage: %s -c COREMASK -n NUM [-m NB] [-r NUM] [-b <domain:bus:devid.func>]"
-	       "[--proc-type primary|secondary|auto] \n\n"
-	       "EAL options:\n"
-	       "  -c COREMASK  : A hexadecimal bitmask of cores to run on\n"
-	       "  -n NUM       : Number of memory channels\n"
-		   "  -v           : Display version information on startup\n"
+	printf("\nUsage: %s ", prgname);
+	eal_common_usage();
+	printf("EAL Linux options:\n"
 	       "  -d LIB.so    : add driver (can be used multiple times)\n"
-	       "  -m MB        : memory to allocate (see also --"OPT_SOCKET_MEM")\n"
-	       "  -r NUM       : force number of memory ranks (don't detect)\n"
 	       "  --"OPT_XEN_DOM0" : support application running on Xen Domain0 "
 			   "without hugetlbfs\n"
-	       "  --"OPT_SYSLOG"     : set syslog facility\n"
-	       "  --"OPT_LOG_LEVEL"  : set default log level\n"
 	       "  --"OPT_SOCKET_MEM" : memory to allocate on specific\n"
 		   "                 sockets (use comma separated values)\n"
 	       "  --"OPT_HUGE_DIR"   : directory where hugetlbfs is mounted\n"
-	       "  --"OPT_PROC_TYPE"  : type of this process\n"
 	       "  --"OPT_FILE_PREFIX": prefix for hugepage filenames\n"
-	       "  --"OPT_PCI_BLACKLIST", -b: add a PCI device in black list.\n"
-	       "               Prevent EAL from using this PCI device. The argument\n"
-	       "               format is <domain:bus:devid.func>.\n"
-	       "  --"OPT_PCI_WHITELIST", -w: add a PCI device in white list.\n"
-	       "               Only use the specified PCI devices. The argument format\n"
-	       "               is <[domain:]bus:devid.func>. This option can be present\n"
-	       "               several times (once per device).\n"
-	       "               [NOTE: PCI whitelist cannot be used with -b option]\n"
-	       "  --"OPT_VDEV": add a virtual device.\n"
-	       "               The argument format is <driver><id>[,key=val,...]\n"
-	       "               (ex: --vdev=eth_pcap0,iface=eth2).\n"
-	       "  --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of native RDTSC\n"
 	       "  --"OPT_BASE_VIRTADDR": specify base virtual address\n"
 	       "  --"OPT_VFIO_INTR": specify desired interrupt mode for VFIO "
 			   "(legacy|msi|msix)\n"
 	       "  --"OPT_CREATE_UIO_DEV": create /dev/uioX (usually done by hotplug)\n"
-	       "\nEAL options for DEBUG use only:\n"
-	       "  --"OPT_NO_HUGE"  : use malloc instead of hugetlbfs\n"
-	       "  --"OPT_NO_PCI"   : disable pci\n"
-	       "  --"OPT_NO_HPET"  : disable hpet\n"
-	       "  --"OPT_NO_SHCONF": no shared config (mmap'd files)\n"
-	       "\n",
-	       prgname);
+	       "\n");
 	/* Allow the application to print its usage message too if hook is set */
 	if ( rte_application_usage_hook ) {
 		printf("===== Application Usage =====\n\n");
@@ -433,143 +387,6 @@ rte_set_application_usage_hook( rte_usage_hook_t usage_func )
 	return old_func;
 }
 
-/*
- * Parse the coremask given as argument (hexadecimal string) and fill
- * the global configuration (core role and core count) with the parsed
- * value.
- */
-static int xdigit2val(unsigned char c)
-{
-	int val;
-	if(isdigit(c))
-		val = c - '0';
-	else if(isupper(c))
-		val = c - 'A' + 10;
-	else
-		val = c - 'a' + 10;
-	return val;
-}
-static int
-eal_parse_coremask(const char *coremask)
-{
-	struct rte_config *cfg = rte_eal_get_configuration();
-	int i, j, idx = 0 ;
-	unsigned count = 0;
-	char c;
-	int val;
-
-	if (coremask == NULL)
-		return -1;
-	/* Remove all blank characters ahead and after .
-	 * Remove 0x/0X if exists.
-	 */
-	while (isblank(*coremask))
-		coremask++;
-	if (coremask[0] == '0' && ((coremask[1] == 'x')
-		||  (coremask[1] == 'X')) )
-		coremask += 2;
-	i = strnlen(coremask, PATH_MAX);
-	while ((i > 0) && isblank(coremask[i - 1]))
-		i--;
-	if (i == 0)
-		return -1;
-
-	for (i = i - 1; i >= 0 && idx < RTE_MAX_LCORE; i--) {
-		c = coremask[i];
-		if (isxdigit(c) == 0) {
-			/* invalid characters */
-			return (-1);
-		}
-		val = xdigit2val(c);
-		for(j = 0; j < BITS_PER_HEX && idx < RTE_MAX_LCORE; j++, idx++) {
-			if((1 << j) & val) {
-				if (!lcore_config[idx].detected) {
-					RTE_LOG(ERR, EAL, "lcore %u "
-					        "unavailable\n", idx);
-					return -1;
-				}
-				cfg->lcore_role[idx] = ROLE_RTE;
-				if(count == 0)
-					cfg->master_lcore = idx;
-				count++;
-			} else  {
-				cfg->lcore_role[idx] = ROLE_OFF;
-			}
-		}
-	}
-	for(; i >= 0; i--)
-		if(coremask[i] != '0')
-			return -1;
-	for(; idx < RTE_MAX_LCORE; idx++)
-		cfg->lcore_role[idx] = ROLE_OFF;
-	if(count == 0)
-		return -1;
-	/* Update the count of enabled logical cores of the EAL configuration */
-	cfg->lcore_count = count;
-	return 0;
-}
-
-static int
-eal_parse_syslog(const char *facility)
-{
-	int i;
-	static struct {
-		const char *name;
-		int value;
-	} map[] = {
-		{ "auth", LOG_AUTH },
-		{ "cron", LOG_CRON },
-		{ "daemon", LOG_DAEMON },
-		{ "ftp", LOG_FTP },
-		{ "kern", LOG_KERN },
-		{ "lpr", LOG_LPR },
-		{ "mail", LOG_MAIL },
-		{ "news", LOG_NEWS },
-		{ "syslog", LOG_SYSLOG },
-		{ "user", LOG_USER },
-		{ "uucp", LOG_UUCP },
-		{ "local0", LOG_LOCAL0 },
-		{ "local1", LOG_LOCAL1 },
-		{ "local2", LOG_LOCAL2 },
-		{ "local3", LOG_LOCAL3 },
-		{ "local4", LOG_LOCAL4 },
-		{ "local5", LOG_LOCAL5 },
-		{ "local6", LOG_LOCAL6 },
-		{ "local7", LOG_LOCAL7 },
-		{ NULL, 0 }
-	};
-
-	for (i = 0; map[i].name; i++) {
-		if (!strcmp(facility, map[i].name)) {
-			internal_config.syslog_facility = map[i].value;
-			return 0;
-		}
-	}
-	return -1;
-}
-
-static int
-eal_parse_log_level(const char *level, uint32_t *log_level)
-{
-	char *end;
-	unsigned long tmp;
-
-	errno = 0;
-	tmp = strtoul(level, &end, 0);
-
-	/* check for errors */
-	if ((errno != 0) || (level[0] == '\0') ||
-	    end == NULL || (*end != '\0'))
-		return -1;
-
-	/* log_level is a uint32_t */
-	if (tmp >= UINT32_MAX)
-		return -1;
-
-	*log_level = tmp;
-	return 0;
-}
-
 static int
 eal_parse_socket_mem(char *socket_mem)
 {
@@ -686,19 +503,6 @@ eal_get_hugepage_mem_size(void)
 	return (size < SIZE_MAX) ? (size_t)(size) : SIZE_MAX;
 }
 
-static enum rte_proc_type_t
-eal_parse_proc_type(const char *arg)
-{
-	if (strncasecmp(arg, "primary", sizeof("primary")) == 0)
-		return RTE_PROC_PRIMARY;
-	if (strncasecmp(arg, "secondary", sizeof("secondary")) == 0)
-		return RTE_PROC_SECONDARY;
-	if (strncasecmp(arg, "auto", sizeof("auto")) == 0)
-		return RTE_PROC_AUTO;
-
-	return RTE_PROC_INVALID;
-}
-
 /* Parse the argument given in the command line of the application */
 static int
 eal_parse_args(int argc, char **argv)
@@ -708,27 +512,6 @@ eal_parse_args(int argc, char **argv)
 	int option_index;
 	int coremask_ok = 0;
 	char *prgname = argv[0];
-	static struct option lgopts[] = {
-		{OPT_NO_HUGE, 0, 0, 0},
-		{OPT_NO_PCI, 0, 0, 0},
-		{OPT_NO_HPET, 0, 0, 0},
-		{OPT_VMWARE_TSC_MAP, 0, 0, 0},
-		{OPT_HUGE_DIR, 1, 0, 0},
-		{OPT_NO_SHCONF, 0, 0, 0},
-		{OPT_PROC_TYPE, 1, 0, 0},
-		{OPT_FILE_PREFIX, 1, 0, 0},
-		{OPT_SOCKET_MEM, 1, 0, 0},
-		{OPT_PCI_WHITELIST, 1, 0, 'w'},
-		{OPT_PCI_BLACKLIST, 1, 0, 'b'},
-		{OPT_VDEV, 1, 0, 0},
-		{OPT_SYSLOG, 1, NULL, 0},
-		{OPT_LOG_LEVEL, 1, NULL, 0},
-		{OPT_VFIO_INTR, 1, NULL, 0},
-		{OPT_BASE_VIRTADDR, 1, 0, 0},
-		{OPT_XEN_DOM0, 0, 0, 0},
-		{OPT_CREATE_UIO_DEV, 1, NULL, 0},
-		{0, 0, 0, 0}
-	};
 	struct shared_driver *solib;
 
 	argvopt = argv;
@@ -761,35 +544,32 @@ eal_parse_args(int argc, char **argv)
 	internal_config.vmware_tsc_map = 0;
 	internal_config.base_virtaddr = 0;
 
-	while ((opt = getopt_long(argc, argvopt, "b:w:c:d:m:n:r:v",
-				  lgopts, &option_index)) != EOF) {
+	while ((opt = getopt_long(argc, argvopt, eal_short_options,
+				  eal_long_options, &option_index)) != EOF) {
+
+		int ret;
+
+		/* getopt is not happy, stop right now */
+		if (opt == '?')
+			return -1;
+
+		ret = eal_parse_common_option(opt, optarg, option_index,
+					      &internal_config);
+		/* common parser is not happy */
+		if (ret < 0) {
+			eal_usage(prgname);
+			return -1;
+		}
+		/* common parser handled this option */
+		if (ret == 0) {
+			/* special case, note that the common parser accepted
+			 * the coremask option */
+			if (opt == 'c')
+				coremask_ok = 1;
+			continue;
+		}
 
 		switch (opt) {
-		/* blacklist */
-		case 'b':
-			if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
-					optarg) < 0) {
-				eal_usage(prgname);
-				return (-1);
-			}
-			break;
-		/* whitelist */
-		case 'w':
-			if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
-					optarg) < 0) {
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-		/* coremask */
-		case 'c':
-			if (eal_parse_coremask(optarg) < 0) {
-				RTE_LOG(ERR, EAL, "invalid coremask\n");
-				eal_usage(prgname);
-				return -1;
-			}
-			coremask_ok = 1;
-			break;
 		/* force loading of external driver */
 		case 'd':
 			solib = malloc(sizeof(*solib));
@@ -802,44 +582,10 @@ eal_parse_args(int argc, char **argv)
 			solib->name[PATH_MAX-1] = 0;
 			TAILQ_INSERT_TAIL(&solib_list, solib, next);
 			break;
-		/* size of memory */
-		case 'm':
-			internal_config.memory = atoi(optarg);
-			internal_config.memory *= 1024ULL;
-			internal_config.memory *= 1024ULL;
-			break;
-		/* force number of channels */
-		case 'n':
-			internal_config.force_nchannel = atoi(optarg);
-			if (internal_config.force_nchannel == 0 ||
-			    internal_config.force_nchannel > 4) {
-				RTE_LOG(ERR, EAL, "invalid channel number\n");
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-		/* force number of ranks */
-		case 'r':
-			internal_config.force_nrank = atoi(optarg);
-			if (internal_config.force_nrank == 0 ||
-			    internal_config.force_nrank > 16) {
-				RTE_LOG(ERR, EAL, "invalid rank number\n");
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-		case 'v':
-			/* since message is explicitly requested by user, we
-			 * write message at highest log level so it can always be seen
-			 * even if info or warning messages are disabled */
-			RTE_LOG(CRIT, EAL, "RTE Version: '%s'\n", rte_version());
-			break;
 
 		/* long options */
 		case 0:
-			if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
-				internal_config.no_hugetlbfs = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_XEN_DOM0)) {
+			if (!strcmp(eal_long_options[option_index].name, OPT_XEN_DOM0)) {
 		#ifdef RTE_LIBRTE_XEN_DOM0
 				internal_config.xen_dom0_support = 1;
 		#else
@@ -848,78 +594,50 @@ eal_parse_args(int argc, char **argv)
 					" RTE_LIBRTE_XEN_DOM0=y\n");
 				return -1;
 		#endif
-			} else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
-				internal_config.no_pci = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
-				internal_config.no_hpet = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
-				internal_config.vmware_tsc_map = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
-				internal_config.no_shconf = 1;
-			} else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
+			} else if (!strcmp(eal_long_options[option_index].name, OPT_HUGE_DIR)) {
 				internal_config.hugepage_dir = optarg;
-			} else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
-				internal_config.process_type = eal_parse_proc_type(optarg);
-			} else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
+			} else if (!strcmp(eal_long_options[option_index].name, OPT_FILE_PREFIX)) {
 				internal_config.hugefile_prefix = optarg;
-			} else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
+			} else if (!strcmp(eal_long_options[option_index].name, OPT_SOCKET_MEM)) {
 				if (eal_parse_socket_mem(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_SOCKET_MEM "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			} else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
-				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
-						optarg) < 0) {
-					eal_usage(prgname);
-					return -1;
-				}
-			} else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
-				if (eal_parse_syslog(optarg) < 0) {
-					RTE_LOG(ERR, EAL, "invalid parameters for --"
-							OPT_SYSLOG "\n");
-					eal_usage(prgname);
-					return -1;
-				}
-			} else if (!strcmp(lgopts[option_index].name,
-					 OPT_LOG_LEVEL)) {
-				uint32_t log;
-
-				if (eal_parse_log_level(optarg, &log) < 0) {
-					RTE_LOG(ERR, EAL,
-						"invalid parameters for --"
-						OPT_LOG_LEVEL "\n");
-					eal_usage(prgname);
-					return -1;
-				}
-				internal_config.log_level = log;
-			} else if (!strcmp(lgopts[option_index].name, OPT_BASE_VIRTADDR)) {
+			} else if (!strcmp(eal_long_options[option_index].name, OPT_BASE_VIRTADDR)) {
 				if (eal_parse_base_virtaddr(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameter for --"
 							OPT_BASE_VIRTADDR "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			} else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
+			} else if (!strcmp(eal_long_options[option_index].name, OPT_VFIO_INTR)) {
 				if (eal_parse_vfio_intr(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_VFIO_INTR "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			} else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
+			} else if (!strcmp(eal_long_options[option_index].name, OPT_CREATE_UIO_DEV)) {
 				internal_config.create_uio_dev = 1;
 			} else {
 				RTE_LOG(ERR, EAL, "Option %s is not supported "
 					"on Linux\n",
-					lgopts[option_index].name);
+					eal_long_options[option_index].name);
 				eal_usage(prgname);
 				return -1;
 			}
 			break;
 
 		default:
+			if (isprint(opt)) {
+				RTE_LOG(ERR, EAL, "Option %c is not supported "
+					"on Linux\n", opt);
+			} else {
+				RTE_LOG(ERR, EAL, "Option %d is not supported "
+					"on Linux\n", opt);
+			}
 			eal_usage(prgname);
 			return -1;
 		}
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 6/7] eal: rework long options parsing
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
                   ` (4 preceding siblings ...)
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 5/7] eal: merge bsd and linux common options parsing David Marchand
@ 2014-09-22  8:38 ` David Marchand
  2014-09-22 12:42   ` Neil Horman
  2014-09-22  8:38 ` [dpdk-dev] [PATCH 7/7] eal: indent files David Marchand
  2014-09-22 12:43 ` [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal Neil Horman
  7 siblings, 1 reply; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:38 UTC (permalink / raw)
  To: dev

Identify all options through the getopt_long return value.
This way, we only need a big switch/case.

Indentation is broken to ease commit review (fixed in next commit).

Suggested-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/bsdapp/eal/eal.c             |   21 +++-----
 lib/librte_eal/common/eal_common_options.c  |   77 ++++++++++++++++-----------
 lib/librte_eal/common/include/eal_options.h |   28 +++++++++-
 lib/librte_eal/linuxapp/eal/eal.c           |   44 ++++++++-------
 4 files changed, 105 insertions(+), 65 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 58f00fd..c4b75a4 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -354,8 +354,7 @@ eal_parse_args(int argc, char **argv)
 		if (opt == '?')
 			return -1;
 
-		ret = eal_parse_common_option(opt, optarg, option_index,
-					      &internal_config);
+		ret = eal_parse_common_option(opt, optarg, &internal_config);
 		/* common parser is not happy */
 		if (ret < 0) {
 			eal_usage(prgname);
@@ -371,21 +370,15 @@ eal_parse_args(int argc, char **argv)
 		}
 
 		switch (opt) {
-		/* long options */
-		case 0:
-			{
-				RTE_LOG(ERR, EAL, "Option %s is not supported "
-					"on FreeBSD\n",
-					eal_long_options[option_index].name);
-				eal_usage(prgname);
-				return -1;
-			}
-			break;
-
 		default:
-			if (isprint(opt)) {
+			if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
 				RTE_LOG(ERR, EAL, "Option %c is not supported "
 					"on FreeBSD\n", opt);
+			} else if (opt >= OPT_LONG_MIN_NUM &&
+				   opt < OPT_LONG_MAX_NUM) {
+				RTE_LOG(ERR, EAL, "Option %s is not supported "
+					"on FreeBSD\n",
+					eal_long_options[option_index].name);
 			} else {
 				RTE_LOG(ERR, EAL, "Option %d is not supported "
 					"on FreeBSD\n", opt);
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index ead4300..4009f02 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -63,24 +63,24 @@ eal_short_options[] =
 
 const struct option
 eal_long_options[] = {
-	{OPT_HUGE_DIR, 1, 0, 0},
-	{OPT_PROC_TYPE, 1, 0, 0},
-	{OPT_NO_SHCONF, 0, 0, 0},
-	{OPT_NO_HPET, 0, 0, 0},
-	{OPT_VMWARE_TSC_MAP, 0, 0, 0},
-	{OPT_NO_PCI, 0, 0, 0},
-	{OPT_NO_HUGE, 0, 0, 0},
-	{OPT_FILE_PREFIX, 1, 0, 0},
-	{OPT_SOCKET_MEM, 1, 0, 0},
-	{OPT_PCI_WHITELIST, 1, 0, 'w'},
-	{OPT_PCI_BLACKLIST, 1, 0, 'b'},
-	{OPT_VDEV, 1, 0, 0},
-	{OPT_SYSLOG, 1, NULL, 0},
-	{OPT_LOG_LEVEL, 1, NULL, 0},
-	{OPT_BASE_VIRTADDR, 1, 0, 0},
-	{OPT_XEN_DOM0, 0, 0, 0},
-	{OPT_CREATE_UIO_DEV, 1, NULL, 0},
-	{OPT_VFIO_INTR, 1, NULL, 0},
+	{OPT_HUGE_DIR, 1, 0, OPT_HUGE_DIR_NUM},
+	{OPT_PROC_TYPE, 1, 0, OPT_PROC_TYPE_NUM},
+	{OPT_NO_SHCONF, 0, 0, OPT_NO_SHCONF_NUM},
+	{OPT_NO_HPET, 0, 0, OPT_NO_HPET_NUM},
+	{OPT_VMWARE_TSC_MAP, 0, 0, OPT_VMWARE_TSC_MAP_NUM},
+	{OPT_NO_PCI, 0, 0, OPT_NO_PCI_NUM},
+	{OPT_NO_HUGE, 0, 0, OPT_NO_HUGE_NUM},
+	{OPT_FILE_PREFIX, 1, 0, OPT_FILE_PREFIX_NUM},
+	{OPT_SOCKET_MEM, 1, 0, OPT_SOCKET_MEM_NUM},
+	{OPT_PCI_WHITELIST, 1, 0, OPT_PCI_WHITELIST_NUM},
+	{OPT_PCI_BLACKLIST, 1, 0, OPT_PCI_BLACKLIST_NUM},
+	{OPT_VDEV, 1, 0, OPT_VDEV_NUM},
+	{OPT_SYSLOG, 1, NULL, OPT_SYSLOG_NUM},
+	{OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM},
+	{OPT_BASE_VIRTADDR, 1, 0, OPT_BASE_VIRTADDR_NUM},
+	{OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},
+	{OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},
+	{OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},
 	{0, 0, 0, 0}
 };
 
@@ -238,7 +238,7 @@ eal_parse_proc_type(const char *arg)
 }
 
 int
-eal_parse_common_option(int opt, const char *optarg, int longindex,
+eal_parse_common_option(int opt, const char *optarg,
 			struct internal_config *conf)
 {
 	switch (opt) {
@@ -296,32 +296,46 @@ eal_parse_common_option(int opt, const char *optarg, int longindex,
 		break;
 
 	/* long options */
-	case 0:
-		if (!strcmp(eal_long_options[longindex].name, OPT_NO_HUGE)) {
+	case OPT_NO_HUGE_NUM:
 			conf->no_hugetlbfs = 1;
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_PCI)) {
+		break;
+
+	case OPT_NO_PCI_NUM:
 			conf->no_pci = 1;
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_HPET)) {
+		break;
+
+	case OPT_NO_HPET_NUM:
 			conf->no_hpet = 1;
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_VMWARE_TSC_MAP)) {
+		break;
+
+	case OPT_VMWARE_TSC_MAP_NUM:
 			conf->vmware_tsc_map = 1;
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_SHCONF)) {
+		break;
+
+	case OPT_NO_SHCONF_NUM:
 			conf->no_shconf = 1;
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_PROC_TYPE)) {
+		break;
+
+	case OPT_PROC_TYPE_NUM:
 			conf->process_type = eal_parse_proc_type(optarg);
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_VDEV)) {
+		break;
+
+	case OPT_VDEV_NUM:
 			if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
 					optarg) < 0) {
 				return -1;
 			}
-		} else if (!strcmp(eal_long_options[longindex].name, OPT_SYSLOG)) {
+		break;
+
+	case OPT_SYSLOG_NUM:
 			if (eal_parse_syslog(optarg, conf) < 0) {
 				RTE_LOG(ERR, EAL, "invalid parameters for --"
 						OPT_SYSLOG "\n");
 				return -1;
 			}
-		} else if (!strcmp(eal_long_options[longindex].name,
-				 OPT_LOG_LEVEL)) {
+		break;
+
+	case OPT_LOG_LEVEL_NUM: {
 			uint32_t log;
 
 			if (eal_parse_log_level(optarg, &log) < 0) {
@@ -331,9 +345,8 @@ eal_parse_common_option(int opt, const char *optarg, int longindex,
 				return -1;
 			}
 			conf->log_level = log;
-		}
-
 		break;
+		}
 
 	/* don't know what to do, leave this to caller */
 	default:
diff --git a/lib/librte_eal/common/include/eal_options.h b/lib/librte_eal/common/include/eal_options.h
index 4e6b90d..22819ec 100644
--- a/lib/librte_eal/common/include/eal_options.h
+++ b/lib/librte_eal/common/include/eal_options.h
@@ -30,29 +30,55 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+
+enum {
+	/* long options mapped to a short option */
 #define OPT_PCI_WHITELIST "pci-whitelist"
+	OPT_PCI_WHITELIST_NUM = 'w',
 #define OPT_PCI_BLACKLIST "pci-blacklist"
+	OPT_PCI_BLACKLIST_NUM = 'b',
 
+	/* first long only option value must be >= 256, so that we won't
+	 * conflict with short options */
+	OPT_LONG_MIN_NUM = 256,
 #define OPT_HUGE_DIR    "huge-dir"
+	OPT_HUGE_DIR_NUM = OPT_LONG_MIN_NUM,
 #define OPT_PROC_TYPE   "proc-type"
+	OPT_PROC_TYPE_NUM,
 #define OPT_NO_SHCONF   "no-shconf"
+	OPT_NO_SHCONF_NUM,
 #define OPT_NO_HPET     "no-hpet"
+	OPT_NO_HPET_NUM,
 #define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
+	OPT_VMWARE_TSC_MAP_NUM,
 #define OPT_NO_PCI      "no-pci"
+	OPT_NO_PCI_NUM,
 #define OPT_NO_HUGE     "no-huge"
+	OPT_NO_HUGE_NUM,
 #define OPT_FILE_PREFIX "file-prefix"
+	OPT_FILE_PREFIX_NUM,
 #define OPT_SOCKET_MEM  "socket-mem"
+	OPT_SOCKET_MEM_NUM,
 #define OPT_VDEV        "vdev"
+	OPT_VDEV_NUM,
 #define OPT_SYSLOG      "syslog"
+	OPT_SYSLOG_NUM,
 #define OPT_LOG_LEVEL   "log-level"
+	OPT_LOG_LEVEL_NUM,
 #define OPT_BASE_VIRTADDR   "base-virtaddr"
+	OPT_BASE_VIRTADDR_NUM,
 #define OPT_XEN_DOM0    "xen-dom0"
+	OPT_XEN_DOM0_NUM,
 #define OPT_CREATE_UIO_DEV "create-uio-dev"
+	OPT_CREATE_UIO_DEV_NUM,
 #define OPT_VFIO_INTR    "vfio-intr"
+	OPT_VFIO_INTR_NUM,
+	OPT_LONG_MAX_NUM
+};
 
 extern const char eal_short_options[];
 extern const struct option eal_long_options[];
 
-int eal_parse_common_option(int opt, const char *argv, int longindex,
+int eal_parse_common_option(int opt, const char *argv,
 			    struct internal_config *conf);
 void eal_common_usage(void);
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index d82debf..1d468dd 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -553,8 +553,7 @@ eal_parse_args(int argc, char **argv)
 		if (opt == '?')
 			return -1;
 
-		ret = eal_parse_common_option(opt, optarg, option_index,
-					      &internal_config);
+		ret = eal_parse_common_option(opt, optarg, &internal_config);
 		/* common parser is not happy */
 		if (ret < 0) {
 			eal_usage(prgname);
@@ -584,8 +583,7 @@ eal_parse_args(int argc, char **argv)
 			break;
 
 		/* long options */
-		case 0:
-			if (!strcmp(eal_long_options[option_index].name, OPT_XEN_DOM0)) {
+		case OPT_XEN_DOM0_NUM:
 		#ifdef RTE_LIBRTE_XEN_DOM0
 				internal_config.xen_dom0_support = 1;
 		#else
@@ -594,46 +592,56 @@ eal_parse_args(int argc, char **argv)
 					" RTE_LIBRTE_XEN_DOM0=y\n");
 				return -1;
 		#endif
-			} else if (!strcmp(eal_long_options[option_index].name, OPT_HUGE_DIR)) {
+			break;
+
+		case OPT_HUGE_DIR_NUM:
 				internal_config.hugepage_dir = optarg;
-			} else if (!strcmp(eal_long_options[option_index].name, OPT_FILE_PREFIX)) {
+			break;
+
+		case OPT_FILE_PREFIX_NUM:
 				internal_config.hugefile_prefix = optarg;
-			} else if (!strcmp(eal_long_options[option_index].name, OPT_SOCKET_MEM)) {
+			break;
+
+		case OPT_SOCKET_MEM_NUM:
 				if (eal_parse_socket_mem(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_SOCKET_MEM "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			} else if (!strcmp(eal_long_options[option_index].name, OPT_BASE_VIRTADDR)) {
+			break;
+
+		case OPT_BASE_VIRTADDR_NUM:
 				if (eal_parse_base_virtaddr(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameter for --"
 							OPT_BASE_VIRTADDR "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			} else if (!strcmp(eal_long_options[option_index].name, OPT_VFIO_INTR)) {
+			break;
+
+		case OPT_VFIO_INTR_NUM:
 				if (eal_parse_vfio_intr(optarg) < 0) {
 					RTE_LOG(ERR, EAL, "invalid parameters for --"
 							OPT_VFIO_INTR "\n");
 					eal_usage(prgname);
 					return -1;
 				}
-			} else if (!strcmp(eal_long_options[option_index].name, OPT_CREATE_UIO_DEV)) {
+			break;
+
+		case OPT_CREATE_UIO_DEV_NUM:
 				internal_config.create_uio_dev = 1;
-			} else {
-				RTE_LOG(ERR, EAL, "Option %s is not supported "
-					"on Linux\n",
-					eal_long_options[option_index].name);
-				eal_usage(prgname);
-				return -1;
-			}
 			break;
 
 		default:
-			if (isprint(opt)) {
+			if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
 				RTE_LOG(ERR, EAL, "Option %c is not supported "
 					"on Linux\n", opt);
+			} else if (opt >= OPT_LONG_MIN_NUM &&
+				   opt < OPT_LONG_MAX_NUM) {
+				RTE_LOG(ERR, EAL, "Option %s is not supported "
+					"on Linux\n",
+					eal_long_options[option_index].name);
 			} else {
 				RTE_LOG(ERR, EAL, "Option %d is not supported "
 					"on Linux\n", opt);
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 7/7] eal: indent files
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
                   ` (5 preceding siblings ...)
  2014-09-22  8:38 ` [dpdk-dev] [PATCH 6/7] eal: rework long " David Marchand
@ 2014-09-22  8:38 ` David Marchand
  2014-09-22 12:43 ` [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal Neil Horman
  7 siblings, 0 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22  8:38 UTC (permalink / raw)
  To: dev

Indent files modified in previous commit.

Signed-off-by: David Marchand <david.marchand@6wind.com>
---
 lib/librte_eal/common/eal_common_options.c |   48 +++++++++++------------
 lib/librte_eal/linuxapp/eal/eal.c          |   58 ++++++++++++++--------------
 2 files changed, 53 insertions(+), 53 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 4009f02..7a5d55e 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -297,56 +297,56 @@ eal_parse_common_option(int opt, const char *optarg,
 
 	/* long options */
 	case OPT_NO_HUGE_NUM:
-			conf->no_hugetlbfs = 1;
+		conf->no_hugetlbfs = 1;
 		break;
 
 	case OPT_NO_PCI_NUM:
-			conf->no_pci = 1;
+		conf->no_pci = 1;
 		break;
 
 	case OPT_NO_HPET_NUM:
-			conf->no_hpet = 1;
+		conf->no_hpet = 1;
 		break;
 
 	case OPT_VMWARE_TSC_MAP_NUM:
-			conf->vmware_tsc_map = 1;
+		conf->vmware_tsc_map = 1;
 		break;
 
 	case OPT_NO_SHCONF_NUM:
-			conf->no_shconf = 1;
+		conf->no_shconf = 1;
 		break;
 
 	case OPT_PROC_TYPE_NUM:
-			conf->process_type = eal_parse_proc_type(optarg);
+		conf->process_type = eal_parse_proc_type(optarg);
 		break;
 
 	case OPT_VDEV_NUM:
-			if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
-					optarg) < 0) {
-				return -1;
-			}
+		if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
+				optarg) < 0) {
+			return -1;
+		}
 		break;
 
 	case OPT_SYSLOG_NUM:
-			if (eal_parse_syslog(optarg, conf) < 0) {
-				RTE_LOG(ERR, EAL, "invalid parameters for --"
-						OPT_SYSLOG "\n");
-				return -1;
-			}
+		if (eal_parse_syslog(optarg, conf) < 0) {
+			RTE_LOG(ERR, EAL, "invalid parameters for --"
+					OPT_SYSLOG "\n");
+			return -1;
+		}
 		break;
 
 	case OPT_LOG_LEVEL_NUM: {
-			uint32_t log;
+		uint32_t log;
 
-			if (eal_parse_log_level(optarg, &log) < 0) {
-				RTE_LOG(ERR, EAL,
-					"invalid parameters for --"
-					OPT_LOG_LEVEL "\n");
-				return -1;
-			}
-			conf->log_level = log;
-		break;
+		if (eal_parse_log_level(optarg, &log) < 0) {
+			RTE_LOG(ERR, EAL,
+				"invalid parameters for --"
+				OPT_LOG_LEVEL "\n");
+			return -1;
 		}
+		conf->log_level = log;
+		break;
+	}
 
 	/* don't know what to do, leave this to caller */
 	default:
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 1d468dd..05804dc 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -584,53 +584,53 @@ eal_parse_args(int argc, char **argv)
 
 		/* long options */
 		case OPT_XEN_DOM0_NUM:
-		#ifdef RTE_LIBRTE_XEN_DOM0
-				internal_config.xen_dom0_support = 1;
-		#else
-				RTE_LOG(ERR, EAL, "Can't support DPDK app "
-					"running on Dom0, please configure"
-					" RTE_LIBRTE_XEN_DOM0=y\n");
-				return -1;
-		#endif
+#ifdef RTE_LIBRTE_XEN_DOM0
+			internal_config.xen_dom0_support = 1;
+#else
+			RTE_LOG(ERR, EAL, "Can't support DPDK app "
+				"running on Dom0, please configure"
+				" RTE_LIBRTE_XEN_DOM0=y\n");
+			return -1;
+#endif
 			break;
 
 		case OPT_HUGE_DIR_NUM:
-				internal_config.hugepage_dir = optarg;
+			internal_config.hugepage_dir = optarg;
 			break;
 
 		case OPT_FILE_PREFIX_NUM:
-				internal_config.hugefile_prefix = optarg;
+			internal_config.hugefile_prefix = optarg;
 			break;
 
 		case OPT_SOCKET_MEM_NUM:
-				if (eal_parse_socket_mem(optarg) < 0) {
-					RTE_LOG(ERR, EAL, "invalid parameters for --"
-							OPT_SOCKET_MEM "\n");
-					eal_usage(prgname);
-					return -1;
-				}
+			if (eal_parse_socket_mem(optarg) < 0) {
+				RTE_LOG(ERR, EAL, "invalid parameters for --"
+						OPT_SOCKET_MEM "\n");
+				eal_usage(prgname);
+				return -1;
+			}
 			break;
 
 		case OPT_BASE_VIRTADDR_NUM:
-				if (eal_parse_base_virtaddr(optarg) < 0) {
-					RTE_LOG(ERR, EAL, "invalid parameter for --"
-							OPT_BASE_VIRTADDR "\n");
-					eal_usage(prgname);
-					return -1;
-				}
+			if (eal_parse_base_virtaddr(optarg) < 0) {
+				RTE_LOG(ERR, EAL, "invalid parameter for --"
+						OPT_BASE_VIRTADDR "\n");
+				eal_usage(prgname);
+				return -1;
+			}
 			break;
 
 		case OPT_VFIO_INTR_NUM:
-				if (eal_parse_vfio_intr(optarg) < 0) {
-					RTE_LOG(ERR, EAL, "invalid parameters for --"
-							OPT_VFIO_INTR "\n");
-					eal_usage(prgname);
-					return -1;
-				}
+			if (eal_parse_vfio_intr(optarg) < 0) {
+				RTE_LOG(ERR, EAL, "invalid parameters for --"
+						OPT_VFIO_INTR "\n");
+				eal_usage(prgname);
+				return -1;
+			}
 			break;
 
 		case OPT_CREATE_UIO_DEV_NUM:
-				internal_config.create_uio_dev = 1;
+			internal_config.create_uio_dev = 1;
 			break;
 
 		default:
-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option
  2014-09-22  8:37 ` [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option David Marchand
@ 2014-09-22 12:22   ` Neil Horman
  2014-09-22 13:49     ` David Marchand
  0 siblings, 1 reply; 13+ messages in thread
From: Neil Horman @ 2014-09-22 12:22 UTC (permalink / raw)
  To: David Marchand; +Cc: dev

On Mon, Sep 22, 2014 at 10:37:55AM +0200, David Marchand wrote:
> Following commit cac6d08c8bde2fdb57806c49038187cdb54219a8 and
> 4bf3fe634a4d9dfce90c4167f3a47d0e2ddf1e64, this option is not available anymore.
> 
> Signed-off-by: David Marchand <david.marchand@6wind.com>
> ---
>  lib/librte_eal/bsdapp/eal/eal.c   |    7 -------
>  lib/librte_eal/linuxapp/eal/eal.c |    7 -------
>  2 files changed, 14 deletions(-)
> 
> diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
> index 2f84742..ffdc441 100644
> --- a/lib/librte_eal/bsdapp/eal/eal.c
> +++ b/lib/librte_eal/bsdapp/eal/eal.c
> @@ -89,7 +89,6 @@
>  #define OPT_NO_HUGE     "no-huge"
>  #define OPT_FILE_PREFIX "file-prefix"
>  #define OPT_SOCKET_MEM  "socket-mem"
> -#define OPT_USE_DEVICE "use-device"
>  #define OPT_PCI_WHITELIST "pci-whitelist"
>  #define OPT_PCI_BLACKLIST "pci-blacklist"
>  #define OPT_VDEV        "vdev"
> @@ -645,12 +644,6 @@ eal_parse_args(int argc, char **argv)
>  						"FreeBSD\n");
>  				return -1;
>  			}
> -			else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
> -				printf("The --use-device option is deprecated, please use\n"
> -					"--whitelist or --vdev instead.\n");
> -				eal_usage(prgname);
> -				return -1;
> -			}
>  			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
>  				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
>  						optarg) < 0) {
> diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
> index 38cace6..633e3b8 100644
> --- a/lib/librte_eal/linuxapp/eal/eal.c
> +++ b/lib/librte_eal/linuxapp/eal/eal.c
> @@ -92,7 +92,6 @@
>  #define OPT_NO_HUGE     "no-huge"
>  #define OPT_FILE_PREFIX "file-prefix"
>  #define OPT_SOCKET_MEM  "socket-mem"
> -#define OPT_USE_DEVICE  "use-device"
>  #define OPT_PCI_WHITELIST "pci-whitelist"
>  #define OPT_PCI_BLACKLIST "pci-blacklist"
>  #define OPT_VDEV        "vdev"
> @@ -880,12 +879,6 @@ eal_parse_args(int argc, char **argv)
>  					return -1;
>  				}
>  			}
> -			else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
> -				printf("The --use-device option is deprecated, please use\n"
> -					"--whitelist or --vdev instead.\n");
> -				eal_usage(prgname);
> -				return -1;
> -			}
>  			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
>  				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
>  						optarg) < 0) {
> -- 
> 1.7.10.4
> 
> 

just a note here - This usage is great reflection of deprecation policy, we
deprecated this back in the 1.6 time frame, left it around for the 1.7 release,
and remove it for the 1.8 release.  I'd love to add some deprecation
functionality to the rte_compat stuff in my patch series on the list so that we
can better announe the deprecation of features/flags/API's in a more general
fashion.

Neil

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 6/7] eal: rework long options parsing
  2014-09-22  8:38 ` [dpdk-dev] [PATCH 6/7] eal: rework long " David Marchand
@ 2014-09-22 12:42   ` Neil Horman
  0 siblings, 0 replies; 13+ messages in thread
From: Neil Horman @ 2014-09-22 12:42 UTC (permalink / raw)
  To: David Marchand; +Cc: dev

On Mon, Sep 22, 2014 at 10:38:00AM +0200, David Marchand wrote:
> Identify all options through the getopt_long return value.
> This way, we only need a big switch/case.
> 
> Indentation is broken to ease commit review (fixed in next commit).
> 
> Suggested-by: Neil Horman <nhorman@tuxdriver.com>
> Signed-off-by: David Marchand <david.marchand@6wind.com>
> ---
>  lib/librte_eal/bsdapp/eal/eal.c             |   21 +++-----
>  lib/librte_eal/common/eal_common_options.c  |   77 ++++++++++++++++-----------
>  lib/librte_eal/common/include/eal_options.h |   28 +++++++++-
>  lib/librte_eal/linuxapp/eal/eal.c           |   44 ++++++++-------
>  4 files changed, 105 insertions(+), 65 deletions(-)
> 
> diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
> index 58f00fd..c4b75a4 100644
> --- a/lib/librte_eal/bsdapp/eal/eal.c
> +++ b/lib/librte_eal/bsdapp/eal/eal.c
> @@ -354,8 +354,7 @@ eal_parse_args(int argc, char **argv)
>  		if (opt == '?')
>  			return -1;
>  
> -		ret = eal_parse_common_option(opt, optarg, option_index,
> -					      &internal_config);
> +		ret = eal_parse_common_option(opt, optarg, &internal_config);
>  		/* common parser is not happy */
>  		if (ret < 0) {
>  			eal_usage(prgname);
> @@ -371,21 +370,15 @@ eal_parse_args(int argc, char **argv)
>  		}
>  
>  		switch (opt) {
> -		/* long options */
> -		case 0:
> -			{
> -				RTE_LOG(ERR, EAL, "Option %s is not supported "
> -					"on FreeBSD\n",
> -					eal_long_options[option_index].name);
> -				eal_usage(prgname);
> -				return -1;
> -			}
> -			break;
> -
>  		default:
> -			if (isprint(opt)) {
> +			if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
>  				RTE_LOG(ERR, EAL, "Option %c is not supported "
>  					"on FreeBSD\n", opt);
> +			} else if (opt >= OPT_LONG_MIN_NUM &&
> +				   opt < OPT_LONG_MAX_NUM) {
> +				RTE_LOG(ERR, EAL, "Option %s is not supported "
> +					"on FreeBSD\n",
> +					eal_long_options[option_index].name);
>  			} else {
>  				RTE_LOG(ERR, EAL, "Option %d is not supported "
>  					"on FreeBSD\n", opt);
> diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
> index ead4300..4009f02 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -63,24 +63,24 @@ eal_short_options[] =
>  
>  const struct option
>  eal_long_options[] = {
> -	{OPT_HUGE_DIR, 1, 0, 0},
> -	{OPT_PROC_TYPE, 1, 0, 0},
> -	{OPT_NO_SHCONF, 0, 0, 0},
> -	{OPT_NO_HPET, 0, 0, 0},
> -	{OPT_VMWARE_TSC_MAP, 0, 0, 0},
> -	{OPT_NO_PCI, 0, 0, 0},
> -	{OPT_NO_HUGE, 0, 0, 0},
> -	{OPT_FILE_PREFIX, 1, 0, 0},
> -	{OPT_SOCKET_MEM, 1, 0, 0},
> -	{OPT_PCI_WHITELIST, 1, 0, 'w'},
> -	{OPT_PCI_BLACKLIST, 1, 0, 'b'},
> -	{OPT_VDEV, 1, 0, 0},
> -	{OPT_SYSLOG, 1, NULL, 0},
> -	{OPT_LOG_LEVEL, 1, NULL, 0},
> -	{OPT_BASE_VIRTADDR, 1, 0, 0},
> -	{OPT_XEN_DOM0, 0, 0, 0},
> -	{OPT_CREATE_UIO_DEV, 1, NULL, 0},
> -	{OPT_VFIO_INTR, 1, NULL, 0},
> +	{OPT_HUGE_DIR, 1, 0, OPT_HUGE_DIR_NUM},
> +	{OPT_PROC_TYPE, 1, 0, OPT_PROC_TYPE_NUM},
> +	{OPT_NO_SHCONF, 0, 0, OPT_NO_SHCONF_NUM},
> +	{OPT_NO_HPET, 0, 0, OPT_NO_HPET_NUM},
> +	{OPT_VMWARE_TSC_MAP, 0, 0, OPT_VMWARE_TSC_MAP_NUM},
> +	{OPT_NO_PCI, 0, 0, OPT_NO_PCI_NUM},
> +	{OPT_NO_HUGE, 0, 0, OPT_NO_HUGE_NUM},
> +	{OPT_FILE_PREFIX, 1, 0, OPT_FILE_PREFIX_NUM},
> +	{OPT_SOCKET_MEM, 1, 0, OPT_SOCKET_MEM_NUM},
> +	{OPT_PCI_WHITELIST, 1, 0, OPT_PCI_WHITELIST_NUM},
> +	{OPT_PCI_BLACKLIST, 1, 0, OPT_PCI_BLACKLIST_NUM},
> +	{OPT_VDEV, 1, 0, OPT_VDEV_NUM},
> +	{OPT_SYSLOG, 1, NULL, OPT_SYSLOG_NUM},
> +	{OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM},
> +	{OPT_BASE_VIRTADDR, 1, 0, OPT_BASE_VIRTADDR_NUM},
> +	{OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},
> +	{OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},
> +	{OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},
>  	{0, 0, 0, 0}
>  };
>  
> @@ -238,7 +238,7 @@ eal_parse_proc_type(const char *arg)
>  }
>  
>  int
> -eal_parse_common_option(int opt, const char *optarg, int longindex,
> +eal_parse_common_option(int opt, const char *optarg,
>  			struct internal_config *conf)
>  {
>  	switch (opt) {
> @@ -296,32 +296,46 @@ eal_parse_common_option(int opt, const char *optarg, int longindex,
>  		break;
>  
>  	/* long options */
> -	case 0:
> -		if (!strcmp(eal_long_options[longindex].name, OPT_NO_HUGE)) {
> +	case OPT_NO_HUGE_NUM:
>  			conf->no_hugetlbfs = 1;
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_PCI)) {
> +		break;
> +
> +	case OPT_NO_PCI_NUM:
>  			conf->no_pci = 1;
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_HPET)) {
> +		break;
> +
> +	case OPT_NO_HPET_NUM:
>  			conf->no_hpet = 1;
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_VMWARE_TSC_MAP)) {
> +		break;
> +
> +	case OPT_VMWARE_TSC_MAP_NUM:
>  			conf->vmware_tsc_map = 1;
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_NO_SHCONF)) {
> +		break;
> +
> +	case OPT_NO_SHCONF_NUM:
>  			conf->no_shconf = 1;
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_PROC_TYPE)) {
> +		break;
> +
> +	case OPT_PROC_TYPE_NUM:
>  			conf->process_type = eal_parse_proc_type(optarg);
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_VDEV)) {
> +		break;
> +
> +	case OPT_VDEV_NUM:
>  			if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
>  					optarg) < 0) {
>  				return -1;
>  			}
> -		} else if (!strcmp(eal_long_options[longindex].name, OPT_SYSLOG)) {
> +		break;
> +
> +	case OPT_SYSLOG_NUM:
>  			if (eal_parse_syslog(optarg, conf) < 0) {
>  				RTE_LOG(ERR, EAL, "invalid parameters for --"
>  						OPT_SYSLOG "\n");
>  				return -1;
>  			}
> -		} else if (!strcmp(eal_long_options[longindex].name,
> -				 OPT_LOG_LEVEL)) {
> +		break;
> +
> +	case OPT_LOG_LEVEL_NUM: {
>  			uint32_t log;
>  
>  			if (eal_parse_log_level(optarg, &log) < 0) {
> @@ -331,9 +345,8 @@ eal_parse_common_option(int opt, const char *optarg, int longindex,
>  				return -1;
>  			}
>  			conf->log_level = log;
> -		}
> -
>  		break;
> +		}
>  
>  	/* don't know what to do, leave this to caller */
>  	default:
> diff --git a/lib/librte_eal/common/include/eal_options.h b/lib/librte_eal/common/include/eal_options.h
> index 4e6b90d..22819ec 100644
> --- a/lib/librte_eal/common/include/eal_options.h
> +++ b/lib/librte_eal/common/include/eal_options.h
> @@ -30,29 +30,55 @@
>   *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>  
> +
> +enum {
> +	/* long options mapped to a short option */
>  #define OPT_PCI_WHITELIST "pci-whitelist"
> +	OPT_PCI_WHITELIST_NUM = 'w',
>  #define OPT_PCI_BLACKLIST "pci-blacklist"
> +	OPT_PCI_BLACKLIST_NUM = 'b',
>  
> +	/* first long only option value must be >= 256, so that we won't
> +	 * conflict with short options */
> +	OPT_LONG_MIN_NUM = 256,
>  #define OPT_HUGE_DIR    "huge-dir"
> +	OPT_HUGE_DIR_NUM = OPT_LONG_MIN_NUM,
>  #define OPT_PROC_TYPE   "proc-type"
> +	OPT_PROC_TYPE_NUM,
>  #define OPT_NO_SHCONF   "no-shconf"
> +	OPT_NO_SHCONF_NUM,
>  #define OPT_NO_HPET     "no-hpet"
> +	OPT_NO_HPET_NUM,
>  #define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
> +	OPT_VMWARE_TSC_MAP_NUM,
>  #define OPT_NO_PCI      "no-pci"
> +	OPT_NO_PCI_NUM,
>  #define OPT_NO_HUGE     "no-huge"
> +	OPT_NO_HUGE_NUM,
>  #define OPT_FILE_PREFIX "file-prefix"
> +	OPT_FILE_PREFIX_NUM,
>  #define OPT_SOCKET_MEM  "socket-mem"
> +	OPT_SOCKET_MEM_NUM,
>  #define OPT_VDEV        "vdev"
> +	OPT_VDEV_NUM,
>  #define OPT_SYSLOG      "syslog"
> +	OPT_SYSLOG_NUM,
>  #define OPT_LOG_LEVEL   "log-level"
> +	OPT_LOG_LEVEL_NUM,
>  #define OPT_BASE_VIRTADDR   "base-virtaddr"
> +	OPT_BASE_VIRTADDR_NUM,
>  #define OPT_XEN_DOM0    "xen-dom0"
> +	OPT_XEN_DOM0_NUM,
>  #define OPT_CREATE_UIO_DEV "create-uio-dev"
> +	OPT_CREATE_UIO_DEV_NUM,
>  #define OPT_VFIO_INTR    "vfio-intr"
> +	OPT_VFIO_INTR_NUM,
> +	OPT_LONG_MAX_NUM
> +};
>  
>  extern const char eal_short_options[];
>  extern const struct option eal_long_options[];
>  
> -int eal_parse_common_option(int opt, const char *argv, int longindex,
> +int eal_parse_common_option(int opt, const char *argv,
>  			    struct internal_config *conf);
>  void eal_common_usage(void);
> diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
> index d82debf..1d468dd 100644
> --- a/lib/librte_eal/linuxapp/eal/eal.c
> +++ b/lib/librte_eal/linuxapp/eal/eal.c
> @@ -553,8 +553,7 @@ eal_parse_args(int argc, char **argv)
>  		if (opt == '?')
>  			return -1;
>  
> -		ret = eal_parse_common_option(opt, optarg, option_index,
> -					      &internal_config);
> +		ret = eal_parse_common_option(opt, optarg, &internal_config);
>  		/* common parser is not happy */
>  		if (ret < 0) {
>  			eal_usage(prgname);
> @@ -584,8 +583,7 @@ eal_parse_args(int argc, char **argv)
>  			break;
>  
>  		/* long options */
> -		case 0:
> -			if (!strcmp(eal_long_options[option_index].name, OPT_XEN_DOM0)) {
> +		case OPT_XEN_DOM0_NUM:
>  		#ifdef RTE_LIBRTE_XEN_DOM0
>  				internal_config.xen_dom0_support = 1;
>  		#else
> @@ -594,46 +592,56 @@ eal_parse_args(int argc, char **argv)
>  					" RTE_LIBRTE_XEN_DOM0=y\n");
>  				return -1;
>  		#endif
> -			} else if (!strcmp(eal_long_options[option_index].name, OPT_HUGE_DIR)) {
> +			break;
> +
> +		case OPT_HUGE_DIR_NUM:
>  				internal_config.hugepage_dir = optarg;
> -			} else if (!strcmp(eal_long_options[option_index].name, OPT_FILE_PREFIX)) {
> +			break;
> +
> +		case OPT_FILE_PREFIX_NUM:
>  				internal_config.hugefile_prefix = optarg;
> -			} else if (!strcmp(eal_long_options[option_index].name, OPT_SOCKET_MEM)) {
> +			break;
> +
> +		case OPT_SOCKET_MEM_NUM:
>  				if (eal_parse_socket_mem(optarg) < 0) {
>  					RTE_LOG(ERR, EAL, "invalid parameters for --"
>  							OPT_SOCKET_MEM "\n");
>  					eal_usage(prgname);
>  					return -1;
>  				}
> -			} else if (!strcmp(eal_long_options[option_index].name, OPT_BASE_VIRTADDR)) {
> +			break;
> +
> +		case OPT_BASE_VIRTADDR_NUM:
>  				if (eal_parse_base_virtaddr(optarg) < 0) {
>  					RTE_LOG(ERR, EAL, "invalid parameter for --"
>  							OPT_BASE_VIRTADDR "\n");
>  					eal_usage(prgname);
>  					return -1;
>  				}
> -			} else if (!strcmp(eal_long_options[option_index].name, OPT_VFIO_INTR)) {
> +			break;
> +
> +		case OPT_VFIO_INTR_NUM:
>  				if (eal_parse_vfio_intr(optarg) < 0) {
>  					RTE_LOG(ERR, EAL, "invalid parameters for --"
>  							OPT_VFIO_INTR "\n");
>  					eal_usage(prgname);
>  					return -1;
>  				}
> -			} else if (!strcmp(eal_long_options[option_index].name, OPT_CREATE_UIO_DEV)) {
> +			break;
> +
> +		case OPT_CREATE_UIO_DEV_NUM:
>  				internal_config.create_uio_dev = 1;
> -			} else {
> -				RTE_LOG(ERR, EAL, "Option %s is not supported "
> -					"on Linux\n",
> -					eal_long_options[option_index].name);
> -				eal_usage(prgname);
> -				return -1;
> -			}
>  			break;
>  
>  		default:
> -			if (isprint(opt)) {
> +			if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
>  				RTE_LOG(ERR, EAL, "Option %c is not supported "
>  					"on Linux\n", opt);
> +			} else if (opt >= OPT_LONG_MIN_NUM &&
> +				   opt < OPT_LONG_MAX_NUM) {
> +				RTE_LOG(ERR, EAL, "Option %s is not supported "
> +					"on Linux\n",
> +					eal_long_options[option_index].name);
>  			} else {
>  				RTE_LOG(ERR, EAL, "Option %d is not supported "
>  					"on Linux\n", opt);
> -- 
> 1.7.10.4
> 
> 
Thanks!  This looks much nicer
Neil

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal
  2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
                   ` (6 preceding siblings ...)
  2014-09-22  8:38 ` [dpdk-dev] [PATCH 7/7] eal: indent files David Marchand
@ 2014-09-22 12:43 ` Neil Horman
  2014-09-23 15:37   ` Thomas Monjalon
  7 siblings, 1 reply; 13+ messages in thread
From: Neil Horman @ 2014-09-22 12:43 UTC (permalink / raw)
  To: David Marchand; +Cc: dev

On Mon, Sep 22, 2014 at 10:37:54AM +0200, David Marchand wrote:
> Following Neil comments, here is a patchset to rework the eal options parsing.
> I tried to have everything common to linux and bsd in a single file.
> 
> I ran a little make test on linux, it looks fine (at least I have as many fails
> as before my changes).
> 
> There is still work in this part, but I want to stop here.
> If anyone wants to continue ... :-)
> 
> 
> -- 
> David Marchand
> 
> David Marchand (7):
>   eal: remove unused --use-device option
>   eal: factorise unsupported option handling
>   eal: remove duplicate handling of white/black list
>   eal: fix checkpatch issues before moving code
>   eal: merge bsd and linux common options parsing
>   eal: rework long options parsing
>   eal: indent files
> 
>  lib/librte_eal/bsdapp/eal/Makefile          |    1 +
>  lib/librte_eal/bsdapp/eal/eal.c             |  388 +++--------------------
>  lib/librte_eal/common/eal_common_options.c  |  392 +++++++++++++++++++++++
>  lib/librte_eal/common/include/eal_options.h |   84 +++++
>  lib/librte_eal/linuxapp/eal/Makefile        |    1 +
>  lib/librte_eal/linuxapp/eal/eal.c           |  457 +++++----------------------
>  6 files changed, 593 insertions(+), 730 deletions(-)
>  create mode 100644 lib/librte_eal/common/eal_common_options.c
>  create mode 100644 lib/librte_eal/common/include/eal_options.h
> 
> -- 
> 1.7.10.4
> 
> 
Series
ACK

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option
  2014-09-22 12:22   ` Neil Horman
@ 2014-09-22 13:49     ` David Marchand
  0 siblings, 0 replies; 13+ messages in thread
From: David Marchand @ 2014-09-22 13:49 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Mon, Sep 22, 2014 at 2:22 PM, Neil Horman <nhorman@tuxdriver.com> wrote:

>
> just a note here - This usage is great reflection of deprecation policy, we
> deprecated this back in the 1.6 time frame, left it around for the 1.7
> release,
> and remove it for the 1.8 release.  I'd love to add some deprecation
> functionality to the rte_compat stuff in my patch series on the list so
> that we
> can better announe the deprecation of features/flags/API's in a more
> general
> fashion.
>

My note here as well.
--use-device was broken anyway, since the option had disappeared from
getopt() call.
So I suppose the deprecation mechanism was not that necessary since no one
complained.


-- 
David Marchand

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal
  2014-09-22 12:43 ` [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal Neil Horman
@ 2014-09-23 15:37   ` Thomas Monjalon
  0 siblings, 0 replies; 13+ messages in thread
From: Thomas Monjalon @ 2014-09-23 15:37 UTC (permalink / raw)
  To: David Marchand; +Cc: dev

2014-09-22 08:43, Neil Horman:
> On Mon, Sep 22, 2014 at 10:37:54AM +0200, David Marchand wrote:
> > Following Neil comments, here is a patchset to rework the eal options parsing.
> > I tried to have everything common to linux and bsd in a single file.
> > 
> > I ran a little make test on linux, it looks fine (at least I have as many fails
> > as before my changes).
> > 
> > There is still work in this part, but I want to stop here.
> > If anyone wants to continue ... :-)

Yes, many eal parts should be factorized for Linux and BSD.
Cleanups are welcome!

> Series
> ACK

Applied

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2014-09-23 15:31 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-22  8:37 [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal David Marchand
2014-09-22  8:37 ` [dpdk-dev] [PATCH 1/7] eal: remove unused --use-device option David Marchand
2014-09-22 12:22   ` Neil Horman
2014-09-22 13:49     ` David Marchand
2014-09-22  8:37 ` [dpdk-dev] [PATCH 2/7] eal: factorise unsupported option handling David Marchand
2014-09-22  8:37 ` [dpdk-dev] [PATCH 3/7] eal: remove duplicate handling of white/black list David Marchand
2014-09-22  8:37 ` [dpdk-dev] [PATCH 4/7] eal: fix checkpatch issues before moving code David Marchand
2014-09-22  8:37 ` [dpdk-dev] [PATCH 5/7] eal: merge bsd and linux common options parsing David Marchand
2014-09-22  8:38 ` [dpdk-dev] [PATCH 6/7] eal: rework long " David Marchand
2014-09-22 12:42   ` Neil Horman
2014-09-22  8:38 ` [dpdk-dev] [PATCH 7/7] eal: indent files David Marchand
2014-09-22 12:43 ` [dpdk-dev] [PATCH 0/7] cleanup option parsing in bsd/linux eal Neil Horman
2014-09-23 15:37   ` Thomas Monjalon

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git