From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by dpdk.org (Postfix) with ESMTP id 689C8234 for ; Fri, 30 Jan 2015 11:04:31 +0100 (CET) Received: by mail-pa0-f46.google.com with SMTP id lj1so50596768pab.5 for ; Fri, 30 Jan 2015 02:04:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=UKq8CC/JMDQtRpPFDndn709GXoLWHPWHQoAQxk2gA6g=; b=TvPjBTXoH4IPzxvraSgNDjd59+mHaueaHTlX/l39GUk544T+Mxzn0z8htr14XUoGPa UyD6MnzKtmwsyOHdAuPPSpi7g7sL4PP5lvgAY3rlGwjv4XZqzi+dyKXU+NvKN0NzhuET dsbCBzU8exNMennj0Fsy0ZUS4/a5nKtqHjHMzY40cGAxjvNex2aGAMa8UiVdnv2nh6BI oBHeBBmA4QRQfRACnHQ3j0s9FIsKDaxErMaWtpIKfHmwpsPoKT9o6zsVqUNTTUFBoJpf 8r+akTKcw7/LMXklsaCVXL4UVtZaJTEbBP9AJhCE2Lb3njhqAdFhAPru04e7vab/yTdz BiAg== X-Gm-Message-State: ALoCoQklkkVGBkPKLvOs+SpYNU2svF8Mk7O696B5S0ax7+I9kn30sw3W4bBpMznVxYJvBTVpOi7P X-Received: by 10.68.69.46 with SMTP id b14mr7751842pbu.9.1422612270712; Fri, 30 Jan 2015 02:04:30 -0800 (PST) Received: from [10.16.129.101] (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id a6sm10216478pbu.95.2015.01.30.02.04.28 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 30 Jan 2015 02:04:30 -0800 (PST) Message-ID: <54CB572B.4040409@igel.co.jp> Date: Fri, 30 Jan 2015 19:04:27 +0900 From: Tetsuya Mukawa User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Huawei Xie , dev@dpdk.org References: <1422599787-12009-1-git-send-email-huawei.xie@intel.com> <1422599787-12009-6-git-send-email-huawei.xie@intel.com> In-Reply-To: <1422599787-12009-6-git-send-email-huawei.xie@intel.com> Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH 05/12] lib/librte_vhost: copy host_memory_map from virtio-net.c to a new file virtio-net-cdev.c X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Jan 2015 10:04:32 -0000 On 2015/01/30 15:36, Huawei Xie wrote: > Signed-off-by: Huawei Xie > --- > lib/librte_vhost/vhost_cuse/virtio-net-cdev.c | 258 ++++++++++++++++++++++++++ > 1 file changed, 258 insertions(+) > create mode 100644 lib/librte_vhost/vhost_cuse/virtio-net-cdev.c > > diff --git a/lib/librte_vhost/vhost_cuse/virtio-net-cdev.c b/lib/librte_vhost/vhost_cuse/virtio-net-cdev.c > new file mode 100644 > index 0000000..fbfc403 > --- /dev/null > +++ b/lib/librte_vhost/vhost_cuse/virtio-net-cdev.c > @@ -0,0 +1,258 @@ > +/*- > + * BSD LICENSE > + * > + * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in > + * the documentation and/or other materials provided with the > + * distribution. > + * * Neither the name of Intel Corporation nor the names of its > + * contributors may be used to endorse or promote products derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include "vhost-net.h" > + > +/* Line size for reading maps file. */ > +static const uint32_t BUFSIZE = PATH_MAX; > + > +/* Size of prot char array in procmap. */ > +#define PROT_SZ 5 > + > +/* Number of elements in procmap struct. */ > +#define PROCMAP_SZ 8 > + > +/* Structure containing information gathered from maps file. */ > +struct procmap { > + uint64_t va_start; /* Start virtual address in file. */ > + uint64_t len; /* Size of file. */ > + uint64_t pgoff; /* Not used. */ > + uint32_t maj; /* Not used. */ > + uint32_t min; /* Not used. */ > + uint32_t ino; /* Not used. */ > + char prot[PROT_SZ]; /* Not used. */ > + char fname[PATH_MAX]; /* File name. */ > +}; > + > +/* > + * Locate the file containing QEMU's memory space and > + * map it to our address space. > + */ > +static int > +host_memory_map(struct virtio_net *dev, struct virtio_memory *mem, > + pid_t pid, uint64_t addr) > +{ Hi Xie, This patch only copy host_memory_map() to a new file. And actually the original function is removed at below patch. - "[PATCH 07/12] lib/librte_vhost: split set_memory_table into two parts" Is it difficult to remove and copy the function in this patch? Thanks, Tetsuya > + struct dirent *dptr = NULL; > + struct procmap procmap; > + DIR *dp = NULL; > + int fd; > + int i; > + char memfile[PATH_MAX]; > + char mapfile[PATH_MAX]; > + char procdir[PATH_MAX]; > + char resolved_path[PATH_MAX]; > + char *path = NULL; > + FILE *fmap; > + void *map; > + uint8_t found = 0; > + char line[BUFSIZE]; > + char dlm[] = "- : "; > + char *str, *sp, *in[PROCMAP_SZ]; > + char *end = NULL; > + > + /* Path where mem files are located. */ > + snprintf(procdir, PATH_MAX, "/proc/%u/fd/", pid); > + /* Maps file used to locate mem file. */ > + snprintf(mapfile, PATH_MAX, "/proc/%u/maps", pid); > + > + fmap = fopen(mapfile, "r"); > + if (fmap == NULL) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Failed to open maps file for pid %d\n", > + dev->device_fh, pid); > + return -1; > + } > + > + /* Read through maps file until we find out base_address. */ > + while (fgets(line, BUFSIZE, fmap) != 0) { > + str = line; > + errno = 0; > + /* Split line into fields. */ > + for (i = 0; i < PROCMAP_SZ; i++) { > + in[i] = strtok_r(str, &dlm[i], &sp); > + if ((in[i] == NULL) || (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + str = NULL; > + } > + > + /* Convert/Copy each field as needed. */ > + procmap.va_start = strtoull(in[0], &end, 16); > + if ((in[0] == '\0') || (end == NULL) || (*end != '\0') || > + (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + > + procmap.len = strtoull(in[1], &end, 16); > + if ((in[1] == '\0') || (end == NULL) || (*end != '\0') || > + (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + > + procmap.pgoff = strtoull(in[3], &end, 16); > + if ((in[3] == '\0') || (end == NULL) || (*end != '\0') || > + (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + > + procmap.maj = strtoul(in[4], &end, 16); > + if ((in[4] == '\0') || (end == NULL) || (*end != '\0') || > + (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + > + procmap.min = strtoul(in[5], &end, 16); > + if ((in[5] == '\0') || (end == NULL) || (*end != '\0') || > + (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + > + procmap.ino = strtoul(in[6], &end, 16); > + if ((in[6] == '\0') || (end == NULL) || (*end != '\0') || > + (errno != 0)) { > + fclose(fmap); > + return -1; > + } > + > + memcpy(&procmap.prot, in[2], PROT_SZ); > + memcpy(&procmap.fname, in[7], PATH_MAX); > + > + if (procmap.va_start == addr) { > + procmap.len = procmap.len - procmap.va_start; > + found = 1; > + break; > + } > + } > + fclose(fmap); > + > + if (!found) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Failed to find memory file in pid %d maps file\n", > + dev->device_fh, pid); > + return -1; > + } > + > + /* Find the guest memory file among the process fds. */ > + dp = opendir(procdir); > + if (dp == NULL) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Cannot open pid %d process directory\n", > + dev->device_fh, pid); > + return -1; > + } > + > + found = 0; > + > + /* Read the fd directory contents. */ > + while (NULL != (dptr = readdir(dp))) { > + snprintf(memfile, PATH_MAX, "/proc/%u/fd/%s", > + pid, dptr->d_name); > + path = realpath(memfile, resolved_path); > + if ((path == NULL) && (strlen(resolved_path) == 0)) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Failed to resolve fd directory\n", > + dev->device_fh); > + closedir(dp); > + return -1; > + } > + if (strncmp(resolved_path, procmap.fname, > + strnlen(procmap.fname, PATH_MAX)) == 0) { > + found = 1; > + break; > + } > + } > + > + closedir(dp); > + > + if (found == 0) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Failed to find memory file for pid %d\n", > + dev->device_fh, pid); > + return -1; > + } > + /* Open the shared memory file and map the memory into this process. */ > + fd = open(memfile, O_RDWR); > + > + if (fd == -1) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Failed to open %s for pid %d\n", > + dev->device_fh, memfile, pid); > + return -1; > + } > + > + map = mmap(0, (size_t)procmap.len, PROT_READ|PROT_WRITE, > + MAP_POPULATE|MAP_SHARED, fd, 0); > + close(fd); > + > + if (map == MAP_FAILED) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "(%"PRIu64") Error mapping the file %s for pid %d\n", > + dev->device_fh, memfile, pid); > + return -1; > + } > + > + /* Store the memory address and size in the device data structure */ > + mem->mapped_address = (uint64_t)(uintptr_t)map; > + mem->mapped_size = procmap.len; > + > + LOG_DEBUG(VHOST_CONFIG, > + "(%"PRIu64") Mem File: %s->%s - Size: %llu - VA: %p\n", > + dev->device_fh, > + memfile, resolved_path, > + (unsigned long long)mem->mapped_size, map); > + > + return 0; > +} > +