From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Monjalon Subject: Re: [PATCH v2] eal: fix check number of bytes from read function Date: Fri, 22 Jul 2016 17:24:51 +0200 Message-ID: <2746518.l5JpmnHLoW@xps13> References: <1469024689-1076-1-git-send-email-michalx.k.jastrzebski@intel.com> <1469198030-8664-1-git-send-email-michalx.k.jastrzebski@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7Bit Cc: bruce.richardson@intel.com, dev@dpdk.org, michalx.kobylinski@intel.com, sergio.gonzalez.monroy@intel.com, david.marchand@6wind.com To: Michal Jastrzebski Return-path: Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com [74.125.82.51]) by dpdk.org (Postfix) with ESMTP id 924762BE2 for ; Fri, 22 Jul 2016 17:24:53 +0200 (CEST) Received: by mail-wm0-f51.google.com with SMTP id o80so71403805wme.1 for ; Fri, 22 Jul 2016 08:24:53 -0700 (PDT) In-Reply-To: <1469198030-8664-1-git-send-email-michalx.k.jastrzebski@intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 2016-07-22 16:33, Michal Jastrzebski: > v2: > -moved close(fd) just after read. > -when read() from fd we expect 8 bytes, so PFN_MASK_SIZE macro > was introduced instead sizeof(uint64_t). > -removed errno print when read returns less than 8 bytes Looks better. Note: this changelog should be below --- to avoid appearing in the commit. > In rte_mem_virt2phy: Value returned from a function and indicating the > number of bytes was ignored. This could cause a wrong pfn (page frame > number) mask read from pagemap file. > When read returns less than the number of sizeof(uint64_t) bytes, > function rte_mem_virt2phy returns error. Better title to explain the issue: mem: fix check of physical address retrieval > +#define PFN_MASK_SIZE 8 > + > #ifdef RTE_LIBRTE_XEN_DOM0 > int rte_xen_dom0_supported(void) > { > @@ -158,7 +160,7 @@ rte_mem_lock_page(const void *virt) > phys_addr_t > rte_mem_virt2phy(const void *virtaddr) > { > - int fd; > + int fd, retval; > uint64_t page, physaddr; > unsigned long virt_pfn; > int page_size; > @@ -209,10 +211,19 @@ rte_mem_virt2phy(const void *virtaddr) > close(fd); > return RTE_BAD_PHYS_ADDR; > } > - if (read(fd, &page, sizeof(uint64_t)) < 0) { > + > + retval = read(fd, &page, sizeof(uint64_t)); We could use PFN_MASK_SIZE here > + close(fd); > + if (retval < 0) { > RTE_LOG(ERR, EAL, "%s(): cannot read /proc/self/pagemap: %s\n", > __func__, strerror(errno)); > - close(fd); > + useless whitespace > + return RTE_BAD_PHYS_ADDR; > + } else if (retval != PFN_MASK_SIZE) { > + RTE_LOG(ERR, EAL, "%s(): read %d bytes from /proc/self/pagemap " > + "but expected %d:\n", > + __func__, retval, PFN_MASK_SIZE); > + useless whitespace > return RTE_BAD_PHYS_ADDR; > } > > @@ -222,7 +233,7 @@ rte_mem_virt2phy(const void *virtaddr) > */ > physaddr = ((page & 0x7fffffffffffffULL) * page_size) > + ((unsigned long)virtaddr % page_size); > - close(fd); > + > return physaddr; > } If you and Sergio agree, I can make the minor changes before applying.