DPDK patches and discussions
 help / color / mirror / Atom feed
From: Tetsuya Mukawa <mukawa@igel.co.jp>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v9 05/12] eal: Fix uio mapping differences between linuxapp and bsdapp
Date: Wed,  8 Jul 2015 19:34:46 +0900	[thread overview]
Message-ID: <1436351693-2349-6-git-send-email-mukawa@igel.co.jp> (raw)
In-Reply-To: <1436351693-2349-1-git-send-email-mukawa@igel.co.jp>

From: "Tetsuya.Mukawa" <mukawa@igel.co.jp>

This patch fixes below.
- bsdapp
 - Use map_id in pci_uio_map_resource().
 - Fix interface of pci_map_resource().
 - Move path variable of mapped_pci_resource structure to pci_map.
- linuxapp
 - Remove redundant error message of linuxapp.

'pci_uio_map_resource()' is implemented in both linuxapp and bsdapp,
but interface is different. The patch fixes the function of bsdapp
to do same as linuxapp. After applying it, file descriptor should be
opened and closed out of pci_map_resource().

Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
Acked-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 lib/librte_eal/bsdapp/eal/eal_pci.c       | 117 ++++++++++++++++++------------
 lib/librte_eal/linuxapp/eal/eal_pci_uio.c |  27 +++----
 2 files changed, 80 insertions(+), 64 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c
index aeaedec..fba67df 100644
--- a/lib/librte_eal/bsdapp/eal/eal_pci.c
+++ b/lib/librte_eal/bsdapp/eal/eal_pci.c
@@ -86,6 +86,7 @@
 
 struct pci_map {
 	void *addr;
+	char *path;
 	uint64_t offset;
 	uint64_t size;
 	uint64_t phaddr;
@@ -100,7 +101,7 @@ struct mapped_pci_resource {
 
 	struct rte_pci_addr pci_addr;
 	char path[PATH_MAX];
-	size_t nb_maps;
+	int nb_maps;
 	struct pci_map maps[PCI_MAX_RESOURCE];
 };
 
@@ -122,47 +123,30 @@ pci_unbind_kernel_driver(struct rte_pci_device *dev __rte_unused)
 
 /* map a particular resource from a file */
 static void *
-pci_map_resource(void *requested_addr, const char *devname, off_t offset,
-		 size_t size)
+pci_map_resource(void *requested_addr, int fd, off_t offset, size_t size,
+		 int additional_flags)
 {
-	int fd;
 	void *mapaddr;
 
-	/*
-	 * open devname, to mmap it
-	 */
-	fd = open(devname, O_RDWR);
-	if (fd < 0) {
-		RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
-			devname, strerror(errno));
-		goto fail;
-	}
-
 	/* Map the PCI memory resource of device */
 	mapaddr = mmap(requested_addr, size, PROT_READ | PROT_WRITE,
-			MAP_SHARED, fd, offset);
-	close(fd);
-	if (mapaddr == MAP_FAILED ||
-			(requested_addr != NULL && mapaddr != requested_addr)) {
-		RTE_LOG(ERR, EAL, "%s(): cannot mmap(%s(%d), %p, 0x%lx, 0x%lx):"
-			" %s (%p)\n", __func__, devname, fd, requested_addr,
+			MAP_SHARED | additional_flags, fd, offset);
+	if (mapaddr == MAP_FAILED) {
+		RTE_LOG(ERR, EAL,
+			"%s(): cannot mmap(%d, %p, 0x%lx, 0x%lx): %s (%p)\n",
+			__func__, fd, requested_addr,
 			(unsigned long)size, (unsigned long)offset,
 			strerror(errno), mapaddr);
-		goto fail;
-	}
-
-	RTE_LOG(DEBUG, EAL, "  PCI memory mapped at %p\n", mapaddr);
+	} else
+		RTE_LOG(DEBUG, EAL, "  PCI memory mapped at %p\n", mapaddr);
 
 	return mapaddr;
-
-fail:
-	return NULL;
 }
 
 static int
 pci_uio_map_secondary(struct rte_pci_device *dev)
 {
-	size_t i;
+	int i, fd;
 	struct mapped_pci_resource *uio_res;
 	struct mapped_pci_res_list *uio_res_list =
 			RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list);
