From patchwork Fri Dec 22 11:00:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 122642 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp2097886qgn; Fri, 22 Dec 2017 03:05:47 -0800 (PST) X-Google-Smtp-Source: ACJfBouFWrYK3hprKszagZ1gc4xSAlqLlqRbuivh3niQQD8Wn0y66aTwG4nLlSbwzKXnIvIxa8c9 X-Received: by 10.237.58.67 with SMTP id n61mr12909528qte.171.1513940747079; Fri, 22 Dec 2017 03:05:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513940747; cv=none; d=google.com; s=arc-20160816; b=bktvU+o6G2akzyF0lHJ3vVY8P7p6i7+9yTmtUkzH4gInV+eMdOtcGXHmgT7KSHjXxc 1Wgo+1tEWahrhSIFrq9LlwZOjsrrYyXBYEupOGwNV0O+y3AXSQIv4t/35Bz3VRQ7bot+ IyyIPZtQY+SdN+GxMEQ+tF9rFpPG/RZ2O9ifE0BStWEv8p8mnFqsZp4qsr8aprSDs6Mm BGcPfRb0aoFtvK4LgUadnkIEYcIVxZOGhQ2JP0KosKCfGY4NlkqU0HbqYioojbGxz6of i908JzjI9FRWSVclKZtCXecNceTxkkV0pyZxB/aBG0C0ZGe7UoxfXUUNH6r83jrOUvq2 iYLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=yAIz8M4VV9oRT1eeGlt9XB/3mwn6jqjNNVfi42kUk8k=; b=rBtYCV3mE4rM5jT1AopHFMDp2P7007yJbxe2P5iPCcaNIB94nSql8Ap/VYd67J8/Je ONtx70v9BlAcn6r3pOLpk5N0bipIBlczZscicizwgTlxhKVfpT46CYxf6DLCrwGCGTkq B5jaIf1gaifL5iXhHQIKYNGVEI8XVRzg0qjrJD55ltZOmdbcOm24UyXtCNAWnNKkIGV5 HYXBQGTucslqgFF0GRe3XKvo2zGUs5oMSI8maRdiEPwUrRu1e6OvhfHpT5liHIL4tMhi bBi4MbHl734y0FCVhb4M1gBLZ8QRX/ewTm0RqxLaKXRBcytV2JDuPN1tZFCGmBH49MR+ c+hQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id s5si2615050qta.132.2017.12.22.03.05.46; Fri, 22 Dec 2017 03:05:47 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id AE16D6175C; Fri, 22 Dec 2017 11:05:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2 autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id B8286616FA; Fri, 22 Dec 2017 11:00:47 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 4B6886151F; Fri, 22 Dec 2017 11:00:30 +0000 (UTC) Received: from forward102p.mail.yandex.net (forward102p.mail.yandex.net [77.88.28.102]) by lists.linaro.org (Postfix) with ESMTPS id 14E4060997 for ; Fri, 22 Dec 2017 11:00:20 +0000 (UTC) Received: from mxback7o.mail.yandex.net (mxback7o.mail.yandex.net [IPv6:2a02:6b8:0:1a2d::21]) by forward102p.mail.yandex.net (Yandex) with ESMTP id 296EB430377C for ; Fri, 22 Dec 2017 14:00:19 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback7o.mail.yandex.net (nwsmtp/Yandex) with ESMTP id HbxPAitDAK-0JtqBdPI; Fri, 22 Dec 2017 14:00:19 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id EWw1bAbGHJ-0I5GAeUZ; Fri, 22 Dec 2017 14:00:18 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Fri, 22 Dec 2017 14:00:14 +0300 Message-Id: <1513940417-8765-2-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> References: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 359 Subject: [lng-odp] [PATCH CATERPILLAR v3 1/4] linux-gen: add memory-mapped I/O access API X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Mykyta Iziumtsev Signed-off-by: Mykyta Iziumtsev --- /** Email created from pull request 359 (MykytaI:caterpillar_mdev_auxiliary) ** https://github.com/Linaro/odp/pull/359 ** Patch: https://github.com/Linaro/odp/pull/359.patch ** Base sha: 63fd88635cc10caaa02fdccd3f52c9494487bdd2 ** Merge commit sha: 236ad276c55ab617e42fb2b92f40afdb8c4bb1ee **/ include/odp/drv/spec/mmio.h | 145 +++++++++++++++++++++ platform/linux-generic/include/odp/drv/mmio.h | 179 ++++++++++++++++++++++++++ scripts/checkpatch.pl | 1 + 3 files changed, 325 insertions(+) create mode 100644 include/odp/drv/spec/mmio.h create mode 100644 platform/linux-generic/include/odp/drv/mmio.h diff --git a/include/odp/drv/spec/mmio.h b/include/odp/drv/spec/mmio.h new file mode 100644 index 000000000..35807637b --- /dev/null +++ b/include/odp/drv/spec/mmio.h @@ -0,0 +1,145 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * API to access memory-mapped I/O. + * + */ + +#ifndef ODPDRV_MMIO_H_ +#define ODPDRV_MMIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup odpdrv_mmio ODPDRV MMIO + * @{ + */ + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 8-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u8le_write(uint8_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 8-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u8be_write(uint8_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 16-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u16le_write(uint16_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 16-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u16be_write(uint16_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 32-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u32le_write(uint32_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 32-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u32be_write(uint32_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 64-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u64le_write(uint64_t value, volatile void *addr); + +/** + * Convert endianness and write value to MMIO + * @param value cpu native 64-bit value to write to MMIO + * @param addr MMIO address to write at + */ +void odpdrv_mmio_u64be_write(uint64_t value, volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 8-bit value + */ +uint8_t odpdrv_mmio_u8le_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 8-bit value + */ +uint8_t odpdrv_mmio_u8be_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 16-bit value + */ +uint16_t odpdrv_mmio_u16le_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 16-bit value + */ +uint16_t odpdrv_mmio_u16be_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 32-bit value + */ +uint32_t odpdrv_mmio_u32le_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 32-bit value + */ +uint32_t odpdrv_mmio_u32be_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 64-bit value + */ +uint64_t odpdrv_mmio_u64le_read(volatile void *addr); + +/** + * Read from MMIO and convert endianness + * @param addr MMIO address to read at + * @return cpu native 64-bit value + */ +uint64_t odpdrv_mmio_u64be_read(volatile void *addr); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/include/odp/drv/mmio.h b/platform/linux-generic/include/odp/drv/mmio.h new file mode 100644 index 000000000..4c4596abe --- /dev/null +++ b/platform/linux-generic/include/odp/drv/mmio.h @@ -0,0 +1,179 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * API to access memory-mapped I/O. + */ + +#ifndef ODPDRV_PLAT_MMIO_H_ +#define ODPDRV_PLAT_MMIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** @ingroup odpdrv_mmio ODPDRV MMIO + * @{ + */ + +/* for use with type checkers such as sparse */ +#ifdef __CHECKER__ +/** @internal MMIO attribute */ +#define __odpdrv_mmio __attribute__((noderef, address_space(2))) +#else +/** @internal MMIO attribute */ +#define __odpdrv_mmio +#endif + +#define odpdrv_io_mb() __asm__ __volatile__("" ::: "memory") +#define odpdrv_io_rmb() __asm__ __volatile__("" ::: "memory") +#define odpdrv_io_wmb() __asm__ __volatile__("" ::: "memory") + +static inline void +odpdrv_mmio_u8le_write(uint8_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile uint8_t *)addr = value; +} + +static inline void +odpdrv_mmio_u8be_write(uint8_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_mmio_u8le_write(value, addr); +} + +static inline void +odpdrv_mmio_u16le_write(uint16_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile odp_u16le_t *)addr = odp_cpu_to_le_16(value); +} + +static inline void +odpdrv_mmio_u16be_write(uint16_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile odp_u16be_t *)addr = odp_cpu_to_be_16(value); +} + +static inline void +odpdrv_mmio_u32le_write(uint32_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile odp_u32le_t *)addr = odp_cpu_to_le_32(value); +} + +static inline void +odpdrv_mmio_u32be_write(uint32_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile odp_u32be_t *)addr = odp_cpu_to_be_32(value); +} + +static inline void +odpdrv_mmio_u64le_write(uint64_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile odp_u64le_t *)addr = odp_cpu_to_le_64(value); +} + +static inline void +odpdrv_mmio_u64be_write(uint64_t value, volatile void __odpdrv_mmio *addr) +{ + odpdrv_io_wmb(); + *(__odp_force volatile odp_u64be_t *)addr = odp_cpu_to_be_64(value); +} + +static inline uint8_t +odpdrv_mmio_u8le_read(volatile void __odpdrv_mmio *addr) +{ + uint8_t value = *(__odp_force volatile uint8_t *)addr; + + odpdrv_io_rmb(); + return value; +} + +static inline uint8_t +odpdrv_mmio_u8be_read(volatile void __odpdrv_mmio *addr) +{ + return odpdrv_mmio_u8le_read(addr); +} + +static inline uint16_t +odpdrv_mmio_u16le_read(volatile void __odpdrv_mmio *addr) +{ + uint16_t value = + odp_le_to_cpu_16(*(__odp_force volatile odp_u16le_t *)addr); + + odpdrv_io_rmb(); + return value; +} + +static inline uint16_t +odpdrv_mmio_u16be_read(volatile void __odpdrv_mmio *addr) +{ + uint16_t value = + odp_be_to_cpu_16(*(__odp_force volatile odp_u16be_t *)addr); + + odpdrv_io_rmb(); + return value; +} + +static inline uint32_t +odpdrv_mmio_u32le_read(volatile void __odpdrv_mmio *addr) +{ + uint32_t value = + odp_le_to_cpu_32(*(__odp_force volatile odp_u32le_t *)addr); + + odpdrv_io_rmb(); + return value; +} + +static inline uint32_t +odpdrv_mmio_u32be_read(volatile void __odpdrv_mmio *addr) +{ + uint32_t value = + odp_be_to_cpu_32(*(__odp_force volatile odp_u32be_t *)addr); + + odpdrv_io_rmb(); + return value; +} + +static inline uint64_t +odpdrv_mmio_u64le_read(volatile void __odpdrv_mmio *addr) +{ + uint64_t value = + odp_le_to_cpu_64(*(__odp_force volatile odp_u64le_t *)addr); + + odpdrv_io_rmb(); + return value; +} + +static inline uint64_t +odpdrv_mmio_u64be_read(volatile void __odpdrv_mmio *addr) +{ + uint64_t value = + odp_be_to_cpu_64(*(__odp_force volatile odp_u64be_t *)addr); + + odpdrv_io_rmb(); + return value; +} + +/** + * @} + */ + +#include + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 16316b928..9c256e29a 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -257,6 +257,7 @@ sub hash_show_words { __kernel| __force| __iomem| + __odpdrv_mmio| __must_check| __init_refok| __kprobes| From patchwork Fri Dec 22 11:00:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 122644 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp2101517qgn; Fri, 22 Dec 2017 03:08:41 -0800 (PST) X-Google-Smtp-Source: ACJfBou5Lo0d53iYVHYbHbwLWVeu9vk4Pc2xINcc5EuLLpnIc//Tm7TfkdPwTw/pdIJurPAl5EKk X-Received: by 10.55.185.132 with SMTP id j126mr18877971qkf.275.1513940921437; Fri, 22 Dec 2017 03:08:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513940921; cv=none; d=google.com; s=arc-20160816; b=W9ZIR7naNN2KDeMoKIllNCErqDppWFnKvIIYookPUIZB+Kk1l8ot4zE6E/OUmbV2oW 83tQrgtwkxyrIajQupCDPUQeubO413ht6Cp3m2nUB+yvRmTupkC8Yli3X+z688qGKR4C 2pU9mfNX00KOvR+Qg5V41+4oCTsWRl11u4qdjyiwzdu4VadIcA0yDWKZUBnVQ+YW4LwY ZzRlVm8qa3sPLf2i2gp9TbDoMkAPkFywZFQf7FxAciq4wzrutLW7tQ4qLpw9s67NDSX+ GlRtiItlDb0F0fxGmo2FCK1W/8w5wYC1NlO2OlX1jf0NAewZqFWT8hGqLJX4IIG4At9D XOaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=6mUfz7kUZ0z1olsbnPE3rMI2BrjCA7n8OebdLBder9E=; b=oUjDpvltcYIMbb8HA1KqN/s67kgHJvQJRqNb30sDHgw8tSIIxJvNmwTTjKvs7l7HR8 LC8TxKKXRAfjWlNhdu6K6A48C4rtDOQcxgZOong3AbdthbW/yWf9MLJNI7rYdj6Ob4Qq a60o8NffHSoB0rzzGwVZZQID4k39/uQYOusZidmytQIAUlqQMPS9ddJuvqv4txQppDfP Fdnc1kl8nVWCSIeVadYxd9YngheoS2onctQPK6bI9WZmAFRlrDDUKnwUpPdHor2u2TxC 5WLwh/B21nQ1CPos4ya0I5q6pT5mIU5aoKffvQZcLoHTrmnBsMCvF4LCameKzDPiUewB egQA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id y126si320744qkc.333.2017.12.22.03.08.41; Fri, 22 Dec 2017 03:08:41 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 195EE61767; Fri, 22 Dec 2017 11:08:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id C9EC46171A; Fri, 22 Dec 2017 11:01:43 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 9330161508; Fri, 22 Dec 2017 11:01:33 +0000 (UTC) Received: from forward106j.mail.yandex.net (forward106j.mail.yandex.net [5.45.198.249]) by lists.linaro.org (Postfix) with ESMTPS id 37CBE6150D for ; Fri, 22 Dec 2017 11:00:21 +0000 (UTC) Received: from mxback7o.mail.yandex.net (mxback7o.mail.yandex.net [IPv6:2a02:6b8:0:1a2d::21]) by forward106j.mail.yandex.net (Yandex) with ESMTP id C6C091804103 for ; Fri, 22 Dec 2017 14:00:19 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback7o.mail.yandex.net (nwsmtp/Yandex) with ESMTP id toVc4Oj8PC-0JtqaNb6; Fri, 22 Dec 2017 14:00:19 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id EWw1bAbGHJ-0J5S3D0Q; Fri, 22 Dec 2017 14:00:19 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Fri, 22 Dec 2017 14:00:15 +0300 Message-Id: <1513940417-8765-3-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> References: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 359 Subject: [lng-odp] [PATCH CATERPILLAR v3 2/4] linux-gen: extend ethtool helper functions X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Mykyta Iziumtsev Add helper function to query RX/TX queue lengths on network interface to facilitate upcoming native and mediated device drivers. Signed-off-by: Mykyta Iziumtsev --- /** Email created from pull request 359 (MykytaI:caterpillar_mdev_auxiliary) ** https://github.com/Linaro/odp/pull/359 ** Patch: https://github.com/Linaro/odp/pull/359.patch ** Base sha: 63fd88635cc10caaa02fdccd3f52c9494487bdd2 ** Merge commit sha: 236ad276c55ab617e42fb2b92f40afdb8c4bb1ee **/ platform/linux-generic/pktio/ethtool.c | 19 +++++++++++++++++-- platform/linux-generic/pktio/ethtool.h | 27 +++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/platform/linux-generic/pktio/ethtool.c b/platform/linux-generic/pktio/ethtool.c index b71666a32..119ad75a4 100644 --- a/platform/linux-generic/pktio/ethtool.c +++ b/platform/linux-generic/pktio/ethtool.c @@ -159,12 +159,27 @@ static int ethtool_stats(int fd, struct ifreq *ifr, odp_pktio_stats_t *stats) return 0; } -int ethtool_stats_get_fd(int fd, const char *name, odp_pktio_stats_t *stats) +int ethtool_stats_get_fd(int fd, const char *netif_name, + odp_pktio_stats_t *stats) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", netif_name); return ethtool_stats(fd, &ifr, stats); } + +int ethtool_ringparam_get_fd(int fd, const char *netif_name, + struct ethtool_ringparam *param) +{ + struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", netif_name); + + param->cmd = ETHTOOL_GRINGPARAM; + ifr.ifr_data = (void *)param; + + return ioctl(fd, SIOCETHTOOL, &ifr); +} diff --git a/platform/linux-generic/pktio/ethtool.h b/platform/linux-generic/pktio/ethtool.h index c5a811238..c330c2e31 100644 --- a/platform/linux-generic/pktio/ethtool.h +++ b/platform/linux-generic/pktio/ethtool.h @@ -7,9 +7,32 @@ #ifndef ODP_PKTIO_ETHTOOL_H_ #define ODP_PKTIO_ETHTOOL_H_ +#include + +/** + * Get statistics for a network interface + * + * @param fd Arbitrary socket file descriptor + * @param netif_name Network interface name + * @param stats[out] Output buffer for counters + * + * @retval 0 on success + * @retval != 0 on failure + */ +int ethtool_stats_get_fd(int fd, const char *netif_name, + odp_pktio_stats_t *stats); + /** - * Get ethtool statistics of a packet socket + * Get RX/TX queue parameters for a network interface + * + * @param fd Arbitrary socket file descriptor + * @param netif_name Network interface name + * @param param[out] Output buffer for parameters + * + * @retval 0 on success + * @retval != 0 on failure */ -int ethtool_stats_get_fd(int fd, const char *name, odp_pktio_stats_t *stats); +int ethtool_ringparam_get_fd(int fd, const char *netif_name, + struct ethtool_ringparam *param); #endif /*ODP_PKTIO_ETHTOOL_H_*/ From patchwork Fri Dec 22 11:00:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 122643 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp2100185qgn; Fri, 22 Dec 2017 03:07:50 -0800 (PST) X-Google-Smtp-Source: ACJfBou7LltHiY8nu9koXQFQVeJwnbdNqEpGH8kI2sUyJ01KdUafWYyHEPYJtKnZ7pRZIUx+Nhcq X-Received: by 10.200.35.215 with SMTP id r23mr18160999qtr.174.1513940869923; Fri, 22 Dec 2017 03:07:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513940869; cv=none; d=google.com; s=arc-20160816; b=wnw31W25oWtHLcv85KNMwBi7CNxdpgIEfj9sWnKj5gYowoYV0UuEviOM8oiV8xJITc eG6E/7CGi9Th7QuL6yQETv8ufkNe1tXDc8qB/dXe97tYnmcXznHZn+Ni0HXRljKzauh5 P9uHuSLeW/yfKuljAGfY2fLPGlHJ7epwKAKe44bslk9rBkFN5I4UzW+pIfh5ST1+hLZw nY91381JZ93FBtf6AdYdNhZB7uIgdmZcfGjOXynLlJfjDuDCtl1beAVaYbun7NTJ8zg9 0urqlaV0L/0IzwEz6TqhKlDBankvQDXm5zeqqS4+HizlBaXOMnSY6+4NuLcuefd76+ND sh7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=6zkTXCEjXOj/7LiZWarFGVllbQHBdhRQLiB4jKL568Q=; b=K9sMTZRrEDOdS3HObL81lZyapfyPyKmpwh/GWKhcS8iZht2sPxEeQsBsYYvp3GEQGz oOaXyY3XM5rt5RwZI3ICgjhIGA3piHhyGqvYIoe9IG2GS/MRbaXdJFXkJacfSQ5YWOvq hz5cBHLOz8OFdgeGuZvpw+IozMl9IRBe0UHLlwFv9gGEoC64NN5yjzgpGicDlTVKQ2YM w+a4dZQVAG0QFd/F837lZ8mIQ0bv1r/1chip1ZzpnDj33z1VNKz2O9jLON1hR25AkRr1 jbdiXYVYpDw1wH76EAdXiz6RO6y5yD955Z+geMnvgnf2iBJYmllRTd3C8FACDkwCVHti 3kkw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id p186si203157qkf.474.2017.12.22.03.07.49; Fri, 22 Dec 2017 03:07:49 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 800EF61769; Fri, 22 Dec 2017 11:07:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 81B6B61508; Fri, 22 Dec 2017 11:01:39 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 4C2CA6171A; Fri, 22 Dec 2017 11:01:33 +0000 (UTC) Received: from forward106p.mail.yandex.net (forward106p.mail.yandex.net [77.88.28.109]) by lists.linaro.org (Postfix) with ESMTPS id 0217460958 for ; Fri, 22 Dec 2017 11:00:22 +0000 (UTC) Received: from mxback20j.mail.yandex.net (mxback20j.mail.yandex.net [IPv6:2a02:6b8:0:1619::114]) by forward106p.mail.yandex.net (Yandex) with ESMTP id 88B012D8488F for ; Fri, 22 Dec 2017 14:00:20 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback20j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id tnfFtFUyub-0KWij9Ud; Fri, 22 Dec 2017 14:00:20 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id EWw1bAbGHJ-0J5WcbDM; Fri, 22 Dec 2017 14:00:19 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Fri, 22 Dec 2017 14:00:16 +0300 Message-Id: <1513940417-8765-4-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> References: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 359 Subject: [lng-odp] [PATCH CATERPILLAR v3 3/4] linux-gen: extend sysfs parsing helper functions X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Mykyta Iziumtsev Added char* and uint64_t sysfs attribute read functions to support upcoming native and mediated device drivers. Updated sysfs_netif_stats() to take interface name as argument instead of pktio_entry, because pktio_entry->s.name is not necessarily recognisable Linux network interface name. Signed-off-by: Mykyta Iziumtsev --- /** Email created from pull request 359 (MykytaI:caterpillar_mdev_auxiliary) ** https://github.com/Linaro/odp/pull/359 ** Patch: https://github.com/Linaro/odp/pull/359.patch ** Base sha: 63fd88635cc10caaa02fdccd3f52c9494487bdd2 ** Merge commit sha: 236ad276c55ab617e42fb2b92f40afdb8c4bb1ee **/ platform/linux-generic/pktio/common.c | 4 +- platform/linux-generic/pktio/socket.c | 2 +- platform/linux-generic/pktio/socket_mmap.c | 2 +- platform/linux-generic/pktio/sysfs.c | 162 ++++++++++++++++++++++------- platform/linux-generic/pktio/sysfs.h | 33 +++++- 5 files changed, 155 insertions(+), 48 deletions(-) diff --git a/platform/linux-generic/pktio/common.c b/platform/linux-generic/pktio/common.c index 900dcbba2..e6eb09900 100644 --- a/platform/linux-generic/pktio/common.c +++ b/platform/linux-generic/pktio/common.c @@ -45,7 +45,7 @@ int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd) pktio_entry->s.name, &cur_stats); } else if (pktio_entry->s.stats_type == STATS_SYSFS) { - err = sysfs_stats(pktio_entry, &cur_stats); + err = sysfs_netif_stats(pktio_entry->s.name, &cur_stats); if (err != 0) ODP_ERR("stats error\n"); } @@ -78,7 +78,7 @@ int sock_stats_fd(pktio_entry_t *pktio_entry, pktio_entry->s.name, &cur_stats); } else if (pktio_entry->s.stats_type == STATS_SYSFS) { - sysfs_stats(pktio_entry, &cur_stats); + sysfs_netif_stats(pktio_entry->s.name, &cur_stats); } stats->in_octets = cur_stats.in_octets - diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 7e0485b99..320de973c 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -204,7 +204,7 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev, pktio_entry->s.name, &cur_stats); if (err != 0) { - err = sysfs_stats(pktio_entry, &cur_stats); + err = sysfs_netif_stats(pktio_entry->s.name, &cur_stats); if (err != 0) { pktio_entry->s.stats_type = STATS_UNSUPPORTED; ODP_DBG("pktio: %s unsupported stats\n", diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index 271c2f0f7..26d0a2957 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -593,7 +593,7 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry->s.name, &cur_stats); if (ret != 0) { - ret = sysfs_stats(pktio_entry, &cur_stats); + ret = sysfs_netif_stats(pktio_entry->s.name, &cur_stats); if (ret != 0) { pktio_entry->s.stats_type = STATS_UNSUPPORTED; ODP_DBG("pktio: %s unsupported stats\n", diff --git a/platform/linux-generic/pktio/sysfs.c b/platform/linux-generic/pktio/sysfs.c index f674ac42c..8bd7d4fb0 100644 --- a/platform/linux-generic/pktio/sysfs.c +++ b/platform/linux-generic/pktio/sysfs.c @@ -7,74 +7,158 @@ #include "config.h" #include -#include +#include #include + #include #include #include +#include +#include +#include -static int sysfs_get_val(const char *fname, uint64_t *val) +ODP_PRINTF_FORMAT(3, 0) +static int _sysfs_attr_raw_get(char *buf, size_t buf_size, const char *fmt, + va_list args) { - FILE *file; - char str[128]; - int ret = -1; + char path[256]; + FILE *file; + int ret; - file = fopen(fname, "rt"); - if (file == NULL) { + ret = vsnprintf(path, sizeof(path), fmt, args); + + if (ret < 0) { __odp_errno = errno; - /* do not print debug err if sysfs is not supported by - * kernel driver. - */ - if (errno != ENOENT) - ODP_ERR("fopen %s: %s\n", fname, strerror(errno)); - return 0; + return -1; + } + + if (ret >= (ssize_t)sizeof(path)) { + __odp_errno = EINVAL; + return -1; } - if (fgets(str, sizeof(str), file) != NULL) - ret = sscanf(str, "%" SCNx64, val); + file = fopen(path, "rt"); + if (file == NULL) { + __odp_errno = errno; + return -1; + } + buf = fgets(buf, buf_size, file); (void)fclose(file); - if (ret != 1) { - ODP_ERR("read %s\n", fname); + if (buf == NULL) { + __odp_errno = errno; return -1; } return 0; } -int sysfs_stats(pktio_entry_t *pktio_entry, - odp_pktio_stats_t *stats) +ODP_PRINTF_FORMAT(3, 4) +int sysfs_attr_raw_get(char *buf, size_t buf_size, const char *fmt, ...) { - char fname[256]; - const char *dev = pktio_entry->s.name; - int ret = 0; + va_list args; + int ret; - sprintf(fname, "/sys/class/net/%s/statistics/rx_bytes", dev); - ret -= sysfs_get_val(fname, &stats->in_octets); + va_start(args, fmt); + ret = _sysfs_attr_raw_get(buf, buf_size, fmt, args); + va_end(args); - sprintf(fname, "/sys/class/net/%s/statistics/rx_packets", dev); - ret -= sysfs_get_val(fname, &stats->in_ucast_pkts); + return ret; +} + +ODP_PRINTF_FORMAT(2, 3) +int sysfs_attr_u64_get(uint64_t *value, const char *fmt, ...) +{ + char buf[20 + 1 + 1]; /* 20 digits (UINT64_MAX) + '\n' + '\0' */ + va_list args; + char *endptr; + int ret; - sprintf(fname, "/sys/class/net/%s/statistics/rx_droppped", dev); - ret -= sysfs_get_val(fname, &stats->in_discards); + va_start(args, fmt); + ret = _sysfs_attr_raw_get(buf, sizeof(buf), fmt, args); + va_end(args); - sprintf(fname, "/sys/class/net/%s/statistics/rx_errors", dev); - ret -= sysfs_get_val(fname, &stats->in_errors); + if (ret < 0) + return -1; + + if (buf[0] == '\0') { + __odp_errno = EINVAL; + return -1; + } + + *value = strtoull(buf, &endptr, 0); + + /* It is OK to have '\n' in sysfs */ + if (*endptr == '\n') + endptr++; + + if (*endptr != '\0') { + __odp_errno = EINVAL; + return -1; + } + + return 0; +} + +int sysfs_netif_stats(const char *netif_name, odp_pktio_stats_t *stats) +{ + int ret; + + /* + * Do not print debug err if sysfs is not supported by + * kernel driver. + */ + + ret = sysfs_attr_u64_get(&stats->in_octets, + "/sys/class/net/%s/statistics/rx_bytes", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; + + ret = sysfs_attr_u64_get(&stats->in_ucast_pkts, + "/sys/class/net/%s/statistics/rx_packets", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; + + ret = sysfs_attr_u64_get(&stats->in_discards, + "/sys/class/net/%s/statistics/rx_droppped", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; + + ret = sysfs_attr_u64_get(&stats->in_errors, + "/sys/class/net/%s/statistics/rx_errors", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; /* stats->in_unknown_protos is not supported in sysfs */ - sprintf(fname, "/sys/class/net/%s/statistics/tx_bytes", dev); - ret -= sysfs_get_val(fname, &stats->out_octets); + ret = sysfs_attr_u64_get(&stats->out_octets, + "/sys/class/net/%s/statistics/tx_bytes", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; - sprintf(fname, "/sys/class/net/%s/statistics/tx_packets", dev); - ret -= sysfs_get_val(fname, &stats->out_ucast_pkts); + ret = sysfs_attr_u64_get(&stats->out_ucast_pkts, + "/sys/class/net/%s/statistics/tx_packets", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; - sprintf(fname, "/sys/class/net/%s/statistics/tx_dropped", dev); - ret -= sysfs_get_val(fname, &stats->out_discards); + ret = sysfs_attr_u64_get(&stats->out_discards, + "/sys/class/net/%s/statistics/tx_dropped", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; - sprintf(fname, "/sys/class/net/%s/statistics/tx_errors", dev); - ret -= sysfs_get_val(fname, &stats->out_errors); + ret = sysfs_attr_u64_get(&stats->out_errors, + "/sys/class/net/%s/statistics/tx_errors", + netif_name); + if (ret < 0 && __odp_errno != ENOENT) + return -1; - return ret; + return 0; } diff --git a/platform/linux-generic/pktio/sysfs.h b/platform/linux-generic/pktio/sysfs.h index f8fe3072a..71ac4726f 100644 --- a/platform/linux-generic/pktio/sysfs.h +++ b/platform/linux-generic/pktio/sysfs.h @@ -8,16 +8,39 @@ #define ODP_PKTIO_SYSFS_H_ /** - * Get statistics for a pktio entry + * Read an attribute from /sysfs as raw string * - * @param pktio_entry Packet IO entry - * @param stats[out] Output buffer for counters + * @param buf[out] Attribute value + * @param buf_size Maximum number of bytes to read (including '\0') + * @param fmt printf-like path to the attribute + * + * @retval 0 on success, buf[] is guaranteed to be '\0'-terminated + * @retval != 0 on failure + */ +ODP_PRINTF_FORMAT(3, 4) +int sysfs_attr_raw_get(char *buf, size_t buf_size, const char *fmt, ...); + +/** + * Read an attribute from /sysfs as uint64_t + * + * @param value[out] Attribute value + * @param fmt printf-like path to the attribute * * @retval 0 on success * @retval != 0 on failure */ +ODP_PRINTF_FORMAT(2, 3) +int sysfs_attr_u64_get(uint64_t *value, const char *fmt, ...); -int sysfs_stats(pktio_entry_t *pktio_entry, - odp_pktio_stats_t *stats); +/** + * Get statistics for a network interface + * + * @param netif_name Network interface name + * @param stats[out] Output buffer for counters + * + * @retval 0 on success + * @retval != 0 on failure + */ +int sysfs_netif_stats(const char *netif_name, odp_pktio_stats_t *stats); #endif /* ODP_PKTIO_SYSFS_H_ */ From patchwork Fri Dec 22 11:00:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 122645 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp2102528qgn; Fri, 22 Dec 2017 03:09:27 -0800 (PST) X-Google-Smtp-Source: ACJfBouq7kjIVS7GRY50yuUnMIVnVNXYOJySKurmNzbi59ky+QVRX4eaC4BShkxP36Ci3oUBxbh9 X-Received: by 10.233.232.208 with SMTP id a199mr19132843qkg.264.1513940967033; Fri, 22 Dec 2017 03:09:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513940967; cv=none; d=google.com; s=arc-20160816; b=boy4R/7SZ6ssrW7t2jft3Jx/PASbNUraypca0awFu0+ysh4I0FAy5uyKHTdhrKOUlB eDuB7LNEKfelW8KGO2REWbvb5f98eFn9nojSm3sup9W2amdBux5RWbMY7XUNkz/4mwjJ qe7N5iAj1nHuZpdJ9hX4+URyiazwqm8JuJ1ecqiA7je7TpHEQIIojCkbHECpKg7yTXFs eJJ6XxP0E/y7XJW9mqA2hgdEG5gl3b+1m2nneL28WKrpI3BzEEaaW0XX6c5NB8kc7yMH xRX87m+3+uymt6C9LJr3oHmJ21Qxt16en3lAM4Uk1wzMLqbt/WtXRzwigeH+iFo6+CZl FzzQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=9Z4ty11d9PrD6rCtkShgVy8UUT+RbCenzKv7rryjDF8=; b=bDauRuyxV7+K0lB98aPug8jHXAX44/JL6k4xebRUQVtyq82Ii0wNVd8cMXRD3wxwop E5P1FcvzhwU5TXPgNStfzIIHN8+xF60e+J3fNvCRucJD9G0ol+g1HflrqEtJ5x4fB2KO KyQ/YnK3KVY8mH80dj8KcaTOFMWe9V17BOvANNDJ3j8VYni0Av43ip8qrHR0TlkCnnIr PyaOoDdkZSprmYvFf2g6nWJSYH2S1VH0gaN+QMAMPftnf7GK/m4AMxy5EiUjow3YJNBa q0AVfwKVCntbzU4kffT5ubItdasAVwi1/MU64QxgeYEHJsEtRYjLShd/2aa1mcpTM4iP 2AkA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id w16si13194126qtw.247.2017.12.22.03.09.26; Fri, 22 Dec 2017 03:09:27 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id AD9BA61722; Fri, 22 Dec 2017 11:09:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2 autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 16D3D61726; Fri, 22 Dec 2017 11:01:51 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id C27586150D; Fri, 22 Dec 2017 11:01:36 +0000 (UTC) Received: from forward100j.mail.yandex.net (forward100j.mail.yandex.net [5.45.198.240]) by lists.linaro.org (Postfix) with ESMTPS id 688F76150F for ; Fri, 22 Dec 2017 11:00:22 +0000 (UTC) Received: from mxback10g.mail.yandex.net (mxback10g.mail.yandex.net [IPv6:2a02:6b8:0:1472:2741:0:8b7:171]) by forward100j.mail.yandex.net (Yandex) with ESMTP id 375DD5D83EB8 for ; Fri, 22 Dec 2017 14:00:21 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback10g.mail.yandex.net (nwsmtp/Yandex) with ESMTP id m19N533Y1o-0LxGBfPS; Fri, 22 Dec 2017 14:00:21 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id EWw1bAbGHJ-0K5SR8jN; Fri, 22 Dec 2017 14:00:20 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Fri, 22 Dec 2017 14:00:17 +0300 Message-Id: <1513940417-8765-5-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> References: <1513940417-8765-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 359 Subject: [lng-odp] [PATCH CATERPILLAR v3 4/4] linux-gen: move common macros to odp_internal.h X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Mykyta Iziumtsev Gather macros needed for upcoming mediated devices in one location. Fix signed vs. unsigned comparisons caused by incorrect MIN / MAX usage. Signed-off-by: Mykyta Iziumtsev --- /** Email created from pull request 359 (MykytaI:caterpillar_mdev_auxiliary) ** https://github.com/Linaro/odp/pull/359 ** Patch: https://github.com/Linaro/odp/pull/359.patch ** Base sha: 63fd88635cc10caaa02fdccd3f52c9494487bdd2 ** Merge commit sha: 236ad276c55ab617e42fb2b92f40afdb8c4bb1ee **/ .../linux-generic/include/odp_bitmap_internal.h | 4 +--- platform/linux-generic/include/odp_internal.h | 27 ++++++++++++++++++++++ .../include/odp_traffic_mngr_internal.h | 3 --- platform/linux-generic/odp_name_table.c | 15 ++++++------ platform/linux-generic/odp_pkt_queue.c | 8 +++---- platform/linux-generic/odp_timer_wheel.c | 2 +- platform/linux-generic/odp_traffic_mngr.c | 12 ++++++---- platform/linux-generic/queue/scalable.c | 7 ------ platform/linux-generic/schedule/scalable.c | 4 ---- 9 files changed, 46 insertions(+), 36 deletions(-) diff --git a/platform/linux-generic/include/odp_bitmap_internal.h b/platform/linux-generic/include/odp_bitmap_internal.h index 1be4d0287..dd8429037 100644 --- a/platform/linux-generic/include/odp_bitmap_internal.h +++ b/platform/linux-generic/include/odp_bitmap_internal.h @@ -21,14 +21,12 @@ extern "C" { #include #include #include +#include /* Generate unique identifier for instantiated class */ #define TOKENIZE(template, line) \ template ## _ ## line ## _ ## __COUNTER__ -/* Array size in general */ -#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) - #define BITS_PER_BYTE (8) #define BITS_PER_LONG __WORDSIZE #define BYTES_PER_LONG (BITS_PER_LONG / BITS_PER_BYTE) diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h index 6811d8d0a..020a90317 100644 --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@ -161,6 +161,33 @@ uint64_t odp_cpu_hz_current(int id); uint64_t odp_cpu_arch_hz_current(int id); void sys_info_print_arch(void); +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#define MIN(a, b) \ + ({ \ + __typeof__(a) tmp_a = (a); \ + __typeof__(b) tmp_b = (b); \ + tmp_a < tmp_b ? tmp_a : tmp_b; \ + }) +#define MAX(a, b) \ + ({ \ + __typeof__(a) tmp_a = (a); \ + __typeof__(b) tmp_b = (b); \ + tmp_a > tmp_b ? tmp_a : tmp_b; \ + }) + +#define odp_container_of(pointer, type, member) \ + ((type *)((char *)(pointer) - offsetof(type, member))) + +#define DIV_ROUND_UP(a, b) \ + ({ \ + __typeof__(a) tmp_a = (a); \ + __typeof__(b) tmp_b = (b); \ + ODP_STATIC_ASSERT(__builtin_constant_p(b), ""); \ + ODP_STATIC_ASSERT((((b) - 1) & (b)) == 0, ""); \ + (tmp_a + tmp_b - 1) >> __builtin_ctz(tmp_b); \ + }) + #ifdef __cplusplus } #endif diff --git a/platform/linux-generic/include/odp_traffic_mngr_internal.h b/platform/linux-generic/include/odp_traffic_mngr_internal.h index e8254f5ed..2d1fc5493 100644 --- a/platform/linux-generic/include/odp_traffic_mngr_internal.h +++ b/platform/linux-generic/include/odp_traffic_mngr_internal.h @@ -34,9 +34,6 @@ extern "C" { typedef struct stat file_stat_t; -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - #define INPUT_WORK_RING_SIZE (16 * 1024) #define TM_QUEUE_MAGIC_NUM 0xBABEBABE diff --git a/platform/linux-generic/odp_name_table.c b/platform/linux-generic/odp_name_table.c index 3ff46b347..e2a0401b2 100644 --- a/platform/linux-generic/odp_name_table.c +++ b/platform/linux-generic/odp_name_table.c @@ -14,9 +14,7 @@ #include #include #include - -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#include /* The following constants define some tunable parameters of this module. * They are set to fairly reasonable values (perhaps somewhat biased toward @@ -298,7 +296,7 @@ static int new_name_tbl_add(void) name_tbls_idx = name_tbls.num_name_tbls; num_entries = INITIAL_NAME_TBL_SIZE << name_tbls_idx; new_name_tbl = name_tbl_alloc(name_tbls_idx, num_entries); - name_tbl_free_list_add(new_name_tbl, MIN(num_entries, 256)); + name_tbl_free_list_add(new_name_tbl, MIN(num_entries, UINT32_C(256))); name_tbls.tbls[name_tbls_idx] = new_name_tbl; name_tbls.avail_space_bit_mask |= 1 << name_tbls_idx; @@ -387,7 +385,7 @@ static hash_tbl_entry_t make_hash_tbl_entry(name_tbl_entry_t *name_tbl_entry, hash_tbl_entry_t hash_tbl_entry; uint32_t new_entry_cnt; - new_entry_cnt = MIN(entry_cnt + 1, 0x3F); + new_entry_cnt = MIN(entry_cnt + 1, UINT32_C(0x3F)); hash_tbl_entry = (hash_tbl_entry_t)(uintptr_t)name_tbl_entry; hash_tbl_entry &= ~0x3F; hash_tbl_entry |= new_entry_cnt; @@ -1006,7 +1004,7 @@ static uint32_t level2_hash_histo(secondary_hash_tbl_t *hash_tbl, collisions = linked_list_len(name_tbl_entry); } - level2_histo[MIN(collisions, 256)]++; + level2_histo[MIN(collisions, UINT32_C(256))]++; total_collisions += collisions; } @@ -1038,7 +1036,7 @@ static uint32_t level1_hash_histo(secondary_hash_tbl_t *hash_tbl, level2_histo); } - level1_histo[MIN(collisions, 256)]++; + level1_histo[MIN(collisions, UINT32_C(256))]++; total_collisions += collisions; } @@ -1147,7 +1145,8 @@ void _odp_int_name_tbl_stats_print(void) memset(primary_hash_histo, 0, sizeof(primary_hash_histo)); for (idx = 0; idx < PRIMARY_HASH_TBL_SIZE; idx++) { - collisions = MIN(name_hash_tbl.hash_collisions[idx], 256); + collisions = + MIN(name_hash_tbl.hash_collisions[idx], UINT32_C(256)); primary_hash_histo[collisions]++; } diff --git a/platform/linux-generic/odp_pkt_queue.c b/platform/linux-generic/odp_pkt_queue.c index 4f6a1eb61..502203b76 100644 --- a/platform/linux-generic/odp_pkt_queue.c +++ b/platform/linux-generic/odp_pkt_queue.c @@ -16,9 +16,7 @@ #include #include #include - -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#include #define NUM_PKTS 7 @@ -229,7 +227,7 @@ _odp_int_queue_pool_t _odp_queue_pool_create(uint32_t max_num_queues, /* Initialize the queue_blk_tbl_sizes array based upon the * max_queued_pkts. */ - max_queued_pkts = MAX(max_queued_pkts, 64 * 1024); + max_queued_pkts = MAX(max_queued_pkts, 64 * UINT32_C(1024)); queue_region_desc_init(pool, 0, max_queued_pkts / 4); queue_region_desc_init(pool, 1, max_queued_pkts / 64); queue_region_desc_init(pool, 2, max_queued_pkts / 64); @@ -241,7 +239,7 @@ _odp_int_queue_pool_t _odp_queue_pool_create(uint32_t max_num_queues, /* Now allocate the first queue_blk_tbl and add its blks to the free * list. Replenish the queue_blk_t free list. */ - initial_free_list_size = MIN(64 * 1024, max_queued_pkts / 4); + initial_free_list_size = MIN(64 * UINT32_C(1024), max_queued_pkts / 4); rc = pkt_queue_free_list_add(pool, initial_free_list_size); if (rc < 0) { free(pool->queue_num_tbl); diff --git a/platform/linux-generic/odp_timer_wheel.c b/platform/linux-generic/odp_timer_wheel.c index b37d269bd..9b1e53832 100644 --- a/platform/linux-generic/odp_timer_wheel.c +++ b/platform/linux-generic/odp_timer_wheel.c @@ -627,7 +627,7 @@ static int timer_current_wheel_update(timer_wheels_t *timer_wheels, slot_idx = wheel_desc->slot_idx; num_slots = wheel_desc->num_slots; max_ticks = wheel_desc->max_ticks; - max_cnt = (uint32_t)MIN(elapsed_ticks, 32); + max_cnt = MIN(elapsed_ticks, UINT32_C(32)); current_wheel = timer_wheels->current_wheel; ret_code = 0; rc = -1; diff --git a/platform/linux-generic/odp_traffic_mngr.c b/platform/linux-generic/odp_traffic_mngr.c index ab06b3c0d..20af537fa 100644 --- a/platform/linux-generic/odp_traffic_mngr.c +++ b/platform/linux-generic/odp_traffic_mngr.c @@ -729,7 +729,8 @@ static uint64_t time_till_not_red(tm_shaper_params_t *shaper_params, commit_delay = (-shaper_obj->commit_cnt) / shaper_params->commit_rate; - min_time_delay = MAX(shaper_obj->shaper_params->min_time_delta, 256); + min_time_delay = + MAX(shaper_obj->shaper_params->min_time_delta, UINT64_C(256)); commit_delay = MAX(commit_delay, min_time_delay); if (shaper_params->peak_rate == 0) return commit_delay; @@ -1668,7 +1669,7 @@ static odp_tm_percent_t tm_queue_fullness(tm_wred_params_t *wred_params, return 0; fullness = (10000 * current_cnt) / max_cnt; - return (odp_tm_percent_t)MIN(fullness, 50000); + return (odp_tm_percent_t)MIN(fullness, UINT64_C(50000)); } static odp_bool_t tm_local_random_drop(tm_system_t *tm_system, @@ -2499,7 +2500,7 @@ static void tm_system_capabilities_set(odp_tm_capabilities_t *cap_ptr, memset(cap_ptr, 0, sizeof(odp_tm_capabilities_t)); max_queues = MIN(req_ptr->max_tm_queues, - ODP_TM_MAX_NUM_TM_NODES); + (uint32_t)ODP_TM_MAX_NUM_TM_NODES); shaper_supported = req_ptr->tm_queue_shaper_needed; wred_supported = req_ptr->tm_queue_wred_needed; dual_slope = req_ptr->tm_queue_dual_slope_needed; @@ -2523,8 +2524,9 @@ static void tm_system_capabilities_set(odp_tm_capabilities_t *cap_ptr, per_level_req = &req_ptr->per_level[level_idx]; max_nodes = MIN(per_level_req->max_num_tm_nodes, - ODP_TM_MAX_NUM_TM_NODES); - max_fanin = MIN(per_level_req->max_fanin_per_node, 1024); + (uint32_t)ODP_TM_MAX_NUM_TM_NODES); + max_fanin = MIN(per_level_req->max_fanin_per_node, + UINT32_C(1024)); max_priority = MIN(per_level_req->max_priority, ODP_TM_MAX_PRIORITIES - 1); min_weight = MAX(per_level_req->min_weight, diff --git a/platform/linux-generic/queue/scalable.c b/platform/linux-generic/queue/scalable.c index f4f5efb85..566d75bd3 100644 --- a/platform/linux-generic/queue/scalable.c +++ b/platform/linux-generic/queue/scalable.c @@ -33,13 +33,6 @@ #define NUM_INTERNAL_QUEUES 64 -#define MIN(a, b) \ - ({ \ - __typeof__(a) tmp_a = (a); \ - __typeof__(b) tmp_b = (b); \ - tmp_a < tmp_b ? tmp_a : tmp_b; \ - }) - #define LOCK(a) _odp_ticketlock_lock(a) #define UNLOCK(a) _odp_ticketlock_unlock(a) #define LOCK_INIT(a) odp_ticketlock_init(a) diff --git a/platform/linux-generic/schedule/scalable.c b/platform/linux-generic/schedule/scalable.c index de9c65285..3940e6f0a 100644 --- a/platform/linux-generic/schedule/scalable.c +++ b/platform/linux-generic/schedule/scalable.c @@ -145,10 +145,6 @@ static void remove_schedq_from_list(sched_scalable_thread_state_t *ts, /******************************************************************************* * Scheduler queues ******************************************************************************/ -#ifndef odp_container_of -#define odp_container_of(pointer, type, member) \ - ((type *)(void *)(((char *)pointer) - offsetof(type, member))) -#endif static inline void schedq_init(sched_queue_t *schedq, uint32_t prio) {