From patchwork Thu Oct 12 08:17:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 30183 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 110461B1C7; Thu, 12 Oct 2017 10:17:59 +0200 (CEST) Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by dpdk.org (Postfix) with ESMTP id B73B11B19D for ; Thu, 12 Oct 2017 10:17:45 +0200 (CEST) Received: by mail-wm0-f45.google.com with SMTP id b189so10750607wmd.4 for ; Thu, 12 Oct 2017 01:17:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=6ec+uCBCg6bB59/P2XJrvX/j5Zq1ZlDpR3r4K26woBU=; b=gwdO+ZWQtd3zIjY26hb/cCfgs1fd/je9MXO1TfF9HD63Cpl8RrTX9b5t9pvQ2HmnUZ YT6g7MK8LVgZvlAOJmPYxW8mAWPooFo6D6/L4YxB/URrVdyl7R4t88LbWEz6Y4ELepmF /JHzaCQNkbUiKT2YdmidxKvrQ9XmQ8x5s9Cc/C7HN5x3ksPV2m8+bic6QUCfM9eqW8ip 8+Z0M+B14KUtXLrFF2ijfRM/Wd0M365ZBOt8sliKguzzwLzhqS1TVTP+tDpQE1zQDcir w0E+O5VAsqLOkmZgcc3dKesI5Y7L7Jo0cgTyNKWBhDw/uUPbBJX1rc65hzAiOwmpMGDC p70Q== 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:in-reply-to:references; bh=6ec+uCBCg6bB59/P2XJrvX/j5Zq1ZlDpR3r4K26woBU=; b=AvOiJxCWJdW+UUGB1tdUpT38SmQbRJ7VjrqxfrUvk5URR43hTUUlK5LytViftYDGUz hmsstXYhcnXZ0rX/MeCi4jxjw63BETn2Ebu7+lst2u+itcdfAbHTmAtFTocBCl2JxFdr kyEIMyrpnwYftbGRV1Dyp+Sfqhg2Eij5VTfM6dzg4Mpo1n/ZAOq/x2ZHG/iaC1+ILtI5 a3rY5m1inuAgIYEg4CMFbK9qqcOtsVHwQSsB3tGWxzKSwgPxMkAv9L5Ak5GBBhNfQ90h awKyzmSEX5uM3RvhTmjJ1JsBni/0yI2oq6yHKG/4RTi/IcdOx5h6wLmYgHfuglgbh/ze M/0A== X-Gm-Message-State: AMCzsaUokjRHPRUihhtGzbpOVWA4HnvhltYvegWs+hlzGWoVHM7alXST 4+bEBrdmWeq4JLGf6DUNhnUj+sGd X-Google-Smtp-Source: AOwi7QAMboSIqgUB/VcH9NgqthP/KcF7g61ktKZerQlg0BbunX2XZ2wERAV7QT09rjaRwv70rgEdvA== X-Received: by 10.28.68.135 with SMTP id r129mr1065634wma.28.1507796265041; Thu, 12 Oct 2017 01:17:45 -0700 (PDT) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id 25sm16711227wrv.8.2017.10.12.01.17.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 12 Oct 2017 01:17:44 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 12 Oct 2017 10:17:11 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 11/16] pci: avoid over-complicated macro 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" Using a macro helps writing the code to the detriment of the reader in this case. This is backward. Write once, read many. The few LOCs gained is not worth the opacity of the implementation. Signed-off-by: Gaetan Rivet --- lib/librte_pci/rte_pci.c | 65 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/lib/librte_pci/rte_pci.c b/lib/librte_pci/rte_pci.c index 8584b55..cbb5359 100644 --- a/lib/librte_pci/rte_pci.c +++ b/lib/librte_pci/rte_pci.c @@ -53,36 +53,63 @@ #include "rte_pci.h" -/* Macro used by pci addr parsing functions. **/ -#define GET_PCIADDR_FIELD(in, fd, lim, dlm) \ -do { \ - unsigned long val; \ - char *end; \ - errno = 0; \ - val = strtoul((in), &end, 16); \ - if (errno != 0 || end[0] != (dlm) || val > (lim)) \ - return -EINVAL; \ - (fd) = (typeof (fd))val; \ - (in) = end + 1; \ -} while(0) +static inline const char * +get_u8_pciaddr_field(const char *in, void *_u8, char dlm) +{ + unsigned long val; + uint8_t *u8 = _u8; + char *end; + + errno = 0; + val = strtoul(in, &end, 16); + if (errno != 0 || end[0] != dlm || val > UINT8_MAX) { + errno = errno ? errno : EINVAL; + return NULL; + } + *u8 = (uint8_t)val; + return end + 1; +} int eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr) { + const char *in = input; + dev_addr->domain = 0; - GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':'); - GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.'); - GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0); + in = get_u8_pciaddr_field(in, &dev_addr->bus, ':'); + if (in == NULL) + return -EINVAL; + in = get_u8_pciaddr_field(in, &dev_addr->devid, '.'); + if (in == NULL) + return -EINVAL; + in = get_u8_pciaddr_field(in, &dev_addr->function, '\0'); + if (in == NULL) + return -EINVAL; return 0; } int eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr) { - GET_PCIADDR_FIELD(input, dev_addr->domain, UINT16_MAX, ':'); - GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':'); - GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.'); - GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0); + const char *in = input; + unsigned long val; + char *end; + + errno = 0; + val = strtoul(in, &end, 16); + if (errno != 0 || end[0] != ':' || val > UINT16_MAX) + return -EINVAL; + dev_addr->domain = (uint16_t)val; + in = end + 1; + in = get_u8_pciaddr_field(in, &dev_addr->bus, ':'); + if (in == NULL) + return -EINVAL; + in = get_u8_pciaddr_field(in, &dev_addr->devid, '.'); + if (in == NULL) + return -EINVAL; + in = get_u8_pciaddr_field(in, &dev_addr->function, '\0'); + if (in == NULL) + return -EINVAL; return 0; }