@@ -170,17 +154,30 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
 	TAILQ_FOREACH(uio_res, uio_res_list, next) {
 
 		/* skip this element if it doesn't match our PCI address */
-		if (memcmp(&uio_res->pci_addr, &dev->addr, sizeof(dev->addr)))
+		if (rte_eal_compare_pci_addr(&uio_res->pci_addr, &dev->addr))
 			continue;
 
 		for (i = 0; i != uio_res->nb_maps; i++) {
-			if (pci_map_resource(uio_res->maps[i].addr,
-					     uio_res->path,
-					     (off_t)uio_res->maps[i].offset,
-					     (size_t)uio_res->maps[i].size)
-			    != uio_res->maps[i].addr) {
+			/*
+			 * open devname, to mmap it
+			 */
+			fd = open(uio_res->maps[i].path, O_RDWR);
+			if (fd < 0) {
+				RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
+					uio_res->maps[i].path, strerror(errno));
+				return -1;
+			}
+
+			void *mapaddr = pci_map_resource(uio_res->maps[i].addr,
+					fd, (off_t)uio_res->maps[i].offset,
+					(size_t)uio_res->maps[i].size, 0);
+			/* fd is not needed in slave process, close it */
+			close(fd);
+			if (mapaddr != uio_res->maps[i].addr) {
 				RTE_LOG(ERR, EAL,
-					"Cannot mmap device resource\n");
+					"Cannot mmap device resource file %s to address: %p\n",
+					uio_res->maps[i].path,
+					uio_res->maps[i].addr);
 				return -1;
 			}
 		}
@@ -195,7 +192,7 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
 static int
 pci_uio_map_resource(struct rte_pci_device *dev)
 {
-	int i, j;
+	int i, map_idx = 0;
 	char devname[PATH_MAX]; /* contains the /dev/uioX */
 	void *mapaddr;
 	uint64_t phaddr;
@@ -247,35 +244,59 @@ pci_uio_map_resource(struct rte_pci_device *dev)
 	pagesz = sysconf(_SC_PAGESIZE);
 
 	maps = uio_res->maps;
-	for (i = uio_res->nb_maps = 0; i != PCI_MAX_RESOURCE; i++) {
+	for (i = 0; i != PCI_MAX_RESOURCE; i++) {
+		int fd;
 
-		j = uio_res->nb_maps;
 		/* skip empty BAR */
 		if ((phaddr = dev->mem_resource[i].phys_addr) == 0)
 			continue;
 
+		/* allocate memory to keep path */
+		maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0);
+		if (maps[map_idx].path == NULL) {
+			RTE_LOG(ERR, EAL, "Cannot allocate memory for path: %s\n",
+					strerror(errno));
+			goto error;
+		}
+
+		/*
+		 * open resource file, to mmap it
+		 */
+		fd = open(devname, O_RDWR);
+		if (fd < 0) {
+			RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
+					devname, strerror(errno));
+			rte_free(maps[map_idx].path);
+			goto error;
+		}
+
 		/* if matching map is found, then use it */
 		offset = i * pagesz;
-		maps[j].offset = offset;
-		maps[j].phaddr = dev->mem_resource[i].phys_addr;
-		maps[j].size = dev->mem_resource[i].len;
-		if (maps[j].addr != NULL ||
-		    (mapaddr = pci_map_resource(NULL, devname, (off_t)offset,
-						(size_t)maps[j].size)
-		    ) == NULL) {
+		mapaddr = pci_map_resource(NULL, fd, (off_t)offset,
+					(size_t)dev->mem_resource[i].len, 0);
+		close(fd);
+		if (mapaddr == MAP_FAILED) {
+			rte_free(maps[map_idx].path);
 			goto error;
 		}
 
-		maps[j].addr = mapaddr;
-		uio_res->nb_maps++;
+		maps[map_idx].phaddr = dev->mem_resource[i].phys_addr;
+		maps[map_idx].size = dev->mem_resource[i].len;
+		maps[map_idx].addr = mapaddr;
+		maps[map_idx].offset = offset;
+		strcpy(maps[map_idx].path, devname);
+		map_idx++;
 		dev->mem_resource[i].addr = mapaddr;
 	}
 
+	uio_res->nb_maps = map_idx;
+
 	TAILQ_INSERT_TAIL(uio_res_list, uio_res, next);
 
 	return 0;
-
 error:
+	for (i = 0; i < map_idx; i++)
+		rte_free(maps[i].path);
 	rte_free(uio_res);
 	if (dev->intr_handle.fd >= 0) {
 		close(dev->intr_handle.fd);
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c
index 838b851..f4e5dd1 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c
@@ -116,23 +116,15 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
 			void *mapaddr = pci_map_resource(uio_res->maps[i].addr,
 					fd, (off_t)uio_res->maps[i].offset,
 					(size_t)uio_res->maps[i].size, 0);
-			if (mapaddr != uio_res->maps[i].addr) {
-				if (mapaddr == MAP_FAILED)
-					RTE_LOG(ERR, EAL,
-							"Cannot mmap device resource file %s: %s\n",
-							uio_res->maps[i].path,
-							strerror(errno));
-				else
-					RTE_LOG(ERR, EAL,
-							"Cannot mmap device resource file %s to address: %p\n",
-							uio_res->maps[i].path,
-							uio_res->maps[i].addr);
-
-				close(fd);
-				return -1;
-			}
 			/* fd is not needed in slave process, close it */
 			close(fd);
+			if (mapaddr != uio_res->maps[i].addr) {
+				RTE_LOG(ERR, EAL,
+					"Cannot mmap device resource file %s to address: %p\n",
+					uio_res->maps[i].path,
+					uio_res->maps[i].addr);
+				return -1;
+			}
 		}
 		return 0;
 	}
@@ -354,8 +346,11 @@ pci_uio_map_resource(struct rte_pci_device *dev)
 
 		/* allocate memory to keep path */
 		maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0);
-		if (maps[map_idx].path == NULL)
+		if (maps[map_idx].path == NULL) {
+			RTE_LOG(ERR, EAL, "Cannot allocate memory for path: %s\n",
+					strerror(errno));
 			goto error;
+		}
 
 		/*
 		 * open resource file, to mmap it
-- 
2.1.4

  parent reply	other threads:[~2015-07-08 10:35 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-19  5:54 [dpdk-dev] [PATCH v4 0/5] Clean up pci uio implementations Tetsuya Mukawa
2015-05-19  5:54 ` [dpdk-dev] [PATCH v4 1/5] eal: Fix coding style of eal_pci.c and eal_pci_uio.c Tetsuya Mukawa
2015-05-19 14:51   ` Stephen Hemminger
2015-06-25  3:19   ` [dpdk-dev] [PATCH v5 0/5] Clean up pci uio implementations Tetsuya Mukawa
2015-06-25  3:19     ` [dpdk-dev] [PATCH v5 1/5] eal: Fix coding style of eal_pci.c and eal_pci_uio.c Tetsuya Mukawa
2015-06-25  9:16       ` David Marchand
2015-06-25  3:19     ` [dpdk-dev] [PATCH v5 2/5] eal: Close file descriptor of uio configuration Tetsuya Mukawa
2015-06-25  3:19     ` [dpdk-dev] [PATCH v5 3/5] eal: Fix memory leaks and needless increment of pci_map_addr Tetsuya Mukawa
2015-06-25  9:16       ` David Marchand
2015-06-26  1:30         ` Tetsuya Mukawa
2015-06-25  9:18       ` David Marchand
2015-06-26  1:35         ` Tetsuya Mukawa
2015-06-26  8:18       ` [dpdk-dev] [PATCH v6 0/5] Clean up pci uio implementations Tetsuya Mukawa
2015-06-26  8:18         ` [dpdk-dev] [PATCH v6 1/5] eal: Fix coding style of eal_pci.c and eal_pci_uio.c Tetsuya Mukawa
2015-06-26 14:30           ` Iremonger, Bernard
2015-06-26  8:18         ` [dpdk-dev] [PATCH v6 2/5] eal: Close file descriptor of uio configuration Tetsuya Mukawa
2015-06-26 14:32           ` Iremonger, Bernard
2015-06-26  8:18         ` [dpdk-dev] [PATCH v6 3/5] eal: Fix memory leaks and needless increment of pci_map_addr Tetsuya Mukawa
2015-06-26 14:34           ` Iremonger, Bernard
2015-06-30  8:24           ` [dpdk-dev] [PATCH v7 00/12] Clean up pci uio implementations Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 01/12] eal: Fix coding style of eal_pci.c and eal_pci_uio.c Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 02/12] eal: Close file descriptor of uio configuration Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 03/12] eal: Fix memory leaks and needless increment of pci_map_addr Tetsuya Mukawa
2015-06-30 12:33               ` Iremonger, Bernard
2015-07-02  9:57               ` Bruce Richardson
2015-07-03  8:51                 ` Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 04/12] eal/bsdapp: Change names of pci related data structure Tetsuya Mukawa
2015-06-30 12:36               ` Iremonger, Bernard
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 05/12] eal: Fix uio mapping differences between linuxapp and bsdapp Tetsuya Mukawa
2015-06-30 12:51               ` Iremonger, Bernard
2015-07-02 10:20               ` Bruce Richardson
2015-07-03  8:51                 ` Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 06/12] eal: Add pci_uio_alloc_resource() Tetsuya Mukawa
2015-07-02 10:46               ` Bruce Richardson
2015-07-03  8:52                 ` Tetsuya Mukawa
2015-07-03  9:45                   ` Bruce Richardson
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 07/12] eal: Add pci_uio_map_resource_by_index() Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 08/12] eal: Consolidate pci_map and mapped_pci_resource of linuxapp and bsdapp Tetsuya Mukawa
2015-06-30 14:25               ` Iremonger, Bernard
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 09/12] eal: Consolidate pci_map/unmap_resource() " Tetsuya Mukawa
2015-06-30 14:28               ` Iremonger, Bernard
2015-07-02 11:11               ` Bruce Richardson
2015-07-03  8:52                 ` Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 10/12] eal: Consolidate pci uio functions " Tetsuya Mukawa
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 11/12] eal: Consolidate pci_map/unmap_device() " Tetsuya Mukawa
2015-06-30 14:45               ` Iremonger, Bernard
2015-07-06  6:24               ` [dpdk-dev] [PATCH v8 00/12] Clean up pci uio implementations Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 01/12] eal: Fix coding style of eal_pci.c and eal_pci_uio.c Tetsuya Mukawa
2015-07-07  8:04                   ` David Marchand
2015-07-08  2:42                     ` Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 02/12] eal: Close file descriptor of uio configuration Tetsuya Mukawa
2015-07-07  8:04                   ` David Marchand
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 03/12] eal: Fix memory leaks and needless increment of pci_map_addr Tetsuya Mukawa
2015-07-07  8:04                   ` David Marchand
2015-07-08  2:42                     ` Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 04/12] eal/bsdapp: Change names of pci related data structure Tetsuya Mukawa
2015-07-07  8:04                   ` David Marchand
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 05/12] eal: Fix uio mapping differences between linuxapp and bsdapp Tetsuya Mukawa
2015-07-07  8:04                   ` David Marchand
2015-07-08  2:42                     ` Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 06/12] eal: Add pci_uio_alloc_resource() Tetsuya Mukawa
2015-07-07  8:04                   ` David Marchand
2015-07-08  2:42                     ` Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 07/12] eal: Add pci_uio_map_resource_by_index() Tetsuya Mukawa
2015-07-07  8:05                   ` David Marchand
2015-07-08  2:42                     ` Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 08/12] eal: Consolidate pci_map and mapped_pci_resource of linuxapp and bsdapp Tetsuya Mukawa
2015-07-07  8:05                   ` David Marchand
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 09/12] eal: Consolidate pci_map/unmap_resource() " Tetsuya Mukawa
2015-07-07  8:05                   ` David Marchand
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 10/12] eal: Consolidate pci uio functions " Tetsuya Mukawa
2015-07-07  8:07                   ` David Marchand
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 11/12] eal: Consolidate pci_map/unmap_device() " Tetsuya Mukawa
2015-07-07  8:06                   ` David Marchand
2015-07-08  2:42                     ` Tetsuya Mukawa
2015-07-08  8:27                       ` Thomas Monjalon
2015-07-08  8:50                         ` Tetsuya Mukawa
2015-07-06  6:24                 ` [dpdk-dev] [PATCH v8 12/12] eal: Consolidate rte_eal_pci_probe/close_one_driver() " Tetsuya Mukawa
2015-07-07  8:07                   ` David Marchand
2015-07-08 10:34               ` [dpdk-dev] [PATCH v9 00/12] Clean up pci uio implementations Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 01/12] eal: Fix coding style of eal_pci.c and eal_pci_uio.c Tetsuya Mukawa
2015-07-08 16:09                   ` Stephen Hemminger
2015-07-08 20:30                     ` Thomas Monjalon
2015-07-09  1:09                       ` Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 02/12] eal: Close file descriptor of uio configuration Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 03/12] eal: Fix memory leaks and needless increment of pci_map_addr Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 04/12] eal/bsdapp: Change names of pci related data structure Tetsuya Mukawa
2015-07-08 10:34                 ` Tetsuya Mukawa [this message]
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 06/12] eal: Add pci_uio_alloc/free_resource() Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 07/12] eal: Add pci_uio_map_resource_by_index() Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 08/12] eal: Consolidate pci_map and mapped_pci_resource of linuxapp and bsdapp Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 09/12] eal: Consolidate pci_map/unmap_resource() " Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 10/12] eal: Consolidate pci uio functions " Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 11/12] eal: Consolidate pci_map/unmap_device() " Tetsuya Mukawa
2015-07-08 10:34                 ` [dpdk-dev] [PATCH v9 12/12] eal: Consolidate rte_eal_pci_probe/close_one_driver() " Tetsuya Mukawa
2015-07-08 12:36                 ` [dpdk-dev] [PATCH v9 00/12] Clean up pci uio implementations David Marchand
2015-07-08 21:52                   ` Thomas Monjalon
2015-06-30  8:24             ` [dpdk-dev] [PATCH v7 12/12] eal: Consolidate rte_eal_pci_probe/close_one_driver() of linuxapp and bsdapp Tetsuya Mukawa
2015-06-30 14:56               ` Iremonger, Bernard
2015-07-01  6:39                 ` Tetsuya Mukawa
2015-07-02 11:32             ` [dpdk-dev] [PATCH v7 00/12] Clean up pci uio implementations Bruce Richardson
2015-07-03  8:52               ` Tetsuya Mukawa
2015-06-26  8:18         ` [dpdk-dev] [PATCH v6 4/5] eal/bsdapp: Change names of pci related data structure Tetsuya Mukawa
2015-06-26 14:36           ` Iremonger, Bernard
2015-06-26  8:18         ` [dpdk-dev] [PATCH v6 5/5] eal: Fix uio mapping differences between linuxapp and bsdapp Tetsuya Mukawa
2015-06-26 14:42           ` Iremonger, Bernard
2015-06-25  3:19     ` [dpdk-dev] [PATCH v5 4/5] eal/bsdapp: Change names of pci related data structure Tetsuya Mukawa
2015-06-25  9:19       ` David Marchand
2015-06-25  3:19     ` [dpdk-dev] [PATCH v5 5/5] eal: Fix uio mapping differences between linuxapp and bsdapp Tetsuya Mukawa
2015-05-19  5:54 ` [dpdk-dev] [PATCH v4 2/5] eal: Close file descriptor of uio configuration Tetsuya Mukawa
2015-05-19 16:02   ` Stephen Hemminger
2015-05-19  5:54 ` [dpdk-dev] [PATCH v4 3/5] eal: Fix memory leaks and needless increment of pci_map_addr Tetsuya Mukawa
2015-06-15 14:29   ` Iremonger, Bernard
2015-06-15 15:05     ` Iremonger, Bernard
2015-05-19  5:54 ` [dpdk-dev] [PATCH v4 4/5] eal/bsdapp: Change names of pci related data structure Tetsuya Mukawa
2015-05-19  5:54 ` [dpdk-dev] [PATCH v4 5/5] eal: Fix uio mapping differences between linuxapp and bsdapp Tetsuya Mukawa
2015-06-15 14:31   ` Iremonger, Bernard
2015-06-15 15:08     ` Iremonger, Bernard
2015-06-15 15:17       ` Thomas Monjalon
2015-05-19  5:57 ` [dpdk-dev] [PATCH v4 0/5] Clean up pci uio implementations Tetsuya Mukawa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1436351693-2349-6-git-send-email-mukawa@igel.co.jp \
    --to=mukawa@igel.co.jp \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).