From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Burakov, Anatoly" Subject: Re: [PATCH v13 02/19] bus/pci: fix PCI address compare Date: Thu, 12 Jul 2018 10:24:44 +0100 Message-ID: <20058c30-7587-7c23-d783-b7a8153592b8@intel.com> References: <20180607123849.14439-1-qi.z.zhang@intel.com> <20180712011514.45006-1-qi.z.zhang@intel.com> <20180712011514.45006-3-qi.z.zhang@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Cc: konstantin.ananyev@intel.com, dev@dpdk.org, bruce.richardson@intel.com, ferruh.yigit@intel.com, benjamin.h.shelton@intel.com, narender.vangati@intel.com, stable@dpdk.org To: Qi Zhang , thomas@monjalon.net Return-path: In-Reply-To: <20180712011514.45006-3-qi.z.zhang@intel.com> Content-Language: en-US List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 12-Jul-18 2:14 AM, Qi Zhang wrote: > When use memcmp to compare two PCI address, sizeof(struct rte_pci_addr) > is 4 bytes aligned, and it is 8. While only 7 byte of struct rte_pci_addr > is valid. So compare the 8th byte will cause the unexpected result, which > happens when repeatedly attach/detach a device. > > Fixes: c752998b5e2e ("pci: introduce library and driver") > Cc: stable@dpdk.org > > Signed-off-by: Qi Zhang > --- > drivers/bus/pci/linux/pci_vfio.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c > index aeeaa9ed8..dd25c3542 100644 > --- a/drivers/bus/pci/linux/pci_vfio.c > +++ b/drivers/bus/pci/linux/pci_vfio.c > @@ -43,6 +43,17 @@ static struct rte_tailq_elem rte_vfio_tailq = { > }; > EAL_REGISTER_TAILQ(rte_vfio_tailq) > > +/* Compair two pci address */ > +static int pci_addr_cmp(struct rte_pci_addr *addr1, struct rte_pci_addr *addr2) > +{ > + if (addr1->domain == addr2->domain && > + addr1->bus == addr2->bus && > + addr1->devid == addr2->devid && > + addr1->function == addr2->function) > + return 0; > + return 1; > +} Generally, change looks OK to me, but I think we already have this function in PCI library - rte_pci_addr_cmp(). Is there a specific reason to reimplement it here? > + > int > pci_vfio_read_config(const struct rte_intr_handle *intr_handle, > void *buf, size_t len, off_t offs) > @@ -642,7 +653,7 @@ pci_vfio_unmap_resource(struct rte_pci_device *dev) > vfio_res_list = RTE_TAILQ_CAST(rte_vfio_tailq.head, mapped_pci_res_list); > /* Get vfio_res */ > TAILQ_FOREACH(vfio_res, vfio_res_list, next) { > - if (memcmp(&vfio_res->pci_addr, &dev->addr, sizeof(dev->addr))) > + if (pci_addr_cmp(&vfio_res->pci_addr, &dev->addr)) > continue; > break; > } > -- Thanks, Anatoly