From patchwork Thu Aug 16 18:47:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Boccassi X-Patchwork-Id: 43751 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E53C14C87; Thu, 16 Aug 2018 20:47:58 +0200 (CEST) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id B49CC4C6F for ; Thu, 16 Aug 2018 20:47:57 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id w24-v6so5230896wmc.1 for ; Thu, 16 Aug 2018 11:47:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=8jA1rguQNQsWxOIHsHF/vAjDwGqJikL8hM7ycAKTsa4=; b=Pi7Z+8EC6FAzTLW2ftGuoGVQzqipTzoKDjGG2L6HMtf02Oavlak0scp/qJHaTKU04k nxuxvlBWF5vNFPNMUKrUSz0YUhFtt8BdofSMbzhfyUdf2VcxrCDyNfDIFaZRX+yyxICY oF4f+diCfiJ/8c2OhxeOAmwFkLdxodxaLT4llIe1FzLcKrCAi3IYiV3rC1/G6R1yxqnW Nb1mymVjjPLo1aaj5OJMEUZoDBufuP6dARqUXVgsLH5geE3osCYKf7fbl1K1j18GVM2G rG2rEWrQYZyN7ZXm/xpe2vAjcDpVQHF/hC/rP1mTzeDMlEpV8sW/a29e8HWVQtwyBQgR w4xw== X-Gm-Message-State: AOUpUlFQS8hUoSwJIPZ4/OkJHA4DwuyGo1VV03yEKV7ph6WnghJD2ECp rt1yC2kefLDZcQvAxznZPAWYv/DN X-Google-Smtp-Source: AA+uWPxFY/RCSTh9iIMCUNzZumvLpGrirB26epP6Ukemmhms0Q2TpDQ1MZD8ovnqfvnDE6NyNzI7zA== X-Received: by 2002:a1c:2352:: with SMTP id j79-v6mr16782232wmj.124.1534445277071; Thu, 16 Aug 2018 11:47:57 -0700 (PDT) Received: from localhost ([2a01:4b00:f419:6f00:8361:8946:ba2b:d556]) by smtp.gmail.com with ESMTPSA id t4-v6sm67240wrb.45.2018.08.16.11.47.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 Aug 2018 11:47:55 -0700 (PDT) From: Luca Boccassi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, zhihong.wang@intel.com, tiwei.bie@intel.com, bruce.richardson@intel.com, Luca Boccassi Date: Thu, 16 Aug 2018 19:47:49 +0100 Message-Id: <20180816184750.30843-1-bluca@debian.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180814143035.19640-1-bluca@debian.org> References: <20180814143035.19640-1-bluca@debian.org> Subject: [dpdk-dev] [PATCH 1/2] bus/pci: harmonize and document rte_pci_read_config return value X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list 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 Linux, rte_pci_read_config on success returns the number of read bytes, but on BSD it returns 0. Document the return values, and have BSD behave as Linux does. At least one case (bnx2x PMD) treats 0 as an error, so the change makes sense also for that. Signed-off-by: Luca Boccassi --- drivers/bus/pci/bsd/pci.c | 4 +++- drivers/bus/pci/rte_bus_pci.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c index 655b34b7e4..175d83cf1b 100644 --- a/drivers/bus/pci/bsd/pci.c +++ b/drivers/bus/pci/bsd/pci.c @@ -439,6 +439,8 @@ int rte_pci_read_config(const struct rte_pci_device *dev, { int fd = -1; int size; + /* Copy Linux implementation's behaviour */ + const int return_len = len; struct pci_io pi = { .pi_sel = { .pc_domain = dev->addr.domain, @@ -469,7 +471,7 @@ int rte_pci_read_config(const struct rte_pci_device *dev, } close(fd); - return 0; + return return_len; error: if (fd >= 0) diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h index 0d1955ffe0..df8f64798d 100644 --- a/drivers/bus/pci/rte_bus_pci.h +++ b/drivers/bus/pci/rte_bus_pci.h @@ -219,6 +219,8 @@ void rte_pci_unregister(struct rte_pci_driver *driver); * The length of the data buffer. * @param offset * The offset into PCI config space + * @return + * Number of bytes read on success, negative on error. */ int rte_pci_read_config(const struct rte_pci_device *device, void *buf, size_t len, off_t offset); From patchwork Thu Aug 16 18:47:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Boccassi X-Patchwork-Id: 43752 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D917A4C94; Thu, 16 Aug 2018 20:48:00 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id 0AB834C8E for ; Thu, 16 Aug 2018 20:47:59 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id l2-v6so16302452wme.1 for ; Thu, 16 Aug 2018 11:47:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3jaYz322ohNBPkSebIMuyNg5T9pWuMC5tD0kch/fRi0=; b=DmJ5OXQ+iY9xijAMqOUCm3gq9VjekHBXHE0LtVp8Y/tfGOvjEPLdWpiGdak86RAo0M i0kYarFsiO3Bx0iGhe1X81FzGP5BHngUdu0w7TYwu9AYKSbF+th625Kzorn/Iug5XCPY M49ON4LblOEzcYVhGsQ7Abrvu63+wqh/GIGB8p+ZywEib3q/F+cq1+2XPoMA/pG6vxrP a+saWrocGklKucRO3cdgKprZQ+Uqve07H5dF+pqVYQKgU137Swv4sg3E6fFItQFThguh +MbfeCqGZzaMTCqC5D2bzm48Puwx1KFiHEgTuBMdE5sdf8Y1V2V/4qNhJNXP+6q92hcW cysA== X-Gm-Message-State: AOUpUlHvwQBBisgl/f0abmgjYhuPoDrGi57qmVVF2Qwve0LDVa5Eh7Nn dhNSVylvM7vdPlDGrgJ13anH/vnW X-Google-Smtp-Source: AA+uWPwNEsAqQ8CaA5wvbzCydNymTMU8vf1Ruts3Yoj/4/BirKr2wo3iR8JG3oztBLZdICttQ8MHGg== X-Received: by 2002:a1c:ea9c:: with SMTP id g28-v6mr16989465wmi.65.1534445279317; Thu, 16 Aug 2018 11:47:59 -0700 (PDT) Received: from localhost ([2a01:4b00:f419:6f00:8361:8946:ba2b:d556]) by smtp.gmail.com with ESMTPSA id c12-v6sm54021wrr.6.2018.08.16.11.47.58 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 Aug 2018 11:47:58 -0700 (PDT) From: Luca Boccassi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, zhihong.wang@intel.com, tiwei.bie@intel.com, bruce.richardson@intel.com, Brian Russell , Luca Boccassi Date: Thu, 16 Aug 2018 19:47:50 +0100 Message-Id: <20180816184750.30843-2-bluca@debian.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180816184750.30843-1-bluca@debian.org> References: <20180814143035.19640-1-bluca@debian.org> <20180816184750.30843-1-bluca@debian.org> Subject: [dpdk-dev] [PATCH 2/2] virtio: fix PCI config err handling X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Brian Russell In virtio_read_caps and vtpci_msix_detect, rte_pci_read_config returns the number of bytes read from PCI config or < 0 on error. If less than the expected number of bytes are read then log the failure and return rather than carrying on with garbage. Fixes: 6ba1f63b5ab0 ("virtio: support specification 1.0") Signed-off-by: Brian Russell Signed-off-by: Luca Boccassi --- v2: handle additional rte_pci_read_config incomplete reads drivers/net/virtio/virtio_pci.c | 35 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 6bd22e54a6..ff6f96f361 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -560,6 +560,7 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) uint8_t pos; struct virtio_pci_cap cap; int ret; + uint32_t multiplier; if (rte_pci_map_device(dev)) { PMD_INIT_LOG(DEBUG, "failed to map pci device!"); @@ -567,16 +568,18 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) } ret = rte_pci_read_config(dev, &pos, 1, PCI_CAPABILITY_LIST); - if (ret < 0) { - PMD_INIT_LOG(DEBUG, "failed to read pci capability list"); + if (ret != 1) { + PMD_INIT_LOG(DEBUG, + "failed to read pci capability list, ret %d", ret); return -1; } while (pos) { ret = rte_pci_read_config(dev, &cap, sizeof(cap), pos); - if (ret < 0) { - PMD_INIT_LOG(ERR, - "failed to read pci cap at pos: %x", pos); + if (ret != sizeof(cap)) { + PMD_INIT_LOG(DEBUG, + "failed to read pci cap at pos: %x ret %d", + pos, ret); break; } @@ -610,9 +613,13 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) hw->common_cfg = get_cfg_addr(dev, &cap); break; case VIRTIO_PCI_CAP_NOTIFY_CFG: - rte_pci_read_config(dev, &hw->notify_off_multiplier, - 4, pos + sizeof(cap)); - hw->notify_base = get_cfg_addr(dev, &cap); + /* Avoid half-reads into hw */ + ret = rte_pci_read_config(dev, &multiplier, 4, + pos + sizeof(cap)); + if (ret == 4) { + hw->notify_off_multiplier = multiplier; + hw->notify_base = get_cfg_addr(dev, &cap); + } break; case VIRTIO_PCI_CAP_DEVICE_CFG: hw->dev_cfg = get_cfg_addr(dev, &cap); @@ -693,16 +700,18 @@ vtpci_msix_detect(struct rte_pci_device *dev) int ret; ret = rte_pci_read_config(dev, &pos, 1, PCI_CAPABILITY_LIST); - if (ret < 0) { - PMD_INIT_LOG(DEBUG, "failed to read pci capability list"); + if (ret != 1) { + PMD_INIT_LOG(DEBUG, + "failed to read pci capability list, ret %d", ret); return VIRTIO_MSIX_NONE; } while (pos) { ret = rte_pci_read_config(dev, &cap, sizeof(cap), pos); - if (ret < 0) { - PMD_INIT_LOG(ERR, - "failed to read pci cap at pos: %x", pos); + if (ret != sizeof(cap)) { + PMD_INIT_LOG(DEBUG, + "failed to read pci cap at pos: %x ret %d", + pos, ret); break; }