* [RFC PATCH net-next v3 11/21] ethtool: provide driver/device information in GET_INFO request
From: Michal Kubecek @ 2019-02-18 18:22 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Implement GET_INFO request to get basic driver and device information as
provided by ETHTOOL_GDRVINFO ioct command. The information is read only so
that the corresponding SET_INFO message is only used in kernel replies.
Move most of ethtool_get_drvinfo() int common.c so that the code can be
shared by both ioctl and netlink interface.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
Documentation/networking/ethtool-netlink.txt | 43 ++++-
include/uapi/linux/ethtool_netlink.h | 32 ++++
net/ethtool/Makefile | 2 +-
net/ethtool/common.c | 54 +++++++
net/ethtool/common.h | 2 +
net/ethtool/info.c | 155 +++++++++++++++++++
net/ethtool/ioctl.c | 52 +------
net/ethtool/netlink.c | 9 ++
8 files changed, 300 insertions(+), 49 deletions(-)
create mode 100644 net/ethtool/info.c
diff --git a/Documentation/networking/ethtool-netlink.txt b/Documentation/networking/ethtool-netlink.txt
index f0fe4f50db9f..b6999a2167e8 100644
--- a/Documentation/networking/ethtool-netlink.txt
+++ b/Documentation/networking/ethtool-netlink.txt
@@ -128,6 +128,8 @@ List of message types
ETHNL_CMD_EVENT notification only
ETHNL_CMD_GET_STRSET
ETHNL_CMD_SET_STRSET response only
+ ETHNL_CMD_GET_INFO
+ ETHNL_CMD_SET_INFO response only
All constants use ETHNL_CMD_ prefix, usually followed by "GET", "SET" or "ACT"
to indicate the type.
@@ -208,6 +210,45 @@ ETHA_STRSET_COUNTS tells kernel to only return string counts of the sets, not
the actual strings.
+GET_INFO
+--------
+
+GET_INFO requests information provided by ioctl commands ETHTOOL_GDRVINFO,
+ETHTOOL_GPERMADDR and ETHTOOL_GET_TS_INFO to provide basic device information.
+Common pattern is that all information is read only so that SET_INFO message
+exists but is only used by kernel for replies to GET_INFO requests. There is
+also no corresponding notification.
+
+Request contents:
+
+ ETHA_INFO_DEV (nested) device identification
+ ETHA_INFO_INFOMASK (u32) info mask
+ ETHA_INFO_COMPACT (flag) request compact bitsets
+
+Info mask bits meaning:
+
+ ETH_INFO_IM_DRVINFO driver info (GDRVINFO)
+ ETH_INFO_IM_PERMADDR permanent HW address (GPERMADDR)
+ ETH_INFO_IM_TSINFO timestamping info (GET_TS_INFO)
+
+Kernel response contents:
+
+ ETHA_INFO_DEV (nested) device identification
+ ETHA_INFO_DRVINFO (nested) driver information
+ ETHA_DRVINFO_DRIVER (string) driver name
+ ETHA_DRVINFO_FWVERSION (string) firmware version
+ ETHA_DRVINFO_BUSINFO (string) device bus address
+ ETHA_DRVINFO_EROM_VER (string) expansion ROM version
+
+The meaning of DRVINFO attributes follows the corresponding fields of
+ETHTOOL_GDRVINFO response. Second part with various counts and sizes is
+omitted as these are not really needed (and if they are, they can be easily
+found by different means). Driver version is also omitted as it is rather
+misleading in most cases.
+
+GET_INFO requests allow dumps.
+
+
Request translation
-------------------
@@ -219,7 +260,7 @@ ioctl command netlink command
---------------------------------------------------------------------
ETHTOOL_GSET n/a
ETHTOOL_SSET n/a
-ETHTOOL_GDRVINFO n/a
+ETHTOOL_GDRVINFO ETHNL_CMD_GET_INFO
ETHTOOL_GREGS n/a
ETHTOOL_GWOL n/a
ETHTOOL_SWOL n/a
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index 630b66732dc9..fdae12b6c6b6 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -10,6 +10,8 @@ enum {
ETHNL_CMD_EVENT, /* only for notifications */
ETHNL_CMD_GET_STRSET,
ETHNL_CMD_SET_STRSET, /* only for reply */
+ ETHNL_CMD_GET_INFO,
+ ETHNL_CMD_SET_INFO, /* only for reply */
__ETHNL_CMD_CNT,
ETHNL_CMD_MAX = (__ETHNL_CMD_CNT - 1)
@@ -135,6 +137,36 @@ enum {
ETHA_STRSET_MAX = (__ETHA_STRSET_CNT - 1)
};
+/* GET_INFO / SET_INFO */
+
+enum {
+ ETHA_INFO_UNSPEC,
+ ETHA_INFO_DEV, /* nest - ETHA_DEV_* */
+ ETHA_INFO_INFOMASK, /* u32 */
+ ETHA_INFO_COMPACT, /* flag */
+ ETHA_INFO_DRVINFO, /* nest - ETHA_DRVINFO_* */
+ ETHA_INFO_PERMADDR, /* nest - ETHA_PERMADDR_* */
+ ETHA_INFO_TSINFO, /* nest - ETHA_TSINFO_* */
+
+ __ETHA_INFO_CNT,
+ ETHA_INFO_MAX = (__ETHA_INFO_CNT - 1)
+};
+
+#define ETH_INFO_IM_DRVINFO 0x01
+
+#define ETH_INFO_IM_ALL 0x01
+
+enum {
+ ETHA_DRVINFO_UNSPEC,
+ ETHA_DRVINFO_DRIVER, /* string */
+ ETHA_DRVINFO_FWVERSION, /* string */
+ ETHA_DRVINFO_BUSINFO, /* string */
+ ETHA_DRVINFO_EROM_VER, /* string */
+
+ __ETHA_DRVINFO_CNT,
+ ETHA_DRVINFO_MAX = (__ETHA_DRVINFO_CNT - 1)
+};
+
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
index 11ceb00821b3..96d41dc45d4f 100644
--- a/net/ethtool/Makefile
+++ b/net/ethtool/Makefile
@@ -4,4 +4,4 @@ obj-y += ioctl.o common.o
obj-$(CONFIG_ETHTOOL_NETLINK) += ethtool_nl.o
-ethtool_nl-y := netlink.o bitset.o strset.o
+ethtool_nl-y := netlink.o bitset.o strset.o info.o
diff --git a/net/ethtool/common.c b/net/ethtool/common.c
index 73f721a1c557..e0bd7c6c5874 100644
--- a/net/ethtool/common.c
+++ b/net/ethtool/common.c
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#include <linux/rtnetlink.h>
+#include <net/devlink.h>
#include "common.h"
const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
@@ -81,3 +83,55 @@ phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
[ETHTOOL_ID_UNSPEC] = "Unspec",
[ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
};
+
+int __ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
+{
+ const struct ethtool_ops *ops = dev->ethtool_ops;
+
+ memset(info, 0, sizeof(*info));
+ info->cmd = ETHTOOL_GDRVINFO;
+ if (ops->get_drvinfo) {
+ ops->get_drvinfo(dev, info);
+ } else if (dev->dev.parent && dev->dev.parent->driver) {
+ strlcpy(info->bus_info, dev_name(dev->dev.parent),
+ sizeof(info->bus_info));
+ strlcpy(info->driver, dev->dev.parent->driver->name,
+ sizeof(info->driver));
+ } else {
+ return -EOPNOTSUPP;
+ }
+
+ /* this method of obtaining string set info is deprecated;
+ * Use ETHTOOL_GSSET_INFO instead.
+ */
+ if (ops->get_sset_count) {
+ int rc;
+
+ rc = ops->get_sset_count(dev, ETH_SS_TEST);
+ if (rc >= 0)
+ info->testinfo_len = rc;
+ rc = ops->get_sset_count(dev, ETH_SS_STATS);
+ if (rc >= 0)
+ info->n_stats = rc;
+ rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
+ if (rc >= 0)
+ info->n_priv_flags = rc;
+ }
+ if (ops->get_regs_len) {
+ int ret = ops->get_regs_len(dev);
+
+ if (ret > 0)
+ info->regdump_len = ret;
+ }
+
+ if (ops->get_eeprom_len)
+ info->eedump_len = ops->get_eeprom_len(dev);
+
+ rtnl_unlock();
+ if (!info->fw_version[0])
+ devlink_compat_running_version(dev, info->fw_version,
+ sizeof(info->fw_version));
+ rtnl_lock();
+
+ return 0;
+}
diff --git a/net/ethtool/common.h b/net/ethtool/common.h
index 41b2efc1e4e1..e87e58b3a274 100644
--- a/net/ethtool/common.h
+++ b/net/ethtool/common.h
@@ -3,6 +3,7 @@
#ifndef _ETHTOOL_COMMON_H
#define _ETHTOOL_COMMON_H
+#include <linux/netdevice.h>
#include <linux/ethtool.h>
extern const char
@@ -14,4 +15,5 @@ tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN];
extern const char
phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN];
+int __ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
#endif /* _ETHTOOL_COMMON_H */
diff --git a/net/ethtool/info.c b/net/ethtool/info.c
new file mode 100644
index 000000000000..1a2e78d238e3
--- /dev/null
+++ b/net/ethtool/info.c
@@ -0,0 +1,155 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+
+#include "netlink.h"
+#include "common.h"
+#include "bitset.h"
+
+struct info_data {
+ struct common_req_info reqinfo_base;
+
+ /* everything below here will be reset for each device in dumps */
+ struct common_reply_data repdata_base;
+ struct ethtool_drvinfo drvinfo;
+};
+
+static const struct nla_policy get_info_policy[ETHA_INFO_MAX + 1] = {
+ [ETHA_INFO_UNSPEC] = { .type = NLA_REJECT },
+ [ETHA_INFO_DEV] = { .type = NLA_NESTED },
+ [ETHA_INFO_INFOMASK] = { .type = NLA_U32 },
+ [ETHA_INFO_COMPACT] = { .type = NLA_FLAG },
+ [ETHA_INFO_DRVINFO] = { .type = NLA_REJECT },
+};
+
+static int parse_info(struct common_req_info *req_info, struct sk_buff *skb,
+ struct genl_info *info, const struct nlmsghdr *nlhdr)
+{
+ struct nlattr *tb[ETHA_INFO_MAX + 1];
+ int ret;
+
+ ret = genlmsg_parse(nlhdr, ðtool_genl_family, tb, ETHA_INFO_MAX,
+ get_info_policy, info ? info->extack : NULL);
+ if (ret < 0)
+ return ret;
+
+ if (tb[ETHA_INFO_DEV]) {
+ req_info->dev = ethnl_dev_get(info, tb[ETHA_INFO_DEV]);
+ if (IS_ERR(req_info->dev)) {
+ ret = PTR_ERR(req_info->dev);
+ req_info->dev = NULL;
+ return ret;
+ }
+ }
+ if (tb[ETHA_INFO_INFOMASK])
+ req_info->req_mask = nla_get_u32(tb[ETHA_INFO_INFOMASK]);
+ if (tb[ETHA_INFO_COMPACT])
+ req_info->compact = true;
+ if (req_info->req_mask == 0)
+ req_info->req_mask = ETH_INFO_IM_ALL;
+
+ return 0;
+}
+
+static int prepare_info(struct common_req_info *req_info,
+ struct genl_info *info)
+{
+ struct info_data *data =
+ container_of(req_info, struct info_data, reqinfo_base);
+ struct net_device *dev = data->repdata_base.dev;
+ u32 req_mask = req_info->req_mask & ETH_INFO_IM_ALL;
+ int ret;
+
+ ret = ethnl_before_ops(dev);
+ if (ret < 0)
+ return ret;
+ if (req_mask & ETH_INFO_IM_DRVINFO) {
+ ret = __ethtool_get_drvinfo(dev, &data->drvinfo);
+ if (ret < 0)
+ req_mask &= ~ETH_INFO_IM_DRVINFO;
+ }
+ ethnl_after_ops(dev);
+
+ data->repdata_base.info_mask = req_mask;
+ if (req_info->req_mask & ~req_mask)
+ warn_partial_info(info);
+ return 0;
+}
+
+static int drvinfo_size(const struct ethtool_drvinfo *drvinfo)
+{
+ int len = 0;
+
+ len += ethnl_str_ifne_size(drvinfo->driver);
+ len += ethnl_str_ifne_size(drvinfo->fw_version);
+ len += ethnl_str_ifne_size(drvinfo->bus_info);
+ len += ethnl_str_ifne_size(drvinfo->erom_version);
+
+ return nla_total_size(len);
+}
+
+static int info_size(const struct common_req_info *req_info)
+{
+ const struct info_data *data =
+ container_of(req_info, struct info_data, reqinfo_base);
+ u32 info_mask = data->repdata_base.info_mask;
+ int len = 0;
+
+ len += dev_ident_size();
+ if (info_mask & ETH_INFO_IM_DRVINFO)
+ len += drvinfo_size(&data->drvinfo);
+
+ return len;
+}
+
+static int fill_drvinfo(struct sk_buff *skb,
+ const struct ethtool_drvinfo *drvinfo)
+{
+ struct nlattr *nest = ethnl_nest_start(skb, ETHA_INFO_DRVINFO);
+ int ret;
+
+ if (!nest)
+ return -EMSGSIZE;
+ ret = -EMSGSIZE;
+ if (ethnl_put_str_ifne(skb, ETHA_DRVINFO_DRIVER, drvinfo->driver) ||
+ ethnl_put_str_ifne(skb, ETHA_DRVINFO_FWVERSION,
+ drvinfo->fw_version) ||
+ ethnl_put_str_ifne(skb, ETHA_DRVINFO_BUSINFO, drvinfo->bus_info) ||
+ ethnl_put_str_ifne(skb, ETHA_DRVINFO_EROM_VER,
+ drvinfo->erom_version))
+ goto err;
+
+ nla_nest_end(skb, nest);
+ return 0;
+err:
+ nla_nest_cancel(skb, nest);
+ return ret;
+}
+
+static int fill_info(struct sk_buff *skb,
+ const struct common_req_info *req_info)
+{
+ const struct info_data *data =
+ container_of(req_info, struct info_data, reqinfo_base);
+ u32 info_mask = data->repdata_base.info_mask;
+ int ret;
+
+ if (info_mask & ETH_INFO_IM_DRVINFO) {
+ ret = fill_drvinfo(skb, &data->drvinfo);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
+const struct get_request_ops info_request_ops = {
+ .request_cmd = ETHNL_CMD_GET_INFO,
+ .reply_cmd = ETHNL_CMD_SET_INFO,
+ .dev_attrtype = ETHA_INFO_DEV,
+ .data_size = sizeof(struct info_data),
+ .repdata_offset = offsetof(struct info_data, repdata_base),
+
+ .parse_request = parse_info,
+ .prepare_data = prepare_info,
+ .reply_size = info_size,
+ .fill_reply = fill_info,
+};
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 71a1643adb2b..c883239001a4 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -685,56 +685,14 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
void __user *useraddr)
{
struct ethtool_drvinfo info;
- const struct ethtool_ops *ops = dev->ethtool_ops;
-
- memset(&info, 0, sizeof(info));
- info.cmd = ETHTOOL_GDRVINFO;
- if (ops->get_drvinfo) {
- ops->get_drvinfo(dev, &info);
- } else if (dev->dev.parent && dev->dev.parent->driver) {
- strlcpy(info.bus_info, dev_name(dev->dev.parent),
- sizeof(info.bus_info));
- strlcpy(info.driver, dev->dev.parent->driver->name,
- sizeof(info.driver));
- } else {
- return -EOPNOTSUPP;
- }
-
- /*
- * this method of obtaining string set info is deprecated;
- * Use ETHTOOL_GSSET_INFO instead.
- */
- if (ops->get_sset_count) {
- int rc;
-
- rc = ops->get_sset_count(dev, ETH_SS_TEST);
- if (rc >= 0)
- info.testinfo_len = rc;
- rc = ops->get_sset_count(dev, ETH_SS_STATS);
- if (rc >= 0)
- info.n_stats = rc;
- rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
- if (rc >= 0)
- info.n_priv_flags = rc;
- }
- if (ops->get_regs_len) {
- int ret = ops->get_regs_len(dev);
-
- if (ret > 0)
- info.regdump_len = ret;
- }
-
- if (ops->get_eeprom_len)
- info.eedump_len = ops->get_eeprom_len(dev);
-
- rtnl_unlock();
- if (!info.fw_version[0])
- devlink_compat_running_version(dev, info.fw_version,
- sizeof(info.fw_version));
- rtnl_lock();
+ int rc;
+ rc = __ethtool_get_drvinfo(dev, &info);
+ if (rc < 0)
+ return rc;
if (copy_to_user(useraddr, &info, sizeof(info)))
return -EFAULT;
+
return 0;
}
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index 082a9f2aa0a7..e27dec427414 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c
@@ -87,9 +87,11 @@ int ethnl_fill_dev(struct sk_buff *msg, struct net_device *dev, u16 attrtype)
/* GET request helpers */
extern const struct get_request_ops strset_request_ops;
+extern const struct get_request_ops info_request_ops;
const struct get_request_ops *get_requests[__ETHNL_CMD_CNT] = {
[ETHNL_CMD_GET_STRSET] = &strset_request_ops,
+ [ETHNL_CMD_GET_INFO] = &info_request_ops,
};
static struct common_req_info *alloc_get_data(const struct get_request_ops *ops)
@@ -508,6 +510,13 @@ static const struct genl_ops ethtool_genl_ops[] = {
.dumpit = ethnl_get_dumpit,
.done = ethnl_get_done,
},
+ {
+ .cmd = ETHNL_CMD_GET_INFO,
+ .doit = ethnl_get_doit,
+ .start = ethnl_get_start,
+ .dumpit = ethnl_get_dumpit,
+ .done = ethnl_get_done,
+ },
};
static const struct genl_multicast_group ethtool_nl_mcgrps[] = {
--
2.20.1
^ permalink raw reply related
* [RFC PATCH net-next v3 10/21] ethtool: provide string sets with GET_STRSET request
From: Michal Kubecek @ 2019-02-18 18:22 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Requests a contents of one or more string sets, i.e. indexed arrays of
strings; this information is provided by ETHTOOL_GSSET_INFO and
ETHTOOL_GSTRINGS commands of ioctl interface. There are three types of
requests:
- no NLM_F_DUMP, no device: get "global" stringsets
- no NLM_F_DUMP, with device: get string sets related to the device
- NLM_F_DUMP, no device: get device related string sets for all devices
It's possible to request all string sets of given type or only specific
sets. With ETHA_STRSET_COUNTS flag, only set sizes (number of strings) are
returned.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
Documentation/networking/ethtool-netlink.txt | 46 +-
include/uapi/linux/ethtool.h | 2 +
include/uapi/linux/ethtool_netlink.h | 43 ++
net/ethtool/Makefile | 2 +-
net/ethtool/netlink.c | 10 +
net/ethtool/strset.c | 437 +++++++++++++++++++
6 files changed, 537 insertions(+), 3 deletions(-)
create mode 100644 net/ethtool/strset.c
diff --git a/Documentation/networking/ethtool-netlink.txt b/Documentation/networking/ethtool-netlink.txt
index b79c26b5e92b..f0fe4f50db9f 100644
--- a/Documentation/networking/ethtool-netlink.txt
+++ b/Documentation/networking/ethtool-netlink.txt
@@ -126,6 +126,8 @@ List of message types
---------------------
ETHNL_CMD_EVENT notification only
+ ETHNL_CMD_GET_STRSET
+ ETHNL_CMD_SET_STRSET response only
All constants use ETHNL_CMD_ prefix, usually followed by "GET", "SET" or "ACT"
to indicate the type.
@@ -166,6 +168,46 @@ and also multiple events of the same type (e.g. two or more newly registered
devices).
+GET_STRSET
+----------
+
+Requests contents of a string set as provided by ioctl commands
+ETHTOOL_GSSET_INFO and ETHTOOL_GSTRINGS. String sets are not user writeable so
+that the corresponding SET_STRSET message is only used in kernel replies.
+There are two types of string sets: global (independent of a device, e.g.
+device feature names) and device specific (e.g. device private flags).
+
+Request contents:
+
+ ETHA_STRSET_DEV (nested) device identification
+ ETHA_STRSET_COUNTS (flag) request only string counts
+ ETHA_STRSET_STRINGSET (nested) string set to request
+ ETHA_STRINGSET_ID (u32) set id
+
+Kernel response contents:
+
+ ETHA_STRSET_DEV (nested) device identification
+ ETHA_STRSET_STRINGSET (nested) string set to request
+ ETHA_STRINGSET_ID (u32) set id
+ ETHA_STRINGSET_COUNT (u32) number of strings
+ ETHA_STRINGSET_STRINGS (nested) array of strings
+ ETHA_STRING_INDEX (u32) string index
+ ETHA_STRING_VALUE (string) string value
+
+ETHA_STRSET_DEV, if present, identifies the device to request device specific
+string sets for. Depending on its presence a and NLM_F_DUMP flag, there are
+three type of GET_STRSET requests:
+
+ - no NLM_F_DUMP, no device: get "global" stringsets
+ - no NLM_F_DUMP, with device: get string sets related to the device
+ - NLM_F_DUMP, no device: get device related string sets for all devices
+
+If there is no ETHA_STRSET_STRINGSET attribute, all string sets of requested
+type are returned, otherwise only those specified in the request. Flag
+ETHA_STRSET_COUNTS tells kernel to only return string counts of the sets, not
+the actual strings.
+
+
Request translation
-------------------
@@ -200,7 +242,7 @@ ETHTOOL_STXCSUM n/a
ETHTOOL_GSG n/a
ETHTOOL_SSG n/a
ETHTOOL_TEST n/a
-ETHTOOL_GSTRINGS n/a
+ETHTOOL_GSTRINGS ETHNL_CMD_GET_STRSET
ETHTOOL_PHYS_ID n/a
ETHTOOL_GSTATS n/a
ETHTOOL_GTSO n/a
@@ -228,7 +270,7 @@ ETHTOOL_FLASHDEV n/a
ETHTOOL_RESET n/a
ETHTOOL_SRXNTUPLE n/a
ETHTOOL_GRXNTUPLE n/a
-ETHTOOL_GSSET_INFO n/a
+ETHTOOL_GSSET_INFO ETHNL_CMD_GET_STRSET
ETHTOOL_GRXFHINDIR n/a
ETHTOOL_SRXFHINDIR n/a
ETHTOOL_GFEATURES n/a
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 17be76aeb468..9ea278961d80 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -574,6 +574,8 @@ enum ethtool_stringset {
ETH_SS_TUNABLES,
ETH_SS_PHY_STATS,
ETH_SS_PHY_TUNABLES,
+
+ ETH_SS_COUNT
};
/**
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index 7e192ad8ce3a..630b66732dc9 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -8,6 +8,8 @@
enum {
ETHNL_CMD_NOOP,
ETHNL_CMD_EVENT, /* only for notifications */
+ ETHNL_CMD_GET_STRSET,
+ ETHNL_CMD_SET_STRSET, /* only for reply */
__ETHNL_CMD_CNT,
ETHNL_CMD_MAX = (__ETHNL_CMD_CNT - 1)
@@ -92,6 +94,47 @@ enum {
ETHA_EVENT_MAX = (__ETHA_EVENT_CNT - 1)
};
+/* string sets */
+
+enum {
+ ETHA_STRING_UNSPEC,
+ ETHA_STRING_INDEX, /* u32 */
+ ETHA_STRING_VALUE, /* string */
+
+ __ETHA_STRING_CNT,
+ ETHA_STRING_MAX = (__ETHA_STRING_CNT - 1)
+};
+
+enum {
+ ETHA_STRINGS_UNSPEC,
+ ETHA_STRINGS_STRING, /* nest - ETHA_STRINGS_* */
+
+ __ETHA_STRINGS_CNT,
+ ETHA_STRINGS_MAX = (__ETHA_STRINGS_CNT - 1)
+};
+
+enum {
+ ETHA_STRINGSET_UNSPEC,
+ ETHA_STRINGSET_ID, /* u32 */
+ ETHA_STRINGSET_COUNT, /* u32 */
+ ETHA_STRINGSET_STRINGS, /* nest - ETHA_STRINGS_* */
+
+ __ETHA_STRINGSET_CNT,
+ ETHA_STRINGSET_MAX = (__ETHA_STRINGSET_CNT - 1)
+};
+
+/* GET_STRINGSET / SET_STRINGSET */
+
+enum {
+ ETHA_STRSET_UNSPEC,
+ ETHA_STRSET_DEV, /* nest - ETHA_DEV_* */
+ ETHA_STRSET_COUNTS, /* flag */
+ ETHA_STRSET_STRINGSET, /* nest - ETHA_STRSET_* */
+
+ __ETHA_STRSET_CNT,
+ ETHA_STRSET_MAX = (__ETHA_STRSET_CNT - 1)
+};
+
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
index 11782306593b..11ceb00821b3 100644
--- a/net/ethtool/Makefile
+++ b/net/ethtool/Makefile
@@ -4,4 +4,4 @@ obj-y += ioctl.o common.o
obj-$(CONFIG_ETHTOOL_NETLINK) += ethtool_nl.o
-ethtool_nl-y := netlink.o bitset.o
+ethtool_nl-y := netlink.o bitset.o strset.o
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index 8cdb6f52cb4a..082a9f2aa0a7 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c
@@ -86,7 +86,10 @@ int ethnl_fill_dev(struct sk_buff *msg, struct net_device *dev, u16 attrtype)
/* GET request helpers */
+extern const struct get_request_ops strset_request_ops;
+
const struct get_request_ops *get_requests[__ETHNL_CMD_CNT] = {
+ [ETHNL_CMD_GET_STRSET] = &strset_request_ops,
};
static struct common_req_info *alloc_get_data(const struct get_request_ops *ops)
@@ -498,6 +501,13 @@ static struct notifier_block ethnl_netdev_notifier = {
/* genetlink setup */
static const struct genl_ops ethtool_genl_ops[] = {
+ {
+ .cmd = ETHNL_CMD_GET_STRSET,
+ .doit = ethnl_get_doit,
+ .start = ethnl_get_start,
+ .dumpit = ethnl_get_dumpit,
+ .done = ethnl_get_done,
+ },
};
static const struct genl_multicast_group ethtool_nl_mcgrps[] = {
diff --git a/net/ethtool/strset.c b/net/ethtool/strset.c
new file mode 100644
index 000000000000..a7d0ec2865fb
--- /dev/null
+++ b/net/ethtool/strset.c
@@ -0,0 +1,437 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+
+#include <linux/ethtool.h>
+#include <linux/phy.h>
+#include "netlink.h"
+#include "common.h"
+
+enum strset_type {
+ ETH_SS_TYPE_NONE,
+ ETH_SS_TYPE_LEGACY,
+ ETH_SS_TYPE_SIMPLE,
+};
+
+struct strset_info {
+ enum strset_type type;
+ bool per_dev;
+ bool free_data;
+ unsigned int count;
+ union {
+ const char (*legacy)[ETH_GSTRING_LEN];
+ const char * const *simple;
+ void *ptr;
+ } data;
+};
+
+static const struct strset_info info_template[] = {
+ [ETH_SS_TEST] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = true,
+ },
+ [ETH_SS_STATS] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = true,
+ },
+ [ETH_SS_PRIV_FLAGS] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = true,
+ },
+ [ETH_SS_NTUPLE_FILTERS] = {
+ .type = ETH_SS_TYPE_NONE,
+ },
+ [ETH_SS_FEATURES] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = false,
+ .count = ARRAY_SIZE(netdev_features_strings),
+ .data = { .legacy = netdev_features_strings },
+ },
+ [ETH_SS_RSS_HASH_FUNCS] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = false,
+ .count = ARRAY_SIZE(rss_hash_func_strings),
+ .data = { .legacy = rss_hash_func_strings },
+ },
+ [ETH_SS_TUNABLES] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = false,
+ .count = ARRAY_SIZE(tunable_strings),
+ .data = { .legacy = tunable_strings },
+ },
+ [ETH_SS_PHY_STATS] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = true,
+ },
+ [ETH_SS_PHY_TUNABLES] = {
+ .type = ETH_SS_TYPE_LEGACY,
+ .per_dev = false,
+ .count = ARRAY_SIZE(phy_tunable_strings),
+ .data = { .legacy = phy_tunable_strings },
+ },
+};
+
+struct strset_data {
+ struct common_req_info reqinfo_base;
+ u32 req_ids;
+ bool counts_only;
+
+ /* everything below here will be reset for each device in dumps */
+ struct common_reply_data repdata_base;
+ struct strset_info info[ETH_SS_COUNT];
+};
+
+static const struct nla_policy get_strset_policy[ETHA_STRSET_MAX + 1] = {
+ [ETHA_STRSET_UNSPEC] = { .type = NLA_REJECT },
+ [ETHA_STRSET_DEV] = { .type = NLA_NESTED },
+ [ETHA_STRSET_COUNTS] = { .type = NLA_FLAG },
+ [ETHA_STRSET_STRINGSET] = { .type = NLA_NESTED },
+};
+
+static const struct nla_policy stringset_policy[ETHA_STRINGSET_MAX + 1] = {
+ [ETHA_STRINGSET_UNSPEC] = { .type = NLA_REJECT },
+ [ETHA_STRINGSET_ID] = { .type = NLA_U32 },
+ [ETHA_STRINGSET_COUNT] = { .type = NLA_REJECT },
+ [ETHA_STRINGSET_STRINGS] = { .type = NLA_REJECT },
+};
+
+static bool id_requested(const struct strset_data *data, u32 id)
+{
+ return data->req_ids & (1U << id);
+}
+
+static bool include_set(const struct strset_data *data, u32 id)
+{
+ bool per_dev;
+
+ BUILD_BUG_ON(ETH_SS_COUNT >= BITS_PER_BYTE * sizeof(data->req_ids));
+
+ if (data->req_ids)
+ return id_requested(data, id);
+
+ per_dev = data->info[id].per_dev;
+ if (data->info[id].type == ETH_SS_TYPE_NONE)
+ return false;
+ return data->repdata_base.dev ? per_dev : !per_dev;
+}
+
+const char *str_value(const struct strset_info *info, unsigned int i)
+{
+ switch (info->type) {
+ case ETH_SS_TYPE_LEGACY:
+ return info->data.legacy[i];
+ case ETH_SS_TYPE_SIMPLE:
+ return info->data.simple[i];
+ default:
+ WARN_ONCE(1, "unexpected string set type");
+ return "";
+ }
+}
+
+static int get_strset_id(const struct nlattr *nest, u32 *val,
+ struct genl_info *info)
+{
+ struct nlattr *tb[ETHA_STRINGSET_MAX + 1];
+ int ret;
+
+ ret = nla_parse_nested(tb, ETHA_STRINGSET_MAX, nest, stringset_policy,
+ info ? info->extack : NULL);
+ if (ret < 0)
+ return ret;
+ if (!tb[ETHA_STRINGSET_ID])
+ return -EINVAL;
+
+ *val = nla_get_u32(tb[ETHA_STRINGSET_ID]);
+ return 0;
+}
+
+static int parse_strset(struct common_req_info *req_info, struct sk_buff *skb,
+ struct genl_info *info, const struct nlmsghdr *nlhdr)
+{
+ struct strset_data *data =
+ container_of(req_info, struct strset_data, reqinfo_base);
+ struct nlattr *attr;
+ int rem, ret;
+
+ ret = nlmsg_validate(nlhdr, GENL_HDRLEN, ETHA_STRSET_MAX,
+ get_strset_policy, info ? info->extack : NULL);
+ if (ret < 0)
+ return ret;
+
+ nlmsg_for_each_attr(attr, nlhdr, GENL_HDRLEN, rem) {
+ u32 id;
+
+ switch (nla_type(attr)) {
+ case ETHA_STRSET_DEV:
+ req_info->dev = ethnl_dev_get(info, attr);
+ if (IS_ERR(req_info->dev)) {
+ ret = PTR_ERR(req_info->dev);
+ req_info->dev = NULL;
+ return ret;
+ }
+ break;
+ case ETHA_STRSET_COUNTS:
+ data->counts_only = true;
+ break;
+ case ETHA_STRSET_STRINGSET:
+ ret = get_strset_id(attr, &id, info);
+ if (ret < 0)
+ return ret;
+ if (ret >= ETH_SS_COUNT)
+ return -EOPNOTSUPP;
+ data->req_ids |= (1U << id);
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static void free_strset(struct strset_data *data)
+{
+ unsigned int i;
+
+ for (i = 0; i < ETH_SS_COUNT; i++)
+ if (data->info[i].free_data) {
+ kfree(data->info[i].data.ptr);
+ data->info[i].data.ptr = NULL;
+ data->info[i].free_data = false;
+ }
+}
+
+static int prepare_one_stringset(struct strset_info *info,
+ struct net_device *dev, unsigned int id,
+ bool counts_only)
+{
+ const struct ethtool_ops *ops = dev->ethtool_ops;
+ void *strings;
+ int count, ret;
+
+ if (id == ETH_SS_PHY_STATS && dev->phydev &&
+ !ops->get_ethtool_phy_stats)
+ ret = phy_ethtool_get_sset_count(dev->phydev);
+ else if (ops->get_sset_count && ops->get_strings)
+ ret = ops->get_sset_count(dev, id);
+ else
+ ret = -EOPNOTSUPP;
+ if (ret <= 0) {
+ info->count = 0;
+ return 0;
+ }
+
+ count = ret;
+ if (!counts_only) {
+ strings = kcalloc(count, ETH_GSTRING_LEN, GFP_KERNEL);
+ if (!strings)
+ return -ENOMEM;
+ if (id == ETH_SS_PHY_STATS && dev->phydev &&
+ !ops->get_ethtool_phy_stats)
+ phy_ethtool_get_strings(dev->phydev, strings);
+ else
+ ops->get_strings(dev, id, strings);
+ info->data.legacy = strings;
+ info->free_data = true;
+ }
+ info->count = count;
+
+ return 0;
+}
+
+static int prepare_strset(struct common_req_info *req_info,
+ struct genl_info *info)
+{
+ struct strset_data *data =
+ container_of(req_info, struct strset_data, reqinfo_base);
+ struct net_device *dev = data->repdata_base.dev;
+ unsigned int i;
+ int ret;
+
+ memcpy(&data->info, &info_template, sizeof(data->info));
+
+ if (!dev) {
+ for (i = 0; i < ETH_SS_COUNT; i++) {
+ if (id_requested(data, i) &&
+ data->info[i].per_dev) {
+ ETHNL_SET_ERRMSG(info,
+ "requested per device strings without dev");
+ return -EINVAL;
+ }
+ }
+ }
+
+ ret = ethnl_before_ops(dev);
+ if (ret < 0)
+ goto err_strset;
+ for (i = 0; i < ETH_SS_COUNT; i++) {
+ if (!include_set(data, i) || !data->info[i].per_dev)
+ continue;
+ if (WARN_ONCE(data->info[i].type != ETH_SS_TYPE_LEGACY,
+ "unexpected string set type %u",
+ data->info[i].type))
+ goto err_ops;
+
+ ret = prepare_one_stringset(&data->info[i], dev, i,
+ data->counts_only);
+ if (ret < 0)
+ goto err_ops;
+ }
+ ethnl_after_ops(dev);
+
+ return 0;
+err_ops:
+ ethnl_after_ops(dev);
+err_strset:
+ free_strset(data);
+ return ret;
+}
+
+static int legacy_set_size(const char (*set)[ETH_GSTRING_LEN],
+ unsigned int count)
+{
+ unsigned int len = 0;
+ unsigned int i;
+
+ for (i = 0; i < count; i++)
+ len += nla_total_size(nla_total_size(sizeof(u32)) +
+ ethnl_str_size(set[i]));
+ len = 2 * nla_total_size(sizeof(u32)) + nla_total_size(len);
+
+ return nla_total_size(len);
+}
+
+static int simple_set_size(const char * const *set, unsigned int count)
+{
+ unsigned int len = 0;
+ unsigned int i;
+
+ for (i = 0; i < count; i++)
+ len += nla_total_size(nla_total_size(sizeof(u32)) +
+ ethnl_str_size(set[i]));
+ len = 2 * nla_total_size(sizeof(u32)) + nla_total_size(len);
+
+ return nla_total_size(len);
+}
+
+static int set_size(const struct strset_info *info, bool counts_only)
+{
+ if (info->count == 0)
+ return 0;
+ if (counts_only)
+ return nla_total_size(2 * nla_total_size(sizeof(u32)));
+
+ switch (info->type) {
+ case ETH_SS_TYPE_LEGACY:
+ return legacy_set_size(info->data.legacy, info->count);
+ case ETH_SS_TYPE_SIMPLE:
+ return simple_set_size(info->data.simple, info->count);
+ default:
+ return -EINVAL;
+ };
+}
+
+static int strset_size(const struct common_req_info *req_info)
+{
+ const struct strset_data *data =
+ container_of(req_info, struct strset_data, reqinfo_base);
+ unsigned int i;
+ int len = 0;
+ int ret;
+
+ len += dev_ident_size();
+ for (i = 0; i < ETH_SS_COUNT; i++) {
+ const struct strset_info *info = &data->info[i];
+
+ if (!include_set(data, i) || info->type == ETH_SS_TYPE_NONE)
+ continue;
+
+ ret = set_size(info, data->counts_only);
+ if (ret < 0)
+ return ret;
+ len += ret;
+ }
+
+ return len;
+}
+
+static int fill_string(struct sk_buff *skb, const struct strset_info *info,
+ u32 idx)
+{
+ struct nlattr *string = ethnl_nest_start(skb, ETHA_STRINGS_STRING);
+
+ if (!string)
+ return -EMSGSIZE;
+ if (nla_put_u32(skb, ETHA_STRING_INDEX, idx) ||
+ nla_put_string(skb, ETHA_STRING_VALUE, str_value(info, idx)))
+ return -EMSGSIZE;
+ nla_nest_end(skb, string);
+
+ return 0;
+}
+
+static int fill_set(struct sk_buff *skb, const struct strset_data *data, u32 id)
+{
+ const struct strset_info *info = &data->info[id];
+ struct nlattr *strings;
+ struct nlattr *nest;
+ unsigned int i = (unsigned int)(-1);
+
+ if (info->type == ETH_SS_TYPE_NONE)
+ return -EOPNOTSUPP;
+ if (info->count == 0)
+ return 0;
+ nest = ethnl_nest_start(skb, ETHA_STRSET_STRINGSET);
+ if (!nest)
+ return -EMSGSIZE;
+
+ if (nla_put_u32(skb, ETHA_STRINGSET_ID, id) ||
+ nla_put_u32(skb, ETHA_STRINGSET_COUNT, info->count))
+ goto err;
+
+ if (!data->counts_only) {
+ strings = ethnl_nest_start(skb, ETHA_STRINGSET_STRINGS);
+ if (!strings)
+ goto err;
+ for (i = 0; i < info->count; i++) {
+ if (fill_string(skb, info, i) < 0)
+ goto err;
+ }
+ nla_nest_end(skb, strings);
+ }
+
+ nla_nest_end(skb, nest);
+ return 0;
+
+err:
+ nla_nest_cancel(skb, nest);
+ return -EMSGSIZE;
+}
+
+static int fill_strset(struct sk_buff *skb,
+ const struct common_req_info *req_info)
+{
+ const struct strset_data *data =
+ container_of(req_info, struct strset_data, reqinfo_base);
+ unsigned int i;
+ int ret;
+
+ for (i = 0; i < ETH_SS_COUNT; i++)
+ if (include_set(data, i)) {
+ ret = fill_set(skb, data, i);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
+const struct get_request_ops strset_request_ops = {
+ .request_cmd = ETHNL_CMD_GET_STRSET,
+ .reply_cmd = ETHNL_CMD_SET_STRSET,
+ .dev_attrtype = ETHA_STRSET_DEV,
+ .data_size = sizeof(struct strset_data),
+ .repdata_offset = offsetof(struct strset_data, repdata_base),
+ .allow_nodev_do = true,
+
+ .parse_request = parse_strset,
+ .prepare_data = prepare_strset,
+ .reply_size = strset_size,
+ .fill_reply = fill_strset,
+};
--
2.20.1
^ permalink raw reply related
* [RFC PATCH net-next v3 07/21] ethtool: implement EVENT notifications
From: Michal Kubecek @ 2019-02-18 18:21 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Three types of netlink notifications are introduced:
- ETHA_EVENT_NEWDEV to notify about newly registered network devices
- ETHA_EVENT_DELDEV to notify about unregistered network devices
- ETHA_EVENT_RENAMEDEV to notify about renamed network device
The notifications are triggered by NETDEV_REGISTER, NETDEV_UNREGISTER and
NETDEV_CHANGENAME notifiers.
These notifications are intended for applications and daemons monitoring
ethtool events to allow updating the list of existing devices without
having to open another socket for rtnetlink.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
Documentation/networking/ethtool-netlink.txt | 27 ++++++++
include/uapi/linux/ethtool_netlink.h | 37 +++++++++++
net/ethtool/netlink.c | 65 ++++++++++++++++++++
3 files changed, 129 insertions(+)
diff --git a/Documentation/networking/ethtool-netlink.txt b/Documentation/networking/ethtool-netlink.txt
index 205ae4462e9e..b79c26b5e92b 100644
--- a/Documentation/networking/ethtool-netlink.txt
+++ b/Documentation/networking/ethtool-netlink.txt
@@ -125,6 +125,8 @@ which the request applies.
List of message types
---------------------
+ ETHNL_CMD_EVENT notification only
+
All constants use ETHNL_CMD_ prefix, usually followed by "GET", "SET" or "ACT"
to indicate the type.
@@ -136,9 +138,34 @@ messages marked as "response only" in the table above. "Get" messages with
NLM_F_DUMP flags and no device identification dump the information for all
devices supporting the request.
+Type ETHNL_CMD_EVENT is special, these messages are never used in userspace
+requests or kernel replies. They are only sent by kernel to sockets listening
+to "monitor" multicast group to inform userspace about certain events.
+
Later sections describe the format and semantics of these request messages.
+EVENT
+-----
+
+EVENT messages are only used in kernel multicast notifications. Atributes
+correspond to specific event types, the same type can appear multiple times.
+
+ ETHA_EVENT_NEWDEV (nested) new device was registered
+ ETHA_NEWDEV_DEV (nested) new device
+ ETHA_EVENT_DELDEV (nested) device was unregistered
+ ETHA_DELDEV_DEV (nested) removed device
+ ETHA_EVENT_RENAMEDEV (nested) device was renamed
+ ETHA_RENAMEDEV_DEV (nested) renamed device
+
+For ETHA_EVENT_RENAMEDEV, the name ETHA_RENAME_DEV/ETHA_DEV_NAME is the new
+name after the rename.
+
+Userspace application must expect multiple events to be present in one message
+and also multiple events of the same type (e.g. two or more newly registered
+devices).
+
+
Request translation
-------------------
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index b662d75a0636..7e192ad8ce3a 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -7,6 +7,7 @@
enum {
ETHNL_CMD_NOOP,
+ ETHNL_CMD_EVENT, /* only for notifications */
__ETHNL_CMD_CNT,
ETHNL_CMD_MAX = (__ETHNL_CMD_CNT - 1)
@@ -55,6 +56,42 @@ enum {
ETHA_BITSET_MAX = (__ETHA_BITSET_CNT - 1)
};
+/* events */
+
+enum {
+ ETHA_NEWDEV_UNSPEC,
+ ETHA_NEWDEV_DEV, /* nest - ETHA_DEV_* */
+
+ __ETHA_NEWDEV_CNT,
+ ETHA_NEWDEV_MAX = (__ETHA_NEWDEV_CNT - 1)
+};
+
+enum {
+ ETHA_DELDEV_UNSPEC,
+ ETHA_DELDEV_DEV, /* nest - ETHA_DEV_* */
+
+ __ETHA_DELDEV_CNT,
+ ETHA_DELDEV_MAX = (__ETHA_DELDEV_CNT - 1)
+};
+
+enum {
+ ETHA_RENAMEDEV_UNSPEC,
+ ETHA_RENAMEDEV_DEV, /* nest - ETHA_DEV_* */
+
+ __ETHA_RENAMEDEV_CNT,
+ ETHA_RENAMEDEV_MAX = (__ETHA_RENAMEDEV_CNT - 1)
+};
+
+enum {
+ ETHA_EVENT_UNSPEC,
+ ETHA_EVENT_NEWDEV, /* nest - ETHA_NEWDEV_* */
+ ETHA_EVENT_DELDEV, /* nest - ETHA_DELDEV_* */
+ ETHA_EVENT_RENAMEDEV, /* nest - ETHA_RENAMEDEV_* */
+
+ __ETHA_EVENT_CNT,
+ ETHA_EVENT_MAX = (__ETHA_EVENT_CNT - 1)
+};
+
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index a5fa54c2b743..ee3424cd1f90 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c
@@ -148,6 +148,67 @@ void ethtool_notify(struct net_device *dev, struct netlink_ext_ack *extack,
}
EXPORT_SYMBOL(ethtool_notify);
+/* size of NEWDEV/DELDEV notification */
+static inline unsigned int dev_notify_size(void)
+{
+ return nla_total_size(dev_ident_size());
+}
+
+static void ethnl_notify_devlist(struct netdev_notifier_info *info,
+ u16 ev_type, u16 dev_attr)
+{
+ struct net_device *dev = netdev_notifier_info_to_dev(info);
+ struct sk_buff *skb;
+ struct nlattr *nest;
+ void *ehdr;
+ int ret;
+
+ skb = genlmsg_new(dev_notify_size(), GFP_KERNEL);
+ if (!skb)
+ return;
+ ehdr = genlmsg_put(skb, 0, ++ethnl_bcast_seq, ðtool_genl_family, 0,
+ ETHNL_CMD_EVENT);
+ if (!ehdr)
+ goto out_skb;
+ nest = ethnl_nest_start(skb, ev_type);
+ if (!nest)
+ goto out_skb;
+ ret = ethnl_fill_dev(skb, dev, dev_attr);
+ if (ret < 0)
+ goto out_skb;
+ nla_nest_end(skb, nest);
+ genlmsg_end(skb, ehdr);
+
+ genlmsg_multicast(ðtool_genl_family, skb, 0, ETHNL_MCGRP_MONITOR,
+ GFP_KERNEL);
+ return;
+out_skb:
+ nlmsg_free(skb);
+}
+
+static int ethnl_netdev_event(struct notifier_block *this, unsigned long event,
+ void *ptr)
+{
+ switch (event) {
+ case NETDEV_REGISTER:
+ ethnl_notify_devlist(ptr, ETHA_EVENT_NEWDEV, ETHA_NEWDEV_DEV);
+ break;
+ case NETDEV_UNREGISTER:
+ ethnl_notify_devlist(ptr, ETHA_EVENT_DELDEV, ETHA_DELDEV_DEV);
+ break;
+ case NETDEV_CHANGENAME:
+ ethnl_notify_devlist(ptr, ETHA_EVENT_RENAMEDEV,
+ ETHA_RENAMEDEV_DEV);
+ break;
+ }
+
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block ethnl_netdev_notifier = {
+ .notifier_call = ethnl_netdev_event,
+};
+
/* genetlink setup */
static const struct genl_ops ethtool_genl_ops[] = {
@@ -179,6 +240,10 @@ static int __init ethnl_init(void)
if (ret < 0)
panic("ethtool: could not register genetlink family\n");
+ ret = register_netdevice_notifier(ðnl_netdev_notifier);
+ if (ret < 0)
+ panic("ethtool: could not register netdev notifier\n");
+
return 0;
}
--
2.20.1
^ permalink raw reply related
* [RFC PATCH net-next v3 06/21] ethtool: support for netlink notifications
From: Michal Kubecek @ 2019-02-18 18:21 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Add infrastructure for ethtool netlink notifications. There is only one
multicast group "monitor" which is used to notify userspace about changes.
Notifications are supposed to be broadcasted on every configuration change,
whether it is done using the netlink interface or legacy ioctl one.
To trigger an ethtool notification, both ethtool netlink and external code
use ethtool_notify() helper. This helper requires RTNL to be held and may
sleep.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
include/linux/ethtool_netlink.h | 5 +++++
include/linux/netdevice.h | 12 +++++++++++
include/uapi/linux/ethtool_netlink.h | 2 ++
net/ethtool/netlink.c | 32 ++++++++++++++++++++++++++++
net/ethtool/netlink.h | 2 ++
5 files changed, 53 insertions(+)
diff --git a/include/linux/ethtool_netlink.h b/include/linux/ethtool_netlink.h
index 0412adb4f42f..2a15e64a16f3 100644
--- a/include/linux/ethtool_netlink.h
+++ b/include/linux/ethtool_netlink.h
@@ -5,5 +5,10 @@
#include <uapi/linux/ethtool_netlink.h>
#include <linux/ethtool.h>
+#include <linux/netdevice.h>
+
+enum ethtool_multicast_groups {
+ ETHNL_MCGRP_MONITOR,
+};
#endif /* _LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index aab4d9f6613d..9a50a67f328f 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -4340,6 +4340,18 @@ struct netdev_notifier_bonding_info {
void netdev_bonding_info_change(struct net_device *dev,
struct netdev_bonding_info *bonding_info);
+#if IS_ENABLED(CONFIG_ETHTOOL_NETLINK)
+void ethtool_notify(struct net_device *dev, struct netlink_ext_ack *extack,
+ unsigned int cmd, u32 req_mask, const void *data);
+#else
+static inline void ethtool_notify(struct net_device *dev,
+ struct netlink_ext_ack *extack,
+ unsigned int cmd, u32 req_mask,
+ const void *data)
+{
+}
+#endif
+
static inline
struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features)
{
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index 7f3d401977b4..b662d75a0636 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -59,4 +59,6 @@ enum {
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
+#define ETHTOOL_MCGRP_MONITOR_NAME "monitor"
+
#endif /* _UAPI_LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index ffdcc7c9d4bc..a5fa54c2b743 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c
@@ -4,6 +4,8 @@
#include <linux/ethtool_netlink.h>
#include "netlink.h"
+u32 ethnl_bcast_seq;
+
static const struct nla_policy dev_policy[ETHA_DEV_MAX + 1] = {
[ETHA_DEV_UNSPEC] = { .type = NLA_REJECT },
[ETHA_DEV_INDEX] = { .type = NLA_U32 },
@@ -122,11 +124,39 @@ struct sk_buff *ethnl_reply_init(size_t payload, struct net_device *dev, u8 cmd,
return NULL;
}
+/* notifications */
+
+typedef void (*ethnl_notify_handler_t)(struct net_device *dev,
+ struct netlink_ext_ack *extack,
+ unsigned int cmd, u32 req_mask,
+ const void *data);
+
+ethnl_notify_handler_t ethnl_notify_handlers[] = {
+};
+
+void ethtool_notify(struct net_device *dev, struct netlink_ext_ack *extack,
+ unsigned int cmd, u32 req_mask, const void *data)
+{
+ ASSERT_RTNL();
+
+ if (likely(cmd < ARRAY_SIZE(ethnl_notify_handlers) &&
+ ethnl_notify_handlers[cmd]))
+ ethnl_notify_handlers[cmd](dev, extack, cmd, req_mask, data);
+ else
+ WARN_ONCE(1, "notification %u not implemented (dev=%s, req_mask=0x%x)\n",
+ cmd, netdev_name(dev), req_mask);
+}
+EXPORT_SYMBOL(ethtool_notify);
+
/* genetlink setup */
static const struct genl_ops ethtool_genl_ops[] = {
};
+static const struct genl_multicast_group ethtool_nl_mcgrps[] = {
+ [ETHNL_MCGRP_MONITOR] = { .name = ETHTOOL_MCGRP_MONITOR_NAME },
+};
+
struct genl_family ethtool_genl_family = {
.hdrsize = 0,
.name = ETHTOOL_GENL_NAME,
@@ -135,6 +165,8 @@ struct genl_family ethtool_genl_family = {
.parallel_ops = true,
.ops = ethtool_genl_ops,
.n_ops = ARRAY_SIZE(ethtool_genl_ops),
+ .mcgrps = ethtool_nl_mcgrps,
+ .n_mcgrps = ARRAY_SIZE(ethtool_nl_mcgrps),
};
/* module setup */
diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
index ba638eb5a99a..78385baeaec0 100644
--- a/net/ethtool/netlink.h
+++ b/net/ethtool/netlink.h
@@ -11,6 +11,8 @@
#define ETHNL_SET_ERRMSG(info, msg) \
do { if (info) GENL_SET_ERR_MSG(info, msg); } while (0)
+extern u32 ethnl_bcast_seq;
+
extern struct genl_family ethtool_genl_family;
struct net_device *ethnl_dev_get(struct genl_info *info, struct nlattr *nest);
--
2.20.1
^ permalink raw reply related
* [RFC PATCH net-next v3 05/21] ethtool: netlink bitset handling
From: Michal Kubecek @ 2019-02-18 18:21 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Declare attribute type constants and add helper functions to generate and
parse arbitrary length bit sets.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
Documentation/networking/ethtool-netlink.txt | 63 ++
include/uapi/linux/ethtool_netlink.h | 32 ++
net/ethtool/Makefile | 2 +-
net/ethtool/bitset.c | 572 +++++++++++++++++++
net/ethtool/bitset.h | 40 ++
net/ethtool/netlink.h | 9 +
6 files changed, 717 insertions(+), 1 deletion(-)
create mode 100644 net/ethtool/bitset.c
create mode 100644 net/ethtool/bitset.h
diff --git a/Documentation/networking/ethtool-netlink.txt b/Documentation/networking/ethtool-netlink.txt
index 09c36e0392a8..205ae4462e9e 100644
--- a/Documentation/networking/ethtool-netlink.txt
+++ b/Documentation/networking/ethtool-netlink.txt
@@ -59,6 +59,69 @@ provided by kernel. In dump requests, device is not specified and kernel
replies with one message per network device (only those for which the request
is supported).
+Bit sets
+--------
+
+For short bitmaps of (reasonably) fixed length, standard NLA_BITFIELD32 type
+is used. For arbitrary length bitmaps, ethtool netlink uses a nested attribute
+with contents of one of two forms: compact (two binary bitmaps representing
+bit values and mask of affected bits) and bit-by-bit (list of bits identified
+by either index or name).
+
+Compact form: nested (bitset) atrribute contents:
+
+ ETHA_BITSET_LIST (flag) no mask, only a list
+ ETHA_BITSET_SIZE (u32) number of significant bits
+ ETHA_BITSET_VALUE (binary) bitmap of bit values
+ ETHA_BITSET_MASK (binary) bitmap of valid bits
+
+Value and mask must have length at least ETHA_BITSET_SIZE bits rounded up to
+a multiple of 32 bits. They consist of 32-bit words in host byte order, words
+ordered from least significant to most significant (i.e. the same way as
+bitmaps are passed with ioctl interface).
+
+For compact form, ETHA_BITSET_SIZE and ETHA_BITSET_VALUE are mandatory.
+Similar to BITFIELD32, a compact form bit set requests to set bits in the mask
+to 1 (if the bit is set in value) or 0 (if not) and preserve the rest. If
+ETHA_BITSET_LIST is present, there is no mask and bitset represents a simple
+list of bits.
+
+Kernel bit set length may differ from userspace length if older application is
+used on newer kernel or vice versa. If userspace bitmap is longer, an error is
+issued only if the request actually tries to set values of some bits not
+recognized by kernel.
+
+Bit-by-bit form: nested (bitset) attribute contents:
+
+ ETHA_BITSET_LIST (flag) no mask, only a list
+ ETHA_BITSET_SIZE (u32) number of significant bits (optional)
+ ETHA_BITSET_BITS (nested) array of bits
+ ETHA_BITSET_BIT
+ ETHA_BIT_INDEX (u32) bit index (0 for LSB)
+ ETHA_BIT_NAME (string) bit name
+ ETHA_BIT_VALUE (flag) present if bit is set
+ ETHA_BITSET_BIT
+ ...
+
+Bit size is optional for bit-by-bit form. ETHA_BITSET_BITS nest can only
+contain ETHA_BITS_BIT attributes but there can be an arbitrary number of them.
+A bit may be identified by its index or by its name. When used in requests,
+listed bits are set to 0 or 1 according to ETHA_BIT_VALUE, the rest is
+preserved. A request fails if index exceeds kernel bit length or if name is
+not recognized.
+
+When ETHA_BITSET_LIST flag is present, bitset is interpreted as a simple bit
+list. ETHA_BIT_VALUE attributes are not used in such case. Bit list represents
+a bitmap with listed bits set and the rest zero.
+
+In requests, application can use either form. Form used by kernel in reply is
+determined by a flag in flags field of request header. Semantics of value and
+mask depends on the attribute. General idea is that flags control request
+processing, info_mask control which parts of the information are returned in
+"get" request and index identifies a particular subcommand or an object to
+which the request applies.
+
+
List of message types
---------------------
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index 01896a1ee21a..7f3d401977b4 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -23,6 +23,38 @@ enum {
ETHA_DEV_MAX = (__ETHA_DEV_CNT - 1)
};
+/* bit sets */
+
+enum {
+ ETHA_BIT_UNSPEC,
+ ETHA_BIT_INDEX, /* u32 */
+ ETHA_BIT_NAME, /* string */
+ ETHA_BIT_VALUE, /* flag */
+
+ __ETHA_BIT_CNT,
+ ETHA_BIT_MAX = (__ETHA_BIT_CNT - 1)
+};
+
+enum {
+ ETHA_BITS_UNSPEC,
+ ETHA_BITS_BIT,
+
+ __ETHA_BITS_CNT,
+ ETHA_BITS_MAX = (__ETHA_BITS_CNT - 1)
+};
+
+enum {
+ ETHA_BITSET_UNSPEC,
+ ETHA_BITSET_LIST, /* flag */
+ ETHA_BITSET_SIZE, /* u32 */
+ ETHA_BITSET_BITS, /* nest - ETHA_BITS_* */
+ ETHA_BITSET_VALUE, /* binary */
+ ETHA_BITSET_MASK, /* binary */
+
+ __ETHA_BITSET_CNT,
+ ETHA_BITSET_MAX = (__ETHA_BITSET_CNT - 1)
+};
+
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
index f30e0da88be5..482fdb9380fa 100644
--- a/net/ethtool/Makefile
+++ b/net/ethtool/Makefile
@@ -4,4 +4,4 @@ obj-y += ioctl.o
obj-$(CONFIG_ETHTOOL_NETLINK) += ethtool_nl.o
-ethtool_nl-y := netlink.o
+ethtool_nl-y := netlink.o bitset.o
diff --git a/net/ethtool/bitset.c b/net/ethtool/bitset.c
new file mode 100644
index 000000000000..8f5c60999a96
--- /dev/null
+++ b/net/ethtool/bitset.c
@@ -0,0 +1,572 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+
+#include <linux/ethtool_netlink.h>
+#include <linux/bitmap.h>
+#include "netlink.h"
+#include "bitset.h"
+
+static bool ethnl_test_bit(const void *val, unsigned int index, bool is_u32)
+{
+ if (!val)
+ return true;
+ else if (is_u32)
+ return ((const u32 *)val)[index / 32] & (1U << (index % 32));
+ else
+ return test_bit(index, val);
+}
+
+static void __bitmap_to_u32(u32 *dst, const void *src, unsigned int size,
+ bool is_u32)
+{
+ unsigned int full_words = size / 32;
+ const u32 *src32 = src;
+
+ if (!is_u32) {
+ bitmap_to_arr32(dst, src, size);
+ return;
+ }
+
+ memcpy(dst, src32, full_words * sizeof(u32));
+ if (size % 32 != 0)
+ dst[full_words] = src32[full_words] & ((1U << (size % 32)) - 1);
+}
+
+/* convert standard kernel bitmap (long sized words) to ethtool one (u32 words)
+ * bitmap_to_arr32() is not guaranteed to do "in place" conversion correctly;
+ * moreover, we can use the fact that the conversion is no-op except for 64-bit
+ * big endian architectures
+ */
+#if BITS_PER_LONG == 64 && defined(__BIG_ENDIAN)
+void ethnl_bitmap_to_u32(unsigned long *bitmap, unsigned int nwords)
+{
+ u32 *dst = (u32 *)bitmap;
+ unsigned int i;
+
+ for (i = 0; i < nwords; i++) {
+ unsigned long tmp = READ_ONCE(bitmap[i]);
+
+ dst[2 * i] = tmp & 0xffffffff;
+ dst[2 * i + 1] = tmp >> 32;
+ }
+}
+#endif
+
+static const char *bit_name(const void *names, bool legacy, unsigned int idx)
+{
+ const char (*const legacy_names)[ETH_GSTRING_LEN] = names;
+ const char *const *simple_names = names;
+
+ return legacy ? legacy_names[idx] : simple_names[idx];
+}
+
+/* calculate size for a bitset attribute
+ * see ethnl_put_bitset() for arguments
+ */
+static int __ethnl_bitset_size(unsigned int size, const void *val,
+ const void *mask, const void *names,
+ unsigned int flags)
+{
+ const bool legacy = flags & ETHNL_BITSET_LEGACY_NAMES;
+ const bool compact = flags & ETHNL_BITSET_COMPACT;
+ const bool is_list = flags & ETHNL_BITSET_LIST;
+ const bool is_u32 = flags & ETHNL_BITSET_U32;
+ unsigned int nwords = DIV_ROUND_UP(size, 32);
+ unsigned int len = 0;
+
+ if (WARN_ON(!compact && !names))
+ return -EINVAL;
+ /* list flag */
+ if (flags & ETHNL_BITSET_LIST)
+ len += nla_total_size(sizeof(u32));
+ /* size */
+ len += nla_total_size(sizeof(u32));
+
+ if (compact) {
+ /* values, mask */
+ len += 2 * nla_total_size(nwords * sizeof(u32));
+ } else {
+ unsigned int bits_len = 0;
+ unsigned int bit_len, i;
+
+ for (i = 0; i < size; i++) {
+ const char *name = bit_name(names, legacy, i) ?: "";
+
+ if ((is_list || mask) &&
+ !ethnl_test_bit(is_list ? val : mask, i, is_u32))
+ continue;
+ /* index */
+ bit_len = nla_total_size(sizeof(u32));
+ /* name */
+ bit_len += ethnl_str_size(name);
+ /* value */
+ if (!is_list && ethnl_test_bit(val, i, is_u32))
+ bit_len += nla_total_size(0);
+
+ /* bit nest */
+ bits_len += nla_total_size(bit_len);
+ }
+ /* bits nest */
+ len += nla_total_size(bits_len);
+ }
+
+ /* outermost nest */
+ return nla_total_size(len);
+}
+
+int ethnl_bitset_size(unsigned int size, const unsigned long *val,
+ const unsigned long *mask, const void *names,
+ unsigned int flags)
+{
+ return __ethnl_bitset_size(size, val, mask, names,
+ flags & ~ETHNL_BITSET_U32);
+}
+
+int ethnl_bitset32_size(unsigned int size, const u32 *val, const u32 *mask,
+ const void *names, unsigned int flags)
+{
+ return __ethnl_bitset_size(size, val, mask, names,
+ flags | ETHNL_BITSET_U32);
+}
+
+/* put bitset into a message
+ * skb: skb with the message
+ * attrtype: attribute type for the bitset
+ * size: size of the set in bits
+ * val: bitset values
+ * mask: mask of valid bits; NULL is interpreted as "all bits"
+ * names: bit names (only used for verbose format)
+ * flags: combination of ETHNL_BITSET_* flags
+ */
+static int __ethnl_put_bitset(struct sk_buff *skb, int attrtype,
+ unsigned int size, const void *val,
+ const void *mask, const void *names,
+ unsigned int flags)
+{
+ const bool legacy = flags & ETHNL_BITSET_LEGACY_NAMES;
+ const bool compact = flags & ETHNL_BITSET_COMPACT;
+ const bool is_list = flags & ETHNL_BITSET_LIST;
+ const bool is_u32 = flags & ETHNL_BITSET_U32;
+ struct nlattr *nest;
+ struct nlattr *attr;
+ int ret;
+
+ if (WARN_ON(!compact && !names))
+ return -EINVAL;
+ nest = ethnl_nest_start(skb, attrtype);
+ if (!nest)
+ return -EMSGSIZE;
+
+ ret = -EMSGSIZE;
+ if (is_list && nla_put_flag(skb, ETHA_BITSET_LIST))
+ goto err;
+ if (nla_put_u32(skb, ETHA_BITSET_SIZE, size))
+ goto err;
+ if (compact) {
+ unsigned int bytesize = DIV_ROUND_UP(size, 32) * sizeof(u32);
+
+ attr = nla_reserve(skb, ETHA_BITSET_VALUE, bytesize);
+ if (!attr)
+ goto err;
+ __bitmap_to_u32(nla_data(attr), val, size, is_u32);
+ if (mask) {
+ attr = nla_reserve(skb, ETHA_BITSET_MASK, bytesize);
+ if (!attr)
+ goto err;
+ __bitmap_to_u32(nla_data(attr), mask, size, is_u32);
+ }
+ } else {
+ struct nlattr *bits;
+ unsigned int i;
+
+ bits = ethnl_nest_start(skb, ETHA_BITSET_BITS);
+ if (!bits)
+ goto err;
+ for (i = 0; i < size; i++) {
+ const char *name = bit_name(names, legacy, i) ?: "";
+
+ if ((is_list || mask) &&
+ !ethnl_test_bit(is_list ? val : mask, i, is_u32))
+ continue;
+ attr = ethnl_nest_start(skb, ETHA_BITS_BIT);
+ if (!attr ||
+ nla_put_u32(skb, ETHA_BIT_INDEX, i) ||
+ nla_put_string(skb, ETHA_BIT_NAME, name))
+ goto err;
+ if (!is_list && ethnl_test_bit(val, i, is_u32) &&
+ nla_put_flag(skb, ETHA_BIT_VALUE))
+ goto err;
+ nla_nest_end(skb, attr);
+ }
+ nla_nest_end(skb, bits);
+ }
+
+ nla_nest_end(skb, nest);
+ return 0;
+err:
+ nla_nest_cancel(skb, nest);
+ return ret;
+}
+
+int ethnl_put_bitset(struct sk_buff *skb, int attrtype, unsigned int size,
+ const unsigned long *val, const unsigned long *mask,
+ const void *names, unsigned int flags)
+{
+ return __ethnl_put_bitset(skb, attrtype, size, val, mask, names,
+ flags & ~ETHNL_BITSET_U32);
+}
+
+int ethnl_put_bitset32(struct sk_buff *skb, int attrtype, unsigned int size,
+ const u32 *val, const u32 *mask, const void *names,
+ unsigned int flags)
+{
+ return __ethnl_put_bitset(skb, attrtype, size, val, mask, names,
+ flags | ETHNL_BITSET_U32);
+}
+
+static const struct nla_policy bitset_policy[ETHA_BITSET_MAX + 1] = {
+ [ETHA_BITSET_UNSPEC] = { .type = NLA_REJECT },
+ [ETHA_BITSET_LIST] = { .type = NLA_FLAG },
+ [ETHA_BITSET_SIZE] = { .type = NLA_U32 },
+ [ETHA_BITSET_BITS] = { .type = NLA_NESTED },
+ [ETHA_BITSET_VALUE] = { .type = NLA_BINARY },
+ [ETHA_BITSET_MASK] = { .type = NLA_BINARY },
+};
+
+static const struct nla_policy bit_policy[ETHA_BIT_MAX + 1] = {
+ [ETHA_BIT_UNSPEC] = { .type = NLA_REJECT },
+ [ETHA_BIT_INDEX] = { .type = NLA_U32 },
+ [ETHA_BIT_NAME] = { .type = NLA_NUL_STRING },
+ [ETHA_BIT_VALUE] = { .type = NLA_FLAG },
+};
+
+static int ethnl_name_to_idx(const void *names, bool legacy,
+ unsigned int n_names, const char *name,
+ unsigned int name_len)
+{
+ unsigned int i;
+
+ for (i = 0; i < n_names; i++) {
+ const char *bname = bit_name(names, legacy, i);
+
+ if (bname && !strncmp(bname, name, name_len) &&
+ strlen(bname) <= name_len)
+ return i;
+ }
+
+ return n_names;
+}
+
+static int ethnl_update_bit(unsigned long *bitmap, unsigned long *bitmask,
+ unsigned int nbits, const struct nlattr *bit_attr,
+ bool is_list, const void *names, bool legacy,
+ struct genl_info *info)
+{
+ struct nlattr *tb[ETHA_BIT_MAX + 1];
+ int ret, idx;
+
+ if (nla_type(bit_attr) != ETHA_BITS_BIT) {
+ ETHNL_SET_ERRMSG(info,
+ "ETHA_BITSET_BITS can contain only ETHA_BITS_BIT");
+ return genl_err_attr(info, -EINVAL, bit_attr);
+ }
+ ret = nla_parse_nested(tb, ETHA_BIT_MAX, bit_attr, bit_policy,
+ info->extack);
+ if (ret < 0)
+ return ret;
+
+ if (tb[ETHA_BIT_INDEX]) {
+ const char *name;
+
+ idx = nla_get_u32(tb[ETHA_BIT_INDEX]);
+ if (idx >= nbits) {
+ ETHNL_SET_ERRMSG(info, "bit index too high");
+ return genl_err_attr(info, -EOPNOTSUPP,
+ tb[ETHA_BIT_INDEX]);
+ }
+ name = bit_name(names, legacy, idx);
+ if (tb[ETHA_BIT_NAME] && name &&
+ strncmp(nla_data(tb[ETHA_BIT_NAME]), name,
+ nla_len(tb[ETHA_BIT_NAME]))) {
+ ETHNL_SET_ERRMSG(info, "bit index and name mismatch");
+ return genl_err_attr(info, -EINVAL, bit_attr);
+ }
+ } else if (tb[ETHA_BIT_NAME]) {
+ idx = ethnl_name_to_idx(names, legacy, nbits,
+ nla_data(tb[ETHA_BIT_NAME]),
+ nla_len(tb[ETHA_BIT_NAME]));
+ if (idx >= nbits) {
+ ETHNL_SET_ERRMSG(info, "bit name not found");
+ return genl_err_attr(info, -EOPNOTSUPP,
+ tb[ETHA_BIT_NAME]);
+ }
+ } else {
+ ETHNL_SET_ERRMSG(info, "neither bit index nor name specified");
+ return genl_err_attr(info, -EINVAL, bit_attr);
+ }
+
+ if (is_list || tb[ETHA_BIT_VALUE])
+ set_bit(idx, bitmap);
+ else
+ clear_bit(idx, bitmap);
+ if (!is_list || bitmask)
+ set_bit(idx, bitmask);
+ return 0;
+}
+
+int ethnl_bitset_is_compact(const struct nlattr *bitset, bool *compact)
+{
+ struct nlattr *tb[ETHA_BITSET_MAX + 1];
+ int ret;
+
+ ret = nla_parse_nested(tb, ETHA_BITSET_MAX, bitset, bitset_policy,
+ NULL);
+ if (ret < 0)
+ return ret;
+
+ if (tb[ETHA_BITSET_BITS]) {
+ if (tb[ETHA_BITSET_VALUE] || tb[ETHA_BITSET_MASK])
+ return -EINVAL;
+ *compact = false;
+ return 0;
+ }
+ if (!tb[ETHA_BITSET_SIZE] || !tb[ETHA_BITSET_VALUE])
+ return -EINVAL;
+
+ *compact = true;
+ return 0;
+}
+
+/* 64-bit long endian is the only case when u32 based bitmap and unsigned long
+ * based bitmap layouts differ
+ */
+#if BITS_PER_LONG == 64 && defined(__BIG_ENDIAN)
+/* dst &= src */
+static void __bitmap_and_u32(unsigned long *dst, const u32 *src,
+ unsigned int nbits)
+{
+ unsigned long op;
+
+ while (nbits >= BITS_PER_LONG) {
+ op = src[0] | ((unsigned long)src[1] << 32);
+ *dst &= op;
+
+ dst++;
+ src += 2;
+ nbits -= BITS_PER_LONG;
+ }
+
+ if (!nbits)
+ return;
+ op = src[0];
+ if (nbits > 32)
+ op |= ((unsigned long)src[1] << 32);
+ *dst = (op & BITMAP_LAST_WORD_MASK(nbits));
+}
+
+/* map1 == map2 */
+static bool __bitmap_equal_u32(const unsigned long *map1, const u32 *map2,
+ unsigned int nbits)
+{
+ unsigned long dword;
+
+ while (nbits >= BITS_PER_LONG) {
+ dword = map2[0] | ((unsigned long)map2[1] << 32);
+ if (*map1 != dword)
+ return false;
+
+ map1++;
+ map2 += 2;
+ nbits -= BITS_PER_LONG;
+ }
+
+ if (!nbits)
+ return true;
+ dword = map2[0];
+ if (nbits > 32)
+ dword |= ((unsigned long)map2[1] << 32);
+ return !((*map1 ^ dword) & BITMAP_LAST_WORD_MASK(nbits));
+}
+#else
+/* On 32-bit and 64-bit LE, unsigned long and u32 bitmap layout is the same
+ * but we must not write past dst buffer if the number of words is odd.
+ */
+static void __bitmap_and_u32(unsigned long *dst, const u32 *src,
+ unsigned int nbits)
+{
+ u32 *dst32 = (u32 *)dst;
+
+ while (nbits >= 32) {
+ *dst32++ &= *src++;
+ nbits -= 32;
+ }
+ if (!nbits)
+ return;
+ *dst32 &= (*src & ((1U << nbits) - 1));
+}
+
+static bool __bitmap_equal_u32(const unsigned long *map1, const u32 *map2,
+ unsigned int nbits)
+{
+ unsigned int full_words = nbits / 32;
+ u32 last_word_mask;
+ u32 *map1_32 = (u32 *)map1;
+
+ if (memcmp(map1, map2, full_words * BITS_PER_BYTE))
+ return false;
+ if (!(nbits % 32))
+ return true;
+ last_word_mask = (1U << (nbits % 32)) - 1;
+ return !((map1_32[full_words] ^ map2[full_words]) & last_word_mask);
+}
+#endif
+
+/* copy unsigned long bitmap to unsigned long or u32 */
+static void __bitmap_to_any(void *dst, const unsigned long *src,
+ unsigned int nbits, bool dst_is_u32)
+{
+ if (dst_is_u32)
+ bitmap_to_arr32(dst, src, nbits);
+ else
+ bitmap_copy(dst, src, nbits);
+}
+
+static bool __bitmap_equal_any(const unsigned long *map1, const void *map2,
+ unsigned int nbits, bool is_u32)
+{
+ if (!is_u32)
+ return bitmap_equal(map1, map2, nbits);
+ else
+ return __bitmap_equal_u32(map1, map2, nbits);
+}
+
+static bool __ethnl_update_bitset(void *bitmap, void *bitmask,
+ unsigned int nbits, const struct nlattr *attr,
+ int *err, const void *names, bool legacy,
+ struct genl_info *info, bool is_u32)
+{
+ struct nlattr *tb[ETHA_BITSET_MAX + 1];
+ unsigned int change_bits = 0;
+ unsigned int max_bits = 0;
+ unsigned long *val, *mask;
+ bool mod = false;
+ bool is_list;
+
+ *err = 0;
+ if (!attr)
+ return mod;
+ *err = nla_parse_nested(tb, ETHA_BITSET_MAX, attr, bitset_policy,
+ info->extack);
+ if (*err < 0)
+ return mod;
+ *err = -EINVAL;
+ if (tb[ETHA_BITSET_BITS] &&
+ (tb[ETHA_BITSET_VALUE] || tb[ETHA_BITSET_MASK]))
+ return mod;
+ if (!tb[ETHA_BITSET_BITS] &&
+ (!tb[ETHA_BITSET_SIZE] || !tb[ETHA_BITSET_VALUE]))
+ return mod;
+ is_list = (tb[ETHA_BITSET_LIST] != NULL);
+ if (is_list && tb[ETHA_BITSET_MASK])
+ return mod;
+
+ /* To let new userspace to work with old kernel, we allow bitmaps
+ * from userspace to be longer than kernel ones and only issue an
+ * error if userspace actually tries to change a bit not existing
+ * in kernel.
+ */
+ if (tb[ETHA_BITSET_SIZE])
+ change_bits = nla_get_u32(tb[ETHA_BITSET_SIZE]);
+ max_bits = max_t(unsigned int, nbits, change_bits);
+ mask = bitmap_zalloc(max_bits, GFP_KERNEL);
+ val = bitmap_zalloc(max_bits, GFP_KERNEL);
+
+ if (tb[ETHA_BITSET_BITS]) {
+ struct nlattr *bit_attr;
+ int rem;
+
+ if (is_list)
+ bitmap_fill(mask, nbits);
+ else if (is_u32)
+ bitmap_from_arr32(val, bitmap, nbits);
+ else
+ bitmap_copy(val, bitmap, nbits);
+ nla_for_each_nested(bit_attr, tb[ETHA_BITSET_BITS], rem) {
+ *err = ethnl_update_bit(val, mask, nbits, bit_attr,
+ is_list, names, legacy, info);
+ if (*err < 0)
+ goto out_free;
+ }
+ if (bitmask)
+ __bitmap_to_any(bitmask, mask, nbits, is_u32);
+ } else {
+ unsigned int change_words = DIV_ROUND_UP(change_bits, 32);
+
+ *err = 0;
+ if (change_bits == 0 && tb[ETHA_BITSET_MASK])
+ goto out_free;
+ *err = -EINVAL;
+ if (!tb[ETHA_BITSET_VALUE])
+ goto out_free;
+ if (nla_len(tb[ETHA_BITSET_VALUE]) < change_words * sizeof(u32))
+ goto out_free;
+ if (tb[ETHA_BITSET_MASK] &&
+ nla_len(tb[ETHA_BITSET_MASK]) < change_words * sizeof(u32))
+ goto out_free;
+
+ bitmap_from_arr32(val, nla_data(tb[ETHA_BITSET_VALUE]),
+ change_bits);
+ if (tb[ETHA_BITSET_MASK])
+ bitmap_from_arr32(mask, nla_data(tb[ETHA_BITSET_MASK]),
+ change_bits);
+ else
+ bitmap_fill(mask, nbits);
+
+ if (nbits < change_bits) {
+ unsigned int idx = find_next_bit(mask, max_bits, nbits);
+
+ *err = -EINVAL;
+ if (idx < max_bits)
+ goto out_free;
+ }
+
+ if (bitmask)
+ __bitmap_to_any(bitmask, mask, nbits, is_u32);
+ if (!is_list) {
+ bitmap_and(val, val, mask, nbits);
+ bitmap_complement(mask, mask, nbits);
+ if (is_u32)
+ __bitmap_and_u32(mask, bitmap, nbits);
+ else
+ bitmap_and(mask, mask, bitmap, nbits);
+ bitmap_or(val, val, mask, nbits);
+ }
+ }
+
+ mod = !__bitmap_equal_any(val, bitmap, nbits, is_u32);
+ if (mod)
+ __bitmap_to_any(bitmap, val, nbits, is_u32);
+
+ *err = 0;
+out_free:
+ bitmap_free(val);
+ bitmap_free(mask);
+ return mod;
+}
+
+bool ethnl_update_bitset(unsigned long *bitmap, unsigned long *bitmask,
+ unsigned int nbits, const struct nlattr *attr,
+ int *err, const void *names, bool legacy,
+ struct genl_info *info)
+{
+ return __ethnl_update_bitset(bitmap, bitmask, nbits, attr, err, names,
+ legacy, info, false);
+}
+
+bool ethnl_update_bitset32(u32 *bitmap, u32 *bitmask, unsigned int nbits,
+ const struct nlattr *attr, int *err,
+ const void *names, bool legacy,
+ struct genl_info *info)
+{
+ return __ethnl_update_bitset(bitmap, bitmask, nbits, attr, err, names,
+ legacy, info, true);
+}
diff --git a/net/ethtool/bitset.h b/net/ethtool/bitset.h
new file mode 100644
index 000000000000..761d0c47fe23
--- /dev/null
+++ b/net/ethtool/bitset.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+
+#ifndef _NET_ETHTOOL_BITSET_H
+#define _NET_ETHTOOL_BITSET_H
+
+/* when set, value and mask bitmaps are arrays of u32, when not, arrays of
+ * unsigned long
+ */
+#define ETHNL_BITSET_U32 BIT(0)
+/* generate a compact format bitset */
+#define ETHNL_BITSET_COMPACT BIT(1)
+/* generate a bit list */
+#define ETHNL_BITSET_LIST BIT(2)
+/* when set, names are interpreted as legacy string set (an array of
+ * char[ETH_GSTRING_LEN]), when not, as a simple array of char *
+ */
+#define ETHNL_BITSET_LEGACY_NAMES BIT(3)
+
+int ethnl_bitset_is_compact(const struct nlattr *bitset, bool *compact);
+int ethnl_bitset_size(unsigned int size, const unsigned long *val,
+ const unsigned long *mask, const void *names,
+ unsigned int flags);
+int ethnl_bitset32_size(unsigned int size, const u32 *val, const u32 *mask,
+ const void *names, unsigned int flags);
+int ethnl_put_bitset(struct sk_buff *skb, int attrtype, unsigned int size,
+ const unsigned long *val, const unsigned long *mask,
+ const void *names, unsigned int flags);
+int ethnl_put_bitset32(struct sk_buff *skb, int attrtype, unsigned int size,
+ const u32 *val, const u32 *mask, const void *names,
+ unsigned int flags);
+bool ethnl_update_bitset(unsigned long *bitmap, unsigned long *bitmask,
+ unsigned int nbits, const struct nlattr *attr,
+ int *err, const void *names, bool legacy,
+ struct genl_info *info);
+bool ethnl_update_bitset32(u32 *bitmap, u32 *bitmask, unsigned int nbits,
+ const struct nlattr *attr, int *err,
+ const void *names, bool legacy,
+ struct genl_info *info);
+
+#endif /* _NET_ETHTOOL_BITSET_H */
diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
index 36a397656127..ba638eb5a99a 100644
--- a/net/ethtool/netlink.h
+++ b/net/ethtool/netlink.h
@@ -20,6 +20,15 @@ struct sk_buff *ethnl_reply_init(size_t payload, struct net_device *dev, u8 cmd,
u16 dev_attrtype, struct genl_info *info,
void **ehdrp);
+#if BITS_PER_LONG == 64 && defined(__BIG_ENDIAN)
+void ethnl_bitmap_to_u32(unsigned long *bitmap, unsigned int nwords);
+#else
+static inline void ethnl_bitmap_to_u32(unsigned long *bitmap,
+ unsigned int nwords)
+{
+}
+#endif
+
static inline int ethnl_str_size(const char *s)
{
return nla_total_size(strlen(s) + 1);
--
2.20.1
^ permalink raw reply related
* [RFC PATCH net-next v3 04/21] ethtool: helper functions for netlink interface
From: Michal Kubecek @ 2019-02-18 18:21 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Various helpers used by ethtool netlink code.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
include/uapi/linux/ethtool_netlink.h | 11 +++
net/ethtool/netlink.c | 119 +++++++++++++++++++++++
net/ethtool/netlink.h | 135 +++++++++++++++++++++++++++
3 files changed, 265 insertions(+)
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
index d8a8d3c72c2f..01896a1ee21a 100644
--- a/include/uapi/linux/ethtool_netlink.h
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -12,6 +12,17 @@ enum {
ETHNL_CMD_MAX = (__ETHNL_CMD_CNT - 1)
};
+/* device specification */
+
+enum {
+ ETHA_DEV_UNSPEC,
+ ETHA_DEV_INDEX, /* u32 */
+ ETHA_DEV_NAME, /* string */
+
+ __ETHA_DEV_CNT,
+ ETHA_DEV_MAX = (__ETHA_DEV_CNT - 1)
+};
+
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index 5fe3e5b68e81..ffdcc7c9d4bc 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c
@@ -1,8 +1,127 @@
// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#include <net/sock.h>
#include <linux/ethtool_netlink.h>
#include "netlink.h"
+static const struct nla_policy dev_policy[ETHA_DEV_MAX + 1] = {
+ [ETHA_DEV_UNSPEC] = { .type = NLA_REJECT },
+ [ETHA_DEV_INDEX] = { .type = NLA_U32 },
+ [ETHA_DEV_NAME] = { .type = NLA_NUL_STRING,
+ .len = IFNAMSIZ - 1 },
+};
+
+struct net_device *ethnl_dev_get(struct genl_info *info, struct nlattr *nest)
+{
+ struct net *net = genl_info_net(info);
+ struct nlattr *tb[ETHA_DEV_MAX + 1];
+ struct net_device *dev;
+ int ret;
+
+ if (!nest) {
+ ETHNL_SET_ERRMSG(info,
+ "mandatory device identification missing");
+ return ERR_PTR(-EINVAL);
+ }
+ ret = nla_parse_nested(tb, ETHA_DEV_MAX, nest, dev_policy,
+ info->extack);
+ if (ret < 0)
+ return ERR_PTR(ret);
+
+ if (tb[ETHA_DEV_INDEX]) {
+ dev = dev_get_by_index(net, nla_get_u32(tb[ETHA_DEV_INDEX]));
+ if (!dev)
+ return ERR_PTR(-ENODEV);
+ /* if both ifindex and ifname are passed, they must match */
+ if (tb[ETHA_DEV_NAME]) {
+ const char *nl_name = nla_data(tb[ETHA_DEV_NAME]);
+
+ if (strncmp(dev->name, nl_name, IFNAMSIZ)) {
+ dev_put(dev);
+ ETHNL_SET_ERRMSG(info,
+ "ifindex and ifname do not match");
+ return ERR_PTR(-ENODEV);
+ }
+ }
+ return dev;
+ } else if (tb[ETHA_DEV_NAME]) {
+ dev = dev_get_by_name(net, nla_data(tb[ETHA_DEV_NAME]));
+ if (!dev)
+ return ERR_PTR(-ENODEV);
+ } else {
+ ETHNL_SET_ERRMSG(info, "either ifindex or ifname required");
+ return ERR_PTR(-EINVAL);
+ }
+
+ if (!netif_device_present(dev)) {
+ dev_put(dev);
+ ETHNL_SET_ERRMSG(info, "device not present");
+ return ERR_PTR(-ENODEV);
+ }
+ return dev;
+}
+
+int ethnl_fill_dev(struct sk_buff *msg, struct net_device *dev, u16 attrtype)
+{
+ struct nlattr *nest;
+ int ret = -EMSGSIZE;
+
+ nest = ethnl_nest_start(msg, attrtype);
+ if (!nest)
+ return -EMSGSIZE;
+
+ if (nla_put_u32(msg, ETHA_DEV_INDEX, (u32)dev->ifindex))
+ goto err;
+ if (nla_put_string(msg, ETHA_DEV_NAME, dev->name))
+ goto err;
+
+ nla_nest_end(msg, nest);
+ return 0;
+err:
+ nla_nest_cancel(msg, nest);
+ return ret;
+}
+
+/* create skb for a reply and fill device identification
+ * payload: payload length (without netlink and genetlink header)
+ * dev: device the reply is about (may be null)
+ * cmd: ETHNL_CMD_* command for reply
+ * info: info for the received packet we respond to
+ * ehdrp: place to store payload pointer returned by genlmsg_new()
+ * returns: skb or null on error
+ */
+struct sk_buff *ethnl_reply_init(size_t payload, struct net_device *dev, u8 cmd,
+ u16 dev_attrtype, struct genl_info *info,
+ void **ehdrp)
+{
+ void *ehdr;
+ struct sk_buff *rskb;
+
+ rskb = genlmsg_new(payload, GFP_KERNEL);
+ if (!rskb) {
+ ETHNL_SET_ERRMSG(info,
+ "failed to allocate reply message");
+ return NULL;
+ }
+
+ ehdr = genlmsg_put_reply(rskb, info, ðtool_genl_family, 0, cmd);
+ if (!ehdr)
+ goto err;
+ if (ehdrp)
+ *ehdrp = ehdr;
+ if (dev) {
+ int ret = ethnl_fill_dev(rskb, dev, dev_attrtype);
+
+ if (ret < 0)
+ goto err;
+ }
+
+ return rskb;
+err:
+ nlmsg_free(rskb);
+ return NULL;
+}
+
/* genetlink setup */
static const struct genl_ops ethtool_genl_ops[] = {
diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
index 63063b582ca2..36a397656127 100644
--- a/net/ethtool/netlink.h
+++ b/net/ethtool/netlink.h
@@ -6,7 +6,142 @@
#include <linux/ethtool_netlink.h>
#include <linux/netdevice.h>
#include <net/genetlink.h>
+#include <net/sock.h>
+
+#define ETHNL_SET_ERRMSG(info, msg) \
+ do { if (info) GENL_SET_ERR_MSG(info, msg); } while (0)
extern struct genl_family ethtool_genl_family;
+struct net_device *ethnl_dev_get(struct genl_info *info, struct nlattr *nest);
+int ethnl_fill_dev(struct sk_buff *msg, struct net_device *dev, u16 attrtype);
+
+struct sk_buff *ethnl_reply_init(size_t payload, struct net_device *dev, u8 cmd,
+ u16 dev_attrtype, struct genl_info *info,
+ void **ehdrp);
+
+static inline int ethnl_str_size(const char *s)
+{
+ return nla_total_size(strlen(s) + 1);
+}
+
+static inline int ethnl_str_ifne_size(const char *s)
+{
+ return s[0] ? ethnl_str_size(s) : 0;
+}
+
+static inline int ethnl_put_str_ifne(struct sk_buff *skb, int attrtype,
+ const char *s)
+{
+ if (!s[0])
+ return 0;
+ return nla_put_string(skb, attrtype, s);
+}
+
+static inline struct nlattr *ethnl_nest_start(struct sk_buff *skb,
+ int attrtype)
+{
+ return nla_nest_start(skb, attrtype | NLA_F_NESTED);
+}
+
+/* ethnl_update_* return true if the value is changed */
+static inline bool ethnl_update_u32(u32 *dst, struct nlattr *attr)
+{
+ u32 val;
+
+ if (!attr)
+ return false;
+ val = nla_get_u32(attr);
+ if (*dst == val)
+ return false;
+
+ *dst = val;
+ return true;
+}
+
+static inline bool ethnl_update_u8(u8 *dst, struct nlattr *attr)
+{
+ u8 val;
+
+ if (!attr)
+ return false;
+ val = nla_get_u8(attr);
+ if (*dst == val)
+ return false;
+
+ *dst = val;
+ return true;
+}
+
+/* update u32 value used as bool from NLA_U8 */
+static inline bool ethnl_update_bool32(u32 *dst, struct nlattr *attr)
+{
+ u8 val;
+
+ if (!attr)
+ return false;
+ val = !!nla_get_u8(attr);
+ if (!!*dst == val)
+ return false;
+
+ *dst = val;
+ return true;
+}
+
+static inline bool ethnl_update_binary(u8 *dst, unsigned int len,
+ struct nlattr *attr)
+{
+ if (!attr)
+ return false;
+ if (nla_len(attr) < len)
+ len = nla_len(attr);
+ if (!memcmp(dst, nla_data(attr), len))
+ return false;
+
+ memcpy(dst, nla_data(attr), len);
+ return true;
+}
+
+static inline bool ethnl_update_bitfield32(u32 *dst, struct nlattr *attr)
+{
+ struct nla_bitfield32 change;
+ u32 newval;
+
+ if (!attr)
+ return false;
+ change = nla_get_bitfield32(attr);
+ newval = (*dst & ~change.selector) | (change.value & change.selector);
+ if (*dst == newval)
+ return false;
+
+ *dst = newval;
+ return true;
+}
+
+static inline void warn_partial_info(struct genl_info *info)
+{
+ ETHNL_SET_ERRMSG(info, "not all requested data could be retrieved");
+}
+
+/* Check user privileges explicitly to allow finer access control based on
+ * context of the request or hiding part of the information from unprivileged
+ * users
+ */
+static inline bool ethnl_is_privileged(struct sk_buff *skb)
+{
+ struct net *net = sock_net(skb->sk);
+
+ return netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN);
+}
+
+/* total size of ETHA_*_DEV nested attribute; this is an upper estimate so that
+ * we do not need to hold RTNL longer than necessary to prevent rename between
+ * estimating the size and composing the message
+ */
+static inline unsigned int dev_ident_size(void)
+{
+ return nla_total_size(nla_total_size(sizeof(u32)) +
+ nla_total_size(IFNAMSIZ));
+}
+
#endif /* _NET_ETHTOOL_NETLINK_H */
--
2.20.1
^ permalink raw reply related
* [RFC PATCH net-next v3 03/21] ethtool: introduce ethtool netlink interface
From: Michal Kubecek @ 2019-02-18 18:21 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
Basic genetlink and init infrastructure for the netlink interface, register
genetlink family "ethtool". Introduce CONFIG_ETHTOOL_NETLINK Kconfig
option. Add interface description into Documentation/networking.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
Documentation/networking/ethtool-netlink.txt | 167 +++++++++++++++++++
include/linux/ethtool_netlink.h | 9 +
include/uapi/linux/ethtool_netlink.h | 19 +++
net/Kconfig | 8 +
net/ethtool/Makefile | 6 +-
net/ethtool/netlink.c | 34 ++++
net/ethtool/netlink.h | 12 ++
7 files changed, 254 insertions(+), 1 deletion(-)
create mode 100644 Documentation/networking/ethtool-netlink.txt
create mode 100644 include/linux/ethtool_netlink.h
create mode 100644 include/uapi/linux/ethtool_netlink.h
create mode 100644 net/ethtool/netlink.c
create mode 100644 net/ethtool/netlink.h
diff --git a/Documentation/networking/ethtool-netlink.txt b/Documentation/networking/ethtool-netlink.txt
new file mode 100644
index 000000000000..09c36e0392a8
--- /dev/null
+++ b/Documentation/networking/ethtool-netlink.txt
@@ -0,0 +1,167 @@
+ Netlink interface for ethtool
+ =============================
+
+
+Basic information
+-----------------
+
+Netlink interface for ethtool uses generic netlink family "ethtool" (userspace
+application should use macros ETHTOOL_GENL_NAME and ETHTOOL_GENL_VERSION
+defined in <linux/ethtool_netlink.h> uapi header). This family does not use
+a specific header, all information in requests and replies is passed using
+netlink attributes.
+
+In requests, device can be identified by ifindex or by name; if both are used,
+they must match. In replies, kernel fills both. The meaning of flags,
+info_mask and index fields depends on request type.
+
+The ethtool netlink interface uses extended ACK for error and warning
+reporting, userspace application developers are encouraged to make these
+messages available to user in a suitable way.
+
+Requests can be divided into three categories: "get" (retrieving information),
+"set" (setting parameters) and "action" (invoking an action).
+
+All "set" and "action" type requests require admin privileges (CAP_NET_ADMIN
+in the namespace). Most "get" type request are allowed for anyone but there
+are exceptions (where the response contains sensitive information). In some
+cases, the request as such is allowed for anyone but unprivileged users have
+attributes with sensitive information (e.g. wake-on-lan password) omitted.
+
+
+Conventions
+-----------
+
+Attributes which represent a boolean value usually use u8 type so that we can
+distinguish three states: "on", "off" and "not present" (meaning the
+information is not available in "get" requests or value is not to be changed
+in "set" requests). For these attributes, the "true" value should be passed as
+number 1 but any non-zero value should be understood as "true" by recipient.
+
+Some request types allow passing an attribute named ETHA_*_INFOMASK with
+a bitmask telling kernel that we are only interested in some parts of the
+information. If info mask is omitted, all available information is returned.
+Meaning of info mask bits depends on request type and is listed below.
+
+
+Device identification
+---------------------
+
+When appropriate, network device is identified by a nested attribute named
+ETHA_*_DEV. This attribute can contain
+
+ ETHA_DEV_INDEX (u32) device ifindex
+ ETHA_DEV_NAME (string) device name
+
+In device related requests, one of these is sufficient; if both are used, they
+must match (i.e. identify the same device). In device related replies both are
+provided by kernel. In dump requests, device is not specified and kernel
+replies with one message per network device (only those for which the request
+is supported).
+
+List of message types
+---------------------
+
+All constants use ETHNL_CMD_ prefix, usually followed by "GET", "SET" or "ACT"
+to indicate the type.
+
+Messages of type "get" are used by userspace to request information and
+usually do not contain any attributes (that may be added later for dump
+filtering). Kernel response is in the form of corresponding "set" message;
+the same message can be also used to set (some of) the parameters, except for
+messages marked as "response only" in the table above. "Get" messages with
+NLM_F_DUMP flags and no device identification dump the information for all
+devices supporting the request.
+
+Later sections describe the format and semantics of these request messages.
+
+
+Request translation
+-------------------
+
+The following table maps iosctl commands to netlink commands providing their
+functionality. Entries with "n/a" in right column are commands which do not
+have their netlink replacement yet.
+
+ioctl command netlink command
+---------------------------------------------------------------------
+ETHTOOL_GSET n/a
+ETHTOOL_SSET n/a
+ETHTOOL_GDRVINFO n/a
+ETHTOOL_GREGS n/a
+ETHTOOL_GWOL n/a
+ETHTOOL_SWOL n/a
+ETHTOOL_GMSGLVL n/a
+ETHTOOL_SMSGLVL n/a
+ETHTOOL_NWAY_RST n/a
+ETHTOOL_GLINK n/a
+ETHTOOL_GEEPROM n/a
+ETHTOOL_SEEPROM n/a
+ETHTOOL_GCOALESCE n/a
+ETHTOOL_SCOALESCE n/a
+ETHTOOL_GRINGPARAM n/a
+ETHTOOL_SRINGPARAM n/a
+ETHTOOL_GPAUSEPARAM n/a
+ETHTOOL_SPAUSEPARAM n/a
+ETHTOOL_GRXCSUM n/a
+ETHTOOL_SRXCSUM n/a
+ETHTOOL_GTXCSUM n/a
+ETHTOOL_STXCSUM n/a
+ETHTOOL_GSG n/a
+ETHTOOL_SSG n/a
+ETHTOOL_TEST n/a
+ETHTOOL_GSTRINGS n/a
+ETHTOOL_PHYS_ID n/a
+ETHTOOL_GSTATS n/a
+ETHTOOL_GTSO n/a
+ETHTOOL_STSO n/a
+ETHTOOL_GPERMADDR n/a
+ETHTOOL_GUFO n/a
+ETHTOOL_SUFO n/a
+ETHTOOL_GGSO n/a
+ETHTOOL_SGSO n/a
+ETHTOOL_GFLAGS n/a
+ETHTOOL_SFLAGS n/a
+ETHTOOL_GPFLAGS n/a
+ETHTOOL_SPFLAGS n/a
+ETHTOOL_GRXFH n/a
+ETHTOOL_SRXFH n/a
+ETHTOOL_GGRO n/a
+ETHTOOL_SGRO n/a
+ETHTOOL_GRXRINGS n/a
+ETHTOOL_GRXCLSRLCNT n/a
+ETHTOOL_GRXCLSRULE n/a
+ETHTOOL_GRXCLSRLALL n/a
+ETHTOOL_SRXCLSRLDEL n/a
+ETHTOOL_SRXCLSRLINS n/a
+ETHTOOL_FLASHDEV n/a
+ETHTOOL_RESET n/a
+ETHTOOL_SRXNTUPLE n/a
+ETHTOOL_GRXNTUPLE n/a
+ETHTOOL_GSSET_INFO n/a
+ETHTOOL_GRXFHINDIR n/a
+ETHTOOL_SRXFHINDIR n/a
+ETHTOOL_GFEATURES n/a
+ETHTOOL_SFEATURES n/a
+ETHTOOL_GCHANNELS n/a
+ETHTOOL_SCHANNELS n/a
+ETHTOOL_SET_DUMP n/a
+ETHTOOL_GET_DUMP_FLAG n/a
+ETHTOOL_GET_DUMP_DATA n/a
+ETHTOOL_GET_TS_INFO n/a
+ETHTOOL_GMODULEINFO n/a
+ETHTOOL_GMODULEEEPROM n/a
+ETHTOOL_GEEE n/a
+ETHTOOL_SEEE n/a
+ETHTOOL_GRSSH n/a
+ETHTOOL_SRSSH n/a
+ETHTOOL_GTUNABLE n/a
+ETHTOOL_STUNABLE n/a
+ETHTOOL_GPHYSTATS n/a
+ETHTOOL_PERQUEUE n/a
+ETHTOOL_GLINKSETTINGS n/a
+ETHTOOL_SLINKSETTINGS n/a
+ETHTOOL_PHY_GTUNABLE n/a
+ETHTOOL_PHY_STUNABLE n/a
+ETHTOOL_GFECPARAM n/a
+ETHTOOL_SFECPARAM n/a
diff --git a/include/linux/ethtool_netlink.h b/include/linux/ethtool_netlink.h
new file mode 100644
index 000000000000..0412adb4f42f
--- /dev/null
+++ b/include/linux/ethtool_netlink.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+
+#ifndef _LINUX_ETHTOOL_NETLINK_H_
+#define _LINUX_ETHTOOL_NETLINK_H_
+
+#include <uapi/linux/ethtool_netlink.h>
+#include <linux/ethtool.h>
+
+#endif /* _LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h
new file mode 100644
index 000000000000..d8a8d3c72c2f
--- /dev/null
+++ b/include/uapi/linux/ethtool_netlink.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+
+#ifndef _UAPI_LINUX_ETHTOOL_NETLINK_H_
+#define _UAPI_LINUX_ETHTOOL_NETLINK_H_
+
+#include <linux/ethtool.h>
+
+enum {
+ ETHNL_CMD_NOOP,
+
+ __ETHNL_CMD_CNT,
+ ETHNL_CMD_MAX = (__ETHNL_CMD_CNT - 1)
+};
+
+/* generic netlink info */
+#define ETHTOOL_GENL_NAME "ethtool"
+#define ETHTOOL_GENL_VERSION 1
+
+#endif /* _UAPI_LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/net/Kconfig b/net/Kconfig
index 62da6148e9f8..383fe04ddf07 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -460,6 +460,14 @@ config FAILOVER
migration of VMs with direct attached VFs by failing over to the
paravirtual datapath when the VF is unplugged.
+config ETHTOOL_NETLINK
+ bool "Netlink interface for ethtool"
+ default y
+ help
+ An alternative userspace interface for ethtool based on generic
+ netlink. It provides better extensibility and some new features,
+ e.g. notification messages.
+
endif # if NET
# Used by archs to tell that they support BPF JIT compiler plus which flavour.
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
index 3ebfab2bca66..f30e0da88be5 100644
--- a/net/ethtool/Makefile
+++ b/net/ethtool/Makefile
@@ -1,3 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
-obj-y += ioctl.o
+obj-y += ioctl.o
+
+obj-$(CONFIG_ETHTOOL_NETLINK) += ethtool_nl.o
+
+ethtool_nl-y := netlink.o
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
new file mode 100644
index 000000000000..5fe3e5b68e81
--- /dev/null
+++ b/net/ethtool/netlink.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+
+#include <linux/ethtool_netlink.h>
+#include "netlink.h"
+
+/* genetlink setup */
+
+static const struct genl_ops ethtool_genl_ops[] = {
+};
+
+struct genl_family ethtool_genl_family = {
+ .hdrsize = 0,
+ .name = ETHTOOL_GENL_NAME,
+ .version = ETHTOOL_GENL_VERSION,
+ .netnsok = true,
+ .parallel_ops = true,
+ .ops = ethtool_genl_ops,
+ .n_ops = ARRAY_SIZE(ethtool_genl_ops),
+};
+
+/* module setup */
+
+static int __init ethnl_init(void)
+{
+ int ret;
+
+ ret = genl_register_family(ðtool_genl_family);
+ if (ret < 0)
+ panic("ethtool: could not register genetlink family\n");
+
+ return 0;
+}
+
+subsys_initcall(ethnl_init);
diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
new file mode 100644
index 000000000000..63063b582ca2
--- /dev/null
+++ b/net/ethtool/netlink.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+
+#ifndef _NET_ETHTOOL_NETLINK_H
+#define _NET_ETHTOOL_NETLINK_H
+
+#include <linux/ethtool_netlink.h>
+#include <linux/netdevice.h>
+#include <net/genetlink.h>
+
+extern struct genl_family ethtool_genl_family;
+
+#endif /* _NET_ETHTOOL_NETLINK_H */
--
2.20.1
^ permalink raw reply related
* Re: No traffic with Marvell switch and latest linux-next
From: Andrew Lunn @ 2019-02-18 18:21 UTC (permalink / raw)
To: Heiner Kallweit
Cc: Russell King - ARM Linux admin, Florian Fainelli,
netdev@vger.kernel.org
In-Reply-To: <33f9ef8d-df62-e154-f880-f886abf54e0a@gmail.com>
> > Hi Heiner
> >
> > Watch out for boot vs reboot, and when rebooting if port 8 had link or
> > not before you reboot.
> >
> Will do. Is there some known issue or bug?
Hi Heiner
No, but it is a variable which can make a difference. The fix i made
for the Freescale GPIO controller was not an issue for cold boot, but
reboot with link up did cause interrupt problems, etc.
Andrew
^ permalink raw reply
* [RFC PATCH net-next v3 02/21] ethtool: move to its own directory
From: Michal Kubecek @ 2019-02-18 18:21 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Andrew Lunn, Jakub Kicinski, Jiri Pirko,
linux-kernel
In-Reply-To: <cover.1550513384.git.mkubecek@suse.cz>
The ethtool netlink interface is going to be split into multiple files so
that it will be more convenient to put all of them in a separate directory
net/ethtool. Start by moving current ethtool.c with ioctl interface into
this directory and renaming it to ioct.c.
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
---
net/Makefile | 2 +-
net/core/Makefile | 2 +-
net/ethtool/Makefile | 3 +++
net/{core/ethtool.c => ethtool/ioctl.c} | 0
4 files changed, 5 insertions(+), 2 deletions(-)
create mode 100644 net/ethtool/Makefile
rename net/{core/ethtool.c => ethtool/ioctl.c} (100%)
diff --git a/net/Makefile b/net/Makefile
index bdaf53925acd..6c68520e5eb9 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_NET) += $(tmp-y)
# LLC has to be linked before the files in net/802/
obj-$(CONFIG_LLC) += llc/
-obj-$(CONFIG_NET) += ethernet/ 802/ sched/ netlink/ bpf/
+obj-$(CONFIG_NET) += ethernet/ 802/ sched/ netlink/ bpf/ ethtool/
obj-$(CONFIG_NETFILTER) += netfilter/
obj-$(CONFIG_INET) += ipv4/
obj-$(CONFIG_TLS) += tls/
diff --git a/net/core/Makefile b/net/core/Makefile
index f97d6254e564..9ddc2f3ecd97 100644
--- a/net/core/Makefile
+++ b/net/core/Makefile
@@ -8,7 +8,7 @@ obj-y := sock.o request_sock.o skbuff.o datagram.o stream.o scm.o \
obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
-obj-y += dev.o ethtool.o dev_addr_lists.o dst.o netevent.o \
+obj-y += dev.o dev_addr_lists.o dst.o netevent.o \
neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
fib_notifier.o xdp.o flow_offload.o
diff --git a/net/ethtool/Makefile b/net/ethtool/Makefile
new file mode 100644
index 000000000000..3ebfab2bca66
--- /dev/null
+++ b/net/ethtool/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-y += ioctl.o
diff --git a/net/core/ethtool.c b/net/ethtool/ioctl.c
similarity index 100%
rename from net/core/ethtool.c
rename to net/ethtool/ioctl.c
--
2.20.1
^ permalink raw reply related
* Re: [PATCH net-next 02/12] net: sched: flower: refactor fl_change
From: Stefano Brivio @ 2019-02-18 18:20 UTC (permalink / raw)
To: Vlad Buslov, jiri@resnulli.us
Cc: netdev@vger.kernel.org, jhs@mojatatu.com,
xiyou.wangcong@gmail.com, davem@davemloft.net
In-Reply-To: <vbf8syhja0k.fsf@mellanox.com>
On Fri, 15 Feb 2019 16:25:52 +0000
Vlad Buslov <vladbu@mellanox.com> wrote:
> On Fri 15 Feb 2019 at 10:47, Stefano Brivio <sbrivio@redhat.com> wrote:
>
> > Ah, of course. Thanks for clarifying. By the way, what tricked me here
> > was this check in fl_change():
> >
> > if (fold && handle && fold->handle != handle)
> > ...
> >
> > which could be turned into:
> >
> > if (fold && fold->handle != handle)
> > ...
> >
> > at this point.
>
> At this point I don't think this check is needed at all because fold
> can't suddenly change its handle in between this check and initial
> lookup in cls API.
Oh, right.
> Looking at commit history, this check is present since original commit
> by Jiri that implements flower classifier. Maybe semantics of cls API
> was different back then?
I wasn't able to figure that out either... Jiri?
--
Stefano
^ permalink raw reply
* Re: No traffic with Marvell switch and latest linux-next
From: Heiner Kallweit @ 2019-02-18 18:16 UTC (permalink / raw)
To: Andrew Lunn
Cc: Russell King - ARM Linux admin, Florian Fainelli,
netdev@vger.kernel.org
In-Reply-To: <20190217171027.GH5968@lunn.ch>
On 17.02.2019 18:10, Andrew Lunn wrote:
>> Sorry, I may have been too fast with this statement. With this patch
>> reverted it worked, but now I have a build with this patch still included,
>> and it works too. Need to dig deeper ..
>
> Hi Heiner
>
> Watch out for boot vs reboot, and when rebooting if port 8 had link or
> not before you reboot.
>
Will do. Is there some known issue or bug?
> Andrew
>
Heiner
^ permalink raw reply
* Re: [PATCH][next] Bluetooth: a2mp: Use struct_size() helper
From: Gustavo A. R. Silva @ 2019-02-18 17:50 UTC (permalink / raw)
To: Marcel Holtmann
Cc: Johan Hedberg, David S. Miller, linux-bluetooth, netdev,
linux-kernel
In-Reply-To: <F03ABE42-2AB3-4519-9E64-43E4600C6A42@holtmann.org>
On 2/18/19 7:02 AM, Marcel Holtmann wrote:
> Hi Gustavo,
>
>> One of the more common cases of allocation size calculations is finding
>> the size of a structure that has a zero-sized array at the end, along
>> with memory for some number of elements for that array. For example:
>>
>> struct foo {
>> int stuff;
>> struct boo entry[];
>> };
>>
>> size = sizeof(struct foo) + count * sizeof(struct boo);
>> instance = alloc(size, GFP_KERNEL)
>>
>> Instead of leaving these open-coded and prone to type mistakes, we can
>> now use the new struct_size() helper:
>>
>> size = struct_size(instance, entry, count);
>> instance = alloc(size, GFP_KERNEL)
>>
>> This code was detected with the help of Coccinelle.
>>
>> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
>> ---
>> net/bluetooth/a2mp.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> patch has been applied to bluetooth-next tree.
>
Thanks Marcel.
--
Gustavo
^ permalink raw reply
* Re: [PATCH 1/2] wireless: mt76: call hweight8() instead of __sw_hweight8()
From: Kalle Valo @ 2019-02-18 18:08 UTC (permalink / raw)
To: Masahiro Yamada
Cc: Ingo Molnar, Thomas Gleixner, Borislav Petkov, H . Peter Anvin,
x86, linux-wireless, Christoph Hellwig, David S. Miller, netdev,
linux-kernel, Lorenzo Bianconi, linux-mediatek, linux-arm-kernel,
Felix Fietkau, Matthias Brugger
In-Reply-To: <1550469571-25933-2-git-send-email-yamada.masahiro@socionext.com>
Masahiro Yamada <yamada.masahiro@socionext.com> writes:
> __sw_hweight8() is just internal implementation.
>
> Drivers should use the common API, hweight8().
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Acked-by: Kalle Valo <kvalo@codeaurora.org>
> This patch should go to x86 tree along with 2/2.
>
> Otherwise, all{yes,mod}config of x86 would be broken.
>
> This patch is trivial enough.
> I want ACK from the net/wireless maintainer
> so that this can go in via x86 tree.
Sounds good to me, feel free to push via the x86 tree.
--
Kalle Valo
^ permalink raw reply
* Re: stmmac / meson8b-dwmac
From: Simon Huelck @ 2019-02-18 18:05 UTC (permalink / raw)
To: Jose Abreu, Martin Blumenstingl
Cc: Emiliano Ingrassia, Gpeppe.cavallaro, alexandre.torgue,
linux-amlogic, netdev
In-Reply-To: <adafe6d7-e619-45e9-7ecb-76f003b0c7d9@synopsys.com>
[-- Attachment #1: Type: text/plain, Size: 2787 bytes --]
Am 18.02.2019 um 18:05 schrieb Jose Abreu:
> On 2/18/2019 4:51 PM, Simon Huelck wrote:
>> Hi,
>>
>> no im testing vanilla mainline kernel and against 4.14. where
>> performance was ok. but turning off EEE via ethtool should have same
>> results than removal of that patch.
>>
>> But, since it was mainlined recently , not long ago, i think this was
>> tested ??
> The thing is that phy_init_eee() is called by stmmac and this
> function does not take into account the broken modes if it's
> called too early which will cause driver to enable LPI in MAC.
>
> And anyway, if you have lpi values in the ethtool stats then EEE
> is being enabled by stmmac.
>
> Please try the change I suggested.
>
> Thanks,
> Jose Miguel Abreu
Hi,
disabling EEE doesnt help ( did it via the entry in the .dtb / .dts ),
the results are the same. I can confirm the LPI counters are zero or one
only after the test.....
C:\Users\Simon\Downloads\iperf-2.0.9-win64>iperf -c 10.10.11.1 -i1 -d
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 208 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 10.10.11.1, TCP port 5001
TCP window size: 208 KByte (default)
------------------------------------------------------------
[ 4] local 10.10.11.100 port 56114 connected with 10.10.11.1 port 5001
[ 5] local 10.10.11.100 port 5001 connected with 10.10.11.1 port 47866
[ ID] Interval Transfer Bandwidth
[ 4] 0.0- 1.0 sec 20.1 MBytes 169 Mbits/sec
[ 5] 0.0- 1.0 sec 75.8 MBytes 635 Mbits/sec
[ 4] 1.0- 2.0 sec 18.1 MBytes 152 Mbits/sec
[ 5] 1.0- 2.0 sec 69.0 MBytes 579 Mbits/sec
[ 4] 2.0- 3.0 sec 15.6 MBytes 131 Mbits/sec
[ 5] 2.0- 3.0 sec 70.7 MBytes 593 Mbits/sec
[ 4] 3.0- 4.0 sec 15.9 MBytes 133 Mbits/sec
[ 5] 3.0- 4.0 sec 70.3 MBytes 590 Mbits/sec
[ 4] 4.0- 5.0 sec 16.4 MBytes 137 Mbits/sec
[ 5] 4.0- 5.0 sec 69.5 MBytes 583 Mbits/sec
[ 4] 5.0- 6.0 sec 16.5 MBytes 138 Mbits/sec
[ 5] 5.0- 6.0 sec 69.0 MBytes 579 Mbits/sec
[ 4] 6.0- 7.0 sec 18.2 MBytes 153 Mbits/sec
[ 5] 6.0- 7.0 sec 69.8 MBytes 585 Mbits/sec
[ 4] 7.0- 8.0 sec 15.6 MBytes 131 Mbits/sec
[ 5] 7.0- 8.0 sec 70.0 MBytes 587 Mbits/sec
[ 4] 8.0- 9.0 sec 16.2 MBytes 136 Mbits/sec
[ 5] 8.0- 9.0 sec 69.6 MBytes 583 Mbits/sec
[ 4] 9.0-10.0 sec 17.1 MBytes 144 Mbits/sec
[ 4] 0.0-10.0 sec 170 MBytes 142 Mbits/sec
[ 5] 9.0-10.0 sec 69.1 MBytes 580 Mbits/sec
[ 5] 0.0-10.0 sec 703 MBytes 589 Mbits/sec
regards,
Simon
[-- Attachment #2: ethtool_test2.txt --]
[-- Type: text/plain, Size: 5373 bytes --]
NIC statistics:
mmc_tx_octetcount_gb: 0
mmc_tx_framecount_gb: 0
mmc_tx_broadcastframe_g: 0
mmc_tx_multicastframe_g: 0
mmc_tx_64_octets_gb: 0
mmc_tx_65_to_127_octets_gb: 0
mmc_tx_128_to_255_octets_gb: 0
mmc_tx_256_to_511_octets_gb: 0
mmc_tx_512_to_1023_octets_gb: 0
mmc_tx_1024_to_max_octets_gb: 0
mmc_tx_unicast_gb: 0
mmc_tx_multicast_gb: 0
mmc_tx_broadcast_gb: 0
mmc_tx_underflow_error: 0
mmc_tx_singlecol_g: 0
mmc_tx_multicol_g: 0
mmc_tx_deferred: 0
mmc_tx_latecol: 0
mmc_tx_exesscol: 0
mmc_tx_carrier_error: 0
mmc_tx_octetcount_g: 0
mmc_tx_framecount_g: 0
mmc_tx_excessdef: 0
mmc_tx_pause_frame: 0
mmc_tx_vlan_frame_g: 0
mmc_rx_framecount_gb: 2348653
mmc_rx_octetcount_gb: 3299190414
mmc_rx_octetcount_g: 3299190413
mmc_rx_broadcastframe_g: 92816
mmc_rx_multicastframe_g: 249
mmc_rx_crc_error: 2
mmc_rx_align_error: 0
mmc_rx_run_error: 2
mmc_rx_jabber_error: 0
mmc_rx_undersize_g: 0
mmc_rx_oversize_g: 0
mmc_rx_64_octets_gb: 0
mmc_rx_65_to_127_octets_gb: 172809
mmc_rx_128_to_255_octets_gb: 15902
mmc_rx_256_to_511_octets_gb: 659
mmc_rx_512_to_1023_octets_gb: 370
mmc_rx_1024_to_max_octets_gb: 2158911
mmc_rx_unicast_g: 2255586
mmc_rx_length_error: 2
mmc_rx_autofrangetype: 0
mmc_rx_pause_frames: 0
mmc_rx_fifo_overflow: 2924
mmc_rx_vlan_frames_gb: 2348591
mmc_rx_watchdog_error: 0
mmc_rx_ipc_intr_mask: 4294377460
mmc_rx_ipc_intr: 0
mmc_rx_ipv4_gd: 2255929
mmc_rx_ipv4_hderr: 0
mmc_rx_ipv4_nopay: 21
mmc_rx_ipv4_frag: 0
mmc_rx_ipv4_udsbl: 1
mmc_rx_ipv4_gd_octets: 3242768541
mmc_rx_ipv4_hderr_octets: 0
mmc_rx_ipv4_nopay_octets: 982
mmc_rx_ipv4_frag_octets: 0
mmc_rx_ipv4_udsbl_octets: 12
mmc_rx_ipv6_gd_octets: 20851
mmc_rx_ipv6_hderr_octets: 0
mmc_rx_ipv6_nopay_octets: 0
mmc_rx_ipv6_gd: 93
mmc_rx_ipv6_hderr: 0
mmc_rx_ipv6_nopay: 0
mmc_rx_udp_gd: 1942
mmc_rx_udp_err: 0
mmc_rx_tcp_gd: 2254045
mmc_rx_tcp_err: 0
mmc_rx_icmp_gd: 34
mmc_rx_icmp_err: 0
mmc_rx_udp_gd_octets: 885355
mmc_rx_udp_err_octets: 0
mmc_rx_tcp_gd_octets: 3196780259
mmc_rx_tcp_err_octets: 0
mmc_rx_icmp_gd_octets: 1300
mmc_rx_icmp_err_octets: 0
tx_underflow: 0
tx_carrier: 0
tx_losscarrier: 0
vlan_tag: 2345667
tx_deferred: 0
tx_vlan: 655982
tx_jabber: 0
tx_frame_flushed: 0
tx_payload_error: 0
tx_ip_header_error: 0
rx_desc: 0
sa_filter_fail: 0
overflow_error: 0
ipc_csum_error: 0
rx_collision: 0
rx_crc_errors: 0
dribbling_bit: 0
rx_length: 0
rx_mii: 0
rx_multicast: 0
rx_gmac_overflow: 0
rx_watchdog: 0
da_rx_filter_fail: 0
sa_rx_filter_fail: 0
rx_missed_cntr: 0
rx_overflow_cntr: 0
rx_vlan: 0
tx_undeflow_irq: 0
tx_process_stopped_irq: 0
tx_jabber_irq: 0
rx_overflow_irq: 0
rx_buf_unav_irq: 0
rx_process_stopped_irq: 0
rx_watchdog_irq: 0
tx_early_irq: 0
fatal_bus_error_irq: 0
rx_early_irq: 20521
threshold: 1
tx_pkt_n: 655982
rx_pkt_n: 2345727
normal_irq_n: 227466
rx_normal_irq_n: 195493
napi_poll: 227438
tx_normal_irq_n: 28972
tx_clean: 227438
tx_set_ic_bit: 26239
irq_receive_pmt_irq_n: 0
mmc_tx_irq_n: 0
mmc_rx_irq_n: 0
mmc_rx_csum_offload_irq_n: 0
irq_tx_path_in_lpi_mode_n: 0
irq_tx_path_exit_lpi_mode_n: 0
irq_rx_path_in_lpi_mode_n: 1
irq_rx_path_exit_lpi_mode_n: 1
phy_eee_wakeup_error_n: 0
ip_hdr_err: 0
ip_payload_err: 0
ip_csum_bypassed: 0
ipv4_pkt_rcvd: 0
ipv6_pkt_rcvd: 0
no_ptp_rx_msg_type_ext: 0
ptp_rx_msg_type_sync: 0
ptp_rx_msg_type_follow_up: 0
ptp_rx_msg_type_delay_req: 0
ptp_rx_msg_type_delay_resp: 0
ptp_rx_msg_type_pdelay_req: 0
ptp_rx_msg_type_pdelay_resp: 0
ptp_rx_msg_type_pdelay_follow_up: 0
ptp_rx_msg_type_announce: 0
ptp_rx_msg_type_management: 0
ptp_rx_msg_pkt_reserved_type: 0
ptp_frame_type: 0
ptp_ver: 0
timestamp_dropped: 0
av_pkt_rcvd: 0
av_tagged_pkt_rcvd: 0
vlan_tag_priority_val: 0
l3_filter_match: 0
l4_filter_match: 0
l3_l4_filter_no_match: 0
irq_pcs_ane_n: 0
irq_pcs_link_n: 0
irq_rgmii_n: 0
mtl_tx_status_fifo_full: 0
mtl_tx_fifo_not_empty: 0
mmtl_fifo_ctrl: 0
mtl_tx_fifo_read_ctrl_write: 0
mtl_tx_fifo_read_ctrl_wait: 0
mtl_tx_fifo_read_ctrl_read: 0
mtl_tx_fifo_read_ctrl_idle: 0
mac_tx_in_pause: 0
mac_tx_frame_ctrl_xfer: 0
mac_tx_frame_ctrl_idle: 0
mac_tx_frame_ctrl_wait: 0
mac_tx_frame_ctrl_pause: 0
mac_gmii_tx_proto_engine: 0
mtl_rx_fifo_fill_level_full: 0
mtl_rx_fifo_fill_above_thresh: 0
mtl_rx_fifo_fill_below_thresh: 0
mtl_rx_fifo_fill_level_empty: 0
mtl_rx_fifo_read_ctrl_flush: 0
mtl_rx_fifo_read_ctrl_read_data: 0
mtl_rx_fifo_read_ctrl_status: 0
mtl_rx_fifo_read_ctrl_idle: 0
mtl_rx_fifo_ctrl_active: 0
mac_rx_frame_ctrl_fifo: 0
mac_gmii_rx_proto_engine: 0
tx_tso_frames: 0
tx_tso_nfrags: 0
^ permalink raw reply
* [PATCH RFC] net-sysfs: consistent behavior between ioctl and sysfs
From: Julius Niedworok @ 2019-02-18 18:02 UTC (permalink / raw)
To: netdev
Cc: julius.n, ga58taw, David S. Miller, Alexander Duyck, Tyler Hicks,
Amritha Nambiar, Jeff Kirsher, Petr Machata, Dmitry Torokhov,
Joe Perches, linux-kernel
The flags of a network interface can be read either from
/sys/class/net/<dev>/flags or from the ioctl SIOCGIFFLAGS. When the ioctl
is used, dev_get_flags is called to extract the flags. However, reads on
the sysfs file return the plain content of the flags integer and do not
call dev_get_flags.
In order to fix this inconsistent behavior, replace the NETDEVICE_SHOW_RW
macro by the functions format_flags and flags_show. These functions extract
the flags by calling dev_get_flags and return them formatted for the user.
This makes the behavior between calling the SIOCGIFFLAGS ioctl and reading
/sys/class/net/<dev>/flags consistent.
Co-developed-by: Charlie Groh <ga58taw@mytum.de>
Signed-off-by: Charlie Groh <ga58taw@mytum.de>
Signed-off-by: Julius Niedworok <julius.n@gmx.net>
---
net/core/net-sysfs.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index ff9fd2b..8ae8be5 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -345,7 +345,19 @@ static ssize_t flags_store(struct device *dev, struct device_attribute *attr,
{
return netdev_store(dev, attr, buf, len, change_flags);
}
-NETDEVICE_SHOW_RW(flags, fmt_hex);
+
+static ssize_t format_flags(const struct net_device *dev, char *buf)
+{
+ return sprintf(buf, fmt_hex, dev_get_flags(dev));
+}
+
+static ssize_t flags_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return netdev_show(dev, attr, buf, format_flags);
+}
+static DEVICE_ATTR_RW(flags);
static ssize_t tx_queue_len_store(struct device *dev,
struct device_attribute *attr,
--
2.10.1 (Apple Git-78)
^ permalink raw reply related
* RE: [PATCH] net: hns: Fix object reference leaks in hns_dsaf_roce_reset()
From: Salil Mehta @ 2019-02-18 17:54 UTC (permalink / raw)
To: John Garry, Huang Zijiang, Zhuangyuzeng (Yisen)
Cc: davem@davemloft.net, lipeng (Y), liuyonglong, yuehaibing,
keescook@chromium.org, wangxi (M), netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, wang.yi59@zte.com.cn, Linuxarm
In-Reply-To: <4ca251e6-22a1-a792-bb64-2498d8cb6fcd@huawei.com>
> From: John Garry
> Sent: Friday, February 15, 2019 12:00 PM
>
> On 15/02/2019 11:25, Salil Mehta wrote:
> >> From: John Garry
> >> Sent: Friday, February 15, 2019 10:52 AM
> >>
> >> On 14/02/2019 06:41, Huang Zijiang wrote:
> >>> The of_find_device_by_node() takes a reference to the underlying device
> >>> structure, we should release that reference.
> >>
> >> of_find_device_by_node() is not called for every path, so is this change proper:
> >
> >
> > It looks okay to me and with the suggested device reference is being
> > released from every possible error leg in the function. Could you be
> > more specific which error path is not being addressed?
> >
> >> /* find the platform device corresponding to fwnode */
> >> if (is_of_node(dsaf_fwnode)) {
> >> pdev = of_find_device_by_node(to_of_node(dsaf_fwnode));
> >
> >
> > This will get the reference to the device, which needs to be
> > released later.
> >
> >
> >> } else if (is_acpi_device_node(dsaf_fwnode)) {
> >> pdev = hns_dsaf_find_platform_device(dsaf_fwnode);
> >
> >
> > This will also get the reference to the device when bus_find_device()
> > gets called and returns the 'device'. Therefore, this needs to be
> > released as well using put_device()
>
> OK, I see. That's non-obvious.
>
> And so the commit message was simply incomplete.
>
> So who finally drops this reference? This patch only seems to release on
> error path. I checked the callers and they don't seem to.
Yes, in the positive leg the put_device() was missing. Thanks for identifying!
I have floated the patch to fix it https://www.lkml.org/lkml/2019/2/18/1161
Salil.
^ permalink raw reply
* Re: -Wimplicit-fallthrough not working with ccache
From: Gustavo A. R. Silva @ 2019-02-18 17:49 UTC (permalink / raw)
To: Kalle Valo
Cc: netdev, linux-wireless, linux-kernel, ath10k, David S. Miller,
linux-kbuild, Kees Cook
In-Reply-To: <87zhqwuggt.fsf_-_@kamboji.qca.qualcomm.com>
Hi Kalle,
On 2/16/19 5:21 AM, Kalle Valo wrote:
> (replying to an old thread but renaming it)
>
> Kalle Valo <kvalo@codeaurora.org> writes:
>
>> "Gustavo A. R. Silva" <gustavo@embeddedor.com> wrote:
>>
>>> In preparation to enabling -Wimplicit-fallthrough, mark switch cases
>>> where we are expecting to fall through.
>>>
>>> Notice that in this particular case, I replaced "pass through" with
>>> a proper "fall through" comment, which is what GCC is expecting
>>> to find.
>>>
>>> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
>>> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
>>
>> Patch applied to ath-next branch of ath.git, thanks.
>>
>> f1d270ae10ff ath10k: htt_tx: mark expected switch fall-throughs
>
> Gustavo, I enabled W=1 on my ath10k build checks and it took me a while
> to figure out why GCC was warning about fall through annotations missing
> even I knew you had fixed them. Finally I figured out that the reason
> was ccache, which I need because I work with different branches and need
> to recompile the kernel quite often.
>
> If the plan is to enable -Wimplicit-fallthrough by default in the kernel
> IMHO this might become an issue, as otherwise people using ccache start
> seeing lots of invalid warnings. Apparently CCACHE_COMMENTS=1 will fix
> that but my version of ccache doesn't support it, and how would everyone
> learn that trick anyway? Or maybe CCACHE_COMMENTS can enabled through
> kernel Makefile?
>
Can you share with me the warning messages you get?
I just see the following warnings with linux-next:
$ make CC="ccache gcc" W=1 drivers/net/wireless/ath/ath10k/htt_tx.o
CC [M] drivers/net/wireless/ath/ath10k/htt_tx.o
In file included from drivers/net/wireless/ath/ath10k/htt_tx.c:19:
drivers/net/wireless/ath/ath10k/htt.h:1727:1: warning: alignment 1 of ‘struct ath10k_htt_txbuf_32’ is less than 4 [-Wpacked-not-aligned]
} __packed;
^
drivers/net/wireless/ath/ath10k/htt.h:1734:1: warning: alignment 1 of ‘struct ath10k_htt_txbuf_64’ is less than 4 [-Wpacked-not-aligned]
} __packed;
^
In my Makefile I have:
KBUILD_CFLAGS += $(call cc-option,-Wimplicit-fallthrough=3,)
Thanks
--
Gustavo
^ permalink raw reply
* [PATCH net] net: hns: Fixes the missing put_device in positive leg for roce reset
From: Salil Mehta @ 2019-02-18 17:40 UTC (permalink / raw)
To: davem
Cc: salil.mehta, yisen.zhuang, lipeng321, mehta.salil, netdev,
linux-kernel, linux-rdma, linuxarm
This patch fixes the missing device reference release-after-use in
the positive leg of the roce reset API of the HNS DSAF.
Fixes: c969c6e7ab8c ("net: hns: Fix object reference leaks in hns_dsaf_roce_reset()")
Reported-by: John Garry <john.garry@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
---
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index b8155f5..ac55db0 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -3128,6 +3128,9 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset)
dsaf_set_bit(credit, DSAF_SBM_ROCEE_CFG_CRD_EN_B, 1);
dsaf_write_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG, credit);
}
+
+ put_device(&pdev->dev);
+
return 0;
}
EXPORT_SYMBOL(hns_dsaf_roce_reset);
--
2.7.4
^ permalink raw reply related
* Re: [PATCH bpf 1/2] bpf/test_run: fix unkillable BPF_PROG_TEST_RUN
From: Stanislav Fomichev @ 2019-02-18 17:29 UTC (permalink / raw)
To: Daniel Borkmann; +Cc: Stanislav Fomichev, netdev, davem, ast, syzbot
In-Reply-To: <74457479-d54c-69fa-958a-3cfb1ee9e5a2@iogearbox.net>
On 02/16, Daniel Borkmann wrote:
> On 02/13/2019 12:42 AM, Stanislav Fomichev wrote:
> > Syzbot found out that running BPF_PROG_TEST_RUN with repeat=0xffffffff
> > makes process unkillable. The problem is that when CONFIG_PREEMPT is
> > enabled, we never see need_resched() return true. This is due to the
> > fact that preempt_enable() (which we do in bpf_test_run_one on each
> > iteration) now handles resched if it's needed.
> >
> > Let's disable preemption for the whole run, not per test. In this case
> > we can properly see whether resched is needed.
> > Let's also properly return -EINTR to the userspace in case of a signal
> > interrupt.
> >
> > See recent discussion:
> > http://lore.kernel.org/netdev/CAH3MdRWHr4N8jei8jxDppXjmw-Nw=puNDLbu1dQOFQHxfU2onA@mail.gmail.com
> >
> > I'll follow up with the same fix bpf_prog_test_run_flow_dissector in
> > bpf-next.
> >
> > Reported-by: syzbot <syzkaller@googlegroups.com>
> > Signed-off-by: Stanislav Fomichev <sdf@google.com>
> > ---
> > net/bpf/test_run.c | 45 ++++++++++++++++++++++++---------------------
> > 1 file changed, 24 insertions(+), 21 deletions(-)
> >
> > diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
> > index fa2644d276ef..e31e1b20f7f4 100644
> > --- a/net/bpf/test_run.c
> > +++ b/net/bpf/test_run.c
> > @@ -13,27 +13,13 @@
> > #include <net/sock.h>
> > #include <net/tcp.h>
> >
> > -static __always_inline u32 bpf_test_run_one(struct bpf_prog *prog, void *ctx,
> > - struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE])
> > -{
> > - u32 ret;
> > -
> > - preempt_disable();
> > - rcu_read_lock();
> > - bpf_cgroup_storage_set(storage);
> > - ret = BPF_PROG_RUN(prog, ctx);
> > - rcu_read_unlock();
> > - preempt_enable();
> > -
> > - return ret;
> > -}
> > -
> > -static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat, u32 *ret,
> > - u32 *time)
> > +static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat,
> > + u32 *retval, u32 *time)
> > {
> > struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE] = { 0 };
> > enum bpf_cgroup_storage_type stype;
> > u64 time_start, time_spent = 0;
> > + int ret = 0;
> > u32 i;
> >
> > for_each_cgroup_storage_type(stype) {
> > @@ -48,25 +34,42 @@ static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat, u32 *ret,
> >
> > if (!repeat)
> > repeat = 1;
> > +
> > + rcu_read_lock();
> > + preempt_disable();
> > time_start = ktime_get_ns();
> > for (i = 0; i < repeat; i++) {
> > - *ret = bpf_test_run_one(prog, ctx, storage);
> > + bpf_cgroup_storage_set(storage);
> > + *retval = BPF_PROG_RUN(prog, ctx);
> > +
> > + if (signal_pending(current)) {
> > + ret = -EINTR;
> > + break;
> > + }
>
> Wouldn't it be enough to just move the signal_pending() test to
> the above as you did to actually fix the unkillable issue? For
> CONFIG_PREEMPT the below need_resched() is never triggered as you
> mention as preempt_enable() handles rescheduling internally in
> this situation, so moving it only out should suffice.
>
> The rationale for disabling preemption for the whole run is imho
> a bit different, namely that you would not screw up the ktime
> measurements due to rescheduling happening in between otherwise.
That's exactly the reason why we need to preempt_disable() the whole
run; we can't preempt on preempt_enable(), it would screw up our
ktime estimation.
> But then, once preemption is disabled for the whole run, is there
> a need to move out the extra signal_pending() test (presumably as
> need_resched() does not handle TIF_SIGPENDING but only TIF_NEED_RESCHED
> but we still wouldn't get into a unkillable situation here, no)?
I'm not sure, they look like two separate flags, it feels safer to handle
them separately (and we have a precedent in do_check in verifier.c). While
we do set them both when sending signal, it looks like need_resched is
for the cases where we wake up a task with a higher priority. So, in
theory, we can have a signal_pending without need_resched. (Also, with
CONFIG_PREEMT=y kernel, there is another complication with
preempt_count()).
>
> > if (need_resched()) {
> > - if (signal_pending(current))
> > - break;
> > time_spent += ktime_get_ns() - time_start;
> > + preempt_enable();
> > + rcu_read_unlock();
> > +
> > cond_resched();
> > +
> > + rcu_read_lock();
> > + preempt_disable();
> > time_start = ktime_get_ns();
> > }
> > }
> > time_spent += ktime_get_ns() - time_start;
> > + preempt_enable();
> > + rcu_read_unlock();
> > +
> > do_div(time_spent, repeat);
> > *time = time_spent > U32_MAX ? U32_MAX : (u32)time_spent;
> >
> > for_each_cgroup_storage_type(stype)
> > bpf_cgroup_storage_free(storage[stype]);
> >
> > - return 0;
> > + return ret;
> > }
> >
> > static int bpf_test_finish(const union bpf_attr *kattr,
> >
>
^ permalink raw reply
* Aw: Re: [BUG] [FIX] net: dsa: oops in br_vlan_enabled
From: Frank Wunderlich @ 2019-02-18 17:11 UTC (permalink / raw)
To: Florian Fainelli; +Cc: netdev, Andrew Lunn, Vivien Didelot
In-Reply-To: <2b9ecca4-4a92-44e0-f85e-2877dd08013a@gmail.com>
Hi,
tried your Patch but crashes the same way:
[ 107.416972] [<bf0fde88>] (br_vlan_enabled [bridge]) from [<bf14e234>] (dsa_po
rt_vlan_add+0x60/0xbc [dsa_core])
[ 107.426939] [<bf14e234>] (dsa_port_vlan_add [dsa_core]) from [<bf14eba4>] (ds
a_slave_port_obj_add+0x64/0x68 [dsa_core])
[ 107.437666] [<bf14eba4>] (dsa_slave_port_obj_add [dsa_core]) from [<c0b4e684>
] (__switchdev_port_obj_add+0x50/0xc4)
[ 107.448029] [<c0b4e684>] (__switchdev_port_obj_add) from [<c0b4e6d4>] (__swit
chdev_port_obj_add+0xa0/0xc4)
[ 107.457612] [<c0b4e6d4>] (__switchdev_port_obj_add) from [<c0b4e758>] (switch
dev_port_obj_add_now+0x60/0x130)
[ 107.467453] [<c0b4e758>] (switchdev_port_obj_add_now) from [<c0b4eb94>] (swit
chdev_port_obj_add+0x44/0x190)
[ 107.477181] [<c0b4eb94>] (switchdev_port_obj_add) from [<bf1013d0>] (br_switc
hdev_port_vlan_add+0x60/0x7c [bridge])
[ 107.487644] [<bf1013d0>] (br_switchdev_port_vlan_add [bridge]) from [<bf0ff25
0>] (__vlan_add+0xb0/0x620 [bridge])
regards Frank
> Gesendet: Montag, 18. Februar 2019 um 00:20 Uhr
> Von: "Florian Fainelli" <f.fainelli@gmail.com>
> An: "Frank Wunderlich" <frank-w@public-files.de>, netdev@vger.kernel.org, "Andrew Lunn" <andrew@lunn.ch>, "Vivien Didelot" <vivien.didelot@gmail.com>
> Betreff: Re: [BUG] [FIX] net: dsa: oops in br_vlan_enabled
>
>
>
> On 2/17/2019 9:13 AM, Florian Fainelli wrote:
> > Hi Frank,
> >
> > On 2/16/2019 8:22 AM, Frank Wunderlich wrote:
> >> Hi,
> >>
> >> i've found an oops in 4.19.23/10, seems to be fixed anyhow in 5.0 (also works in 4.14.101)
> >>
> >> root@bpi-r2:~# ip link add link lan0 name lan0.5 type vlan id 5
> >> root@bpi-r2:~# ip addr add 192.168.5.200/24 brd 192.168.5.255 dev lan0.5
> >> root@bpi-r2:~# ip link set dev lan0 up
> >> root@bpi-r2:~# ip link set dev lan0.5 up
> >
> > So that these steps don't involve a bridge, and because we don't (yet)
> > implment ndo_vlan_rx_{add,kill}_vid() netdevice_ops, there is no VLAN
> > programming, it's all software
> >
> >>
> >> 12: lan0.5@lan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
> >> link/ether 02:02:02:02:02:02 brd ff:ff:ff:ff:ff:ff
> >> inet 192.168.5.200/24 brd 192.168.5.255 scope global lan0.5
> >> valid_lft forever preferred_lft forever
> >>
> >> root@bpi-r2:~# brctl addbr bridge_name
> >> root@bpi-r2:~# brctl addif bridge_name lan0.5
> >
> > Unless you changed the bridge to have VLAN filtering/awareness with:
> >
> > echo 1 > /sys/class/net/bridge_name/bridge/vlan_filtering
> >
> > There will be no VLAN configuration/objects pushed to DSA since commit
> > 2ea7a679ca2abd251c1ec03f20508619707e1749 ("net: dsa: Don't add vlans
> > when vlan filtering is disabled") so I am not sure how you got into that
> > situation because prior to pushing a VLAN object, the port must be part
> > of a bridge, so the steps typically look like:
> >
> > - port_bridge_join which assigns dp->bridge_dev
> > - port_vlan_add
> >
> > Does your 4.19.23 kernel somehow change how VLAN objects are pushed down
> > the switch driver?
> >
> >> [ 352.057128] bridge_name: port 1(lan0.5) entered blocking state
> >> [ 352.063065] bridge_name: port 1(lan0.5) entered disabled state
> >> [ 352.069181] device lan0.5 entered promiscuous mode
> >> [ 352.074018] device lan0 entered promiscuous mode
> >> [ 352.078906] Unable to handle kernel NULL pointer dereference at virtual address 00000558
> >> ...
> >> [ 352.493085] [<bf0fde88>] (br_vlan_enabled [bridge]) from [<bf12c234>] (dsa_port_vlan_add+0x60/0xbc [dsa_core])
> >> [ 352.503050] [<bf12c234>] (dsa_port_vlan_add [dsa_core]) from [<bf12cb64>] (dsa_slave_port_obj_add+0x4c/0x50 [dsa_core])
> >> [ 352.513776] [<bf12cb64>] (dsa_slave_port_obj_add [dsa_core]) from [<c0b4e2d4>] (__switchdev_port_obj_add+0x50/0xc4)
> >> [ 352.524138] [<c0b4e2d4>] (__switchdev_port_obj_add) from [<c0b4e324>] (__switchdev_port_obj_add+0xa0/0xc4)
> >> [ 352.533721] [<c0b4e324>] (__switchdev_port_obj_add) from [<c0b4e3a8>] (switchdev_port_obj_add_now+0x60/0x130)
> >> [ 352.543562] [<c0b4e3a8>] (switchdev_port_obj_add_now) from [<c0b4e7e4>] (switchdev_port_obj_add+0x44/0x190)
> >> [ 352.553284] [<c0b4e7e4>] (switchdev_port_obj_add) from [<bf1013d0>] (br_switchdev_port_vlan_add+0x60/0x7c [bridge])
> >> [ 352.563733] [<bf1013d0>] (br_switchdev_port_vlan_add [bridge]) from [<bf0ff250>] (__vlan_add+0xb0/0x620 [bridge])
> >> [ 352.574007] [<bf0ff250>] (__vlan_add [bridge]) from [<bf0ffd04>] (nbp_vlan_add+0xc4/0x150 [bridge])
> >> [ 352.583073] [<bf0ffd04>] (nbp_vlan_add [bridge]) from [<bf0ffec4>] (nbp_vlan_init+0x134/0x164 [bridge])
> >> [ 352.592482] [<bf0ffec4>] (nbp_vlan_init [bridge]) from [<bf0edd4c>] (br_add_if+0x40c/0x5fc [bridge])
> >> [ 352.601632] [<bf0edd4c>] (br_add_if [bridge]) from [<bf0eeb14>] (add_del_if+0x6c/0x80 [bridge])
> >> [ 352.610351] [<bf0eeb14>] (add_del_if [bridge]) from [<bf0ef5b0>] (br_dev_ioctl+0x7c/0x9c [bridge])
> >> [ 352.619290] [<bf0ef5b0>] (br_dev_ioctl [bridge]) from [<c09583d4>] (dev_ifsioc+0x184/0x324)
> >> [ 352.627582] [<c09583d4>] (dev_ifsioc) from [<c09589e8>] (dev_ioctl+0x32c/0x5cc)
> >> [ 352.634837] [<c09589e8>] (dev_ioctl) from [<c090913c>] (sock_ioctl+0x3bc/0x580)
> >>
> >>
> >> since my 4.19.23 kernel is modified a bit i tried with 4.19.10 without my net modifications and it is still reproducable with steps above (create a vlan on dsa-user-port and then use it in a bridge)
> >>
> >> i fixed it with these changes:
>
> Your fix is undoing the commit from Andrew I just referenced, so it is
> definitively not the right fix because it will push VLAN objects down to
> a non-VLAN aware bridge, not that this is really a problem, but it
> should not be happening anyway.
>
> The problem appears to be the following though: you are enslaving a VLAN
> device, which does not have switchdev_ops, so we recurse into the lower
> device, which is the DSA network device, which does have switchdev_ops
> defined. Once we are there we check the orig_dev against being a bridge
> master network device, but we are not checking that it's a VLAN device
> so we end-up assuming it is a DSA network device, we de-reference
> garbage by checking br_vlan_enabled(dp->bridge_dev) because there is
> simply no such data structure associated with the VLAN device.
>
> The attached patch should help.
>
> This is no longer a problem in newer kernels because the switchdev
> operations use a notifier which checks the target network device to be DSA.
> --
> Florian
>
^ permalink raw reply
* Re: stmmac / meson8b-dwmac
From: Simon Huelck @ 2019-02-18 17:05 UTC (permalink / raw)
To: Jose Abreu, Martin Blumenstingl
Cc: Emiliano Ingrassia, Gpeppe.cavallaro, alexandre.torgue,
linux-amlogic, netdev
In-Reply-To: <e1d75e7f-1747-d0ce-0ee7-4fa688b90d13@synopsys.com>
[-- Attachment #1: Type: text/plain, Size: 2242 bytes --]
Hi,
here directly after reboot and a first iperf test
C:\Users\Simon\Downloads\iperf-2.0.9-win64>iperf.exe -c 10.10.11.1 -i1 -d
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 208 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 10.10.11.1, TCP port 5001
TCP window size: 208 KByte (default)
------------------------------------------------------------
[ 4] local 10.10.11.100 port 56062 connected with 10.10.11.1 port 5001
[ 5] local 10.10.11.100 port 5001 connected with 10.10.11.1 port 42552
[ ID] Interval Transfer Bandwidth
[ 4] 0.0- 1.0 sec 16.2 MBytes 136 Mbits/sec
[ 5] 0.0- 1.0 sec 70.5 MBytes 591 Mbits/sec
[ 4] 1.0- 2.0 sec 14.4 MBytes 121 Mbits/sec
[ 5] 1.0- 2.0 sec 63.9 MBytes 536 Mbits/sec
[ 4] 2.0- 3.0 sec 13.4 MBytes 112 Mbits/sec
[ 5] 2.0- 3.0 sec 67.6 MBytes 567 Mbits/sec
[ 5] 3.0- 4.0 sec 68.6 MBytes 575 Mbits/sec
[ 4] 3.0- 4.0 sec 15.9 MBytes 133 Mbits/sec
[ 4] 4.0- 5.0 sec 13.9 MBytes 116 Mbits/sec
[ 5] 4.0- 5.0 sec 65.2 MBytes 547 Mbits/sec
[ 4] 5.0- 6.0 sec 16.8 MBytes 141 Mbits/sec
[ 5] 5.0- 6.0 sec 67.1 MBytes 562 Mbits/sec
[ 4] 6.0- 7.0 sec 17.2 MBytes 145 Mbits/sec
[ 5] 6.0- 7.0 sec 65.7 MBytes 552 Mbits/sec
[ 4] 7.0- 8.0 sec 16.0 MBytes 134 Mbits/sec
[ 5] 7.0- 8.0 sec 67.0 MBytes 562 Mbits/sec
[ 4] 8.0- 9.0 sec 15.6 MBytes 131 Mbits/sec
[ 5] 8.0- 9.0 sec 66.5 MBytes 558 Mbits/sec
[ 4] 9.0-10.0 sec 13.2 MBytes 111 Mbits/sec
[ 4] 0.0-10.0 sec 153 MBytes 128 Mbits/sec
[ 5] 9.0-10.0 sec 67.6 MBytes 567 Mbits/sec
[ 5] 0.0-10.0 sec 670 MBytes 562 Mbits/sec
regards,
Simon
Am 18.02.2019 um 17:43 schrieb Jose Abreu:
> On 2/18/2019 4:40 PM, Simon Huelck wrote:
>> Hi,
>>
>> EEE is enabled for odroid - c2 and should be working in 5.0-rc7 afaik ?
> Oops, I was seeing in the wrong version, sorry.
>
> And did you test without that patch ?
>
> Thanks,
> Jose Miguel Abreu
[-- Attachment #2: ethtool.txt --]
[-- Type: text/plain, Size: 5308 bytes --]
NIC statistics:
mmc_tx_octetcount_gb: 0
mmc_tx_framecount_gb: 0
mmc_tx_broadcastframe_g: 0
mmc_tx_multicastframe_g: 0
mmc_tx_64_octets_gb: 0
mmc_tx_65_to_127_octets_gb: 0
mmc_tx_128_to_255_octets_gb: 0
mmc_tx_256_to_511_octets_gb: 0
mmc_tx_512_to_1023_octets_gb: 0
mmc_tx_1024_to_max_octets_gb: 0
mmc_tx_unicast_gb: 0
mmc_tx_multicast_gb: 0
mmc_tx_broadcast_gb: 0
mmc_tx_underflow_error: 0
mmc_tx_singlecol_g: 0
mmc_tx_multicol_g: 0
mmc_tx_deferred: 0
mmc_tx_latecol: 0
mmc_tx_exesscol: 0
mmc_tx_carrier_error: 0
mmc_tx_octetcount_g: 0
mmc_tx_framecount_g: 0
mmc_tx_excessdef: 0
mmc_tx_pause_frame: 0
mmc_tx_vlan_frame_g: 0
mmc_rx_framecount_gb: 8658
mmc_rx_octetcount_gb: 2708759
mmc_rx_octetcount_g: 2708759
mmc_rx_broadcastframe_g: 4283
mmc_rx_multicastframe_g: 18
mmc_rx_crc_error: 0
mmc_rx_align_error: 0
mmc_rx_run_error: 0
mmc_rx_jabber_error: 0
mmc_rx_undersize_g: 0
mmc_rx_oversize_g: 0
mmc_rx_64_octets_gb: 0
mmc_rx_65_to_127_octets_gb: 5879
mmc_rx_128_to_255_octets_gb: 979
mmc_rx_256_to_511_octets_gb: 455
mmc_rx_512_to_1023_octets_gb: 125
mmc_rx_1024_to_max_octets_gb: 1220
mmc_rx_unicast_g: 4357
mmc_rx_length_error: 0
mmc_rx_autofrangetype: 0
mmc_rx_pause_frames: 0
mmc_rx_fifo_overflow: 0
mmc_rx_vlan_frames_gb: 8656
mmc_rx_watchdog_error: 0
mmc_rx_ipc_intr_mask: 2147385342
mmc_rx_ipc_intr: 0
mmc_rx_ipv4_gd: 4451
mmc_rx_ipv4_hderr: 0
mmc_rx_ipv4_nopay: 0
mmc_rx_ipv4_frag: 0
mmc_rx_ipv4_udsbl: 0
mmc_rx_ipv4_gd_octets: 2319576
mmc_rx_ipv4_hderr_octets: 0
mmc_rx_ipv4_nopay_octets: 0
mmc_rx_ipv4_frag_octets: 0
mmc_rx_ipv4_udsbl_octets: 0
mmc_rx_ipv6_gd_octets: 726
mmc_rx_ipv6_hderr_octets: 0
mmc_rx_ipv6_nopay_octets: 0
mmc_rx_ipv6_gd: 6
mmc_rx_ipv6_hderr: 0
mmc_rx_ipv6_nopay: 0
mmc_rx_udp_gd: 1542
mmc_rx_udp_err: 0
mmc_rx_tcp_gd: 2844
mmc_rx_tcp_err: 0
mmc_rx_icmp_gd: 71
mmc_rx_icmp_err: 0
mmc_rx_udp_gd_octets: 299070
mmc_rx_udp_err_octets: 0
mmc_rx_tcp_gd_octets: 1929132
mmc_rx_tcp_err_octets: 0
mmc_rx_icmp_gd_octets: 2840
mmc_rx_icmp_err_octets: 0
tx_underflow: 0
tx_carrier: 0
tx_losscarrier: 0
vlan_tag: 8656
tx_deferred: 0
tx_vlan: 4007
tx_jabber: 0
tx_frame_flushed: 0
tx_payload_error: 0
tx_ip_header_error: 0
rx_desc: 0
sa_filter_fail: 0
overflow_error: 0
ipc_csum_error: 0
rx_collision: 0
rx_crc_errors: 0
dribbling_bit: 0
rx_length: 0
rx_mii: 0
rx_multicast: 0
rx_gmac_overflow: 0
rx_watchdog: 0
da_rx_filter_fail: 0
sa_rx_filter_fail: 0
rx_missed_cntr: 0
rx_overflow_cntr: 0
rx_vlan: 0
tx_undeflow_irq: 0
tx_process_stopped_irq: 0
tx_jabber_irq: 0
rx_overflow_irq: 0
rx_buf_unav_irq: 0
rx_process_stopped_irq: 0
rx_watchdog_irq: 0
tx_early_irq: 0
fatal_bus_error_irq: 0
rx_early_irq: 30
threshold: 1
tx_pkt_n: 4007
rx_pkt_n: 8658
normal_irq_n: 7266
rx_normal_irq_n: 7106
napi_poll: 8677
tx_normal_irq_n: 159
tx_clean: 8677
tx_set_ic_bit: 160
irq_receive_pmt_irq_n: 0
mmc_tx_irq_n: 0
mmc_rx_irq_n: 0
mmc_rx_csum_offload_irq_n: 0
irq_tx_path_in_lpi_mode_n: 2421
irq_tx_path_exit_lpi_mode_n: 2420
irq_rx_path_in_lpi_mode_n: 0
irq_rx_path_exit_lpi_mode_n: 0
phy_eee_wakeup_error_n: 0
ip_hdr_err: 0
ip_payload_err: 0
ip_csum_bypassed: 0
ipv4_pkt_rcvd: 0
ipv6_pkt_rcvd: 0
no_ptp_rx_msg_type_ext: 0
ptp_rx_msg_type_sync: 0
ptp_rx_msg_type_follow_up: 0
ptp_rx_msg_type_delay_req: 0
ptp_rx_msg_type_delay_resp: 0
ptp_rx_msg_type_pdelay_req: 0
ptp_rx_msg_type_pdelay_resp: 0
ptp_rx_msg_type_pdelay_follow_up: 0
ptp_rx_msg_type_announce: 0
ptp_rx_msg_type_management: 0
ptp_rx_msg_pkt_reserved_type: 0
ptp_frame_type: 0
ptp_ver: 0
timestamp_dropped: 0
av_pkt_rcvd: 0
av_tagged_pkt_rcvd: 0
vlan_tag_priority_val: 0
l3_filter_match: 0
l4_filter_match: 0
l3_l4_filter_no_match: 0
irq_pcs_ane_n: 0
irq_pcs_link_n: 0
irq_rgmii_n: 0
mtl_tx_status_fifo_full: 0
mtl_tx_fifo_not_empty: 0
mmtl_fifo_ctrl: 0
mtl_tx_fifo_read_ctrl_write: 0
mtl_tx_fifo_read_ctrl_wait: 0
mtl_tx_fifo_read_ctrl_read: 0
mtl_tx_fifo_read_ctrl_idle: 0
mac_tx_in_pause: 0
mac_tx_frame_ctrl_xfer: 0
mac_tx_frame_ctrl_idle: 0
mac_tx_frame_ctrl_wait: 0
mac_tx_frame_ctrl_pause: 0
mac_gmii_tx_proto_engine: 0
mtl_rx_fifo_fill_level_full: 0
mtl_rx_fifo_fill_above_thresh: 0
mtl_rx_fifo_fill_below_thresh: 0
mtl_rx_fifo_fill_level_empty: 0
mtl_rx_fifo_read_ctrl_flush: 0
mtl_rx_fifo_read_ctrl_read_data: 0
mtl_rx_fifo_read_ctrl_status: 0
mtl_rx_fifo_read_ctrl_idle: 0
mtl_rx_fifo_ctrl_active: 0
mac_rx_frame_ctrl_fifo: 0
mac_gmii_rx_proto_engine: 0
tx_tso_frames: 0
tx_tso_nfrags: 0
[-- Attachment #3: kern.log --]
[-- Type: text/plain, Size: 40656 bytes --]
Feb 18 17:59:55 localhost kernel: [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
Feb 18 17:59:55 localhost kernel: [ 0.000000] Linux version 5.0.0-rc7+ (root@odroidc2) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)) #1 SMP Mon Feb 18 08:12:57 CET 2019
Feb 18 17:59:55 localhost kernel: [ 0.000000] Machine model: Hardkernel ODROID-C2
Feb 18 17:59:55 localhost kernel: [ 0.000000] Reserved memory: created CMA memory pool at 0x0000000068000000, size 256 MiB
Feb 18 17:59:55 localhost kernel: [ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
Feb 18 17:59:55 localhost kernel: [ 0.000000] On node 0 totalpages: 486144
Feb 18 17:59:55 localhost kernel: [ 0.000000] DMA32 zone: 7616 pages used for memmap
Feb 18 17:59:55 localhost kernel: [ 0.000000] DMA32 zone: 0 pages reserved
Feb 18 17:59:55 localhost kernel: [ 0.000000] DMA32 zone: 486144 pages, LIFO batch:63
Feb 18 17:59:55 localhost kernel: [ 0.000000] psci: probing for conduit method from DT.
Feb 18 17:59:55 localhost kernel: [ 0.000000] psci: PSCIv0.2 detected in firmware.
Feb 18 17:59:55 localhost kernel: [ 0.000000] psci: Using standard PSCI v0.2 function IDs
Feb 18 17:59:55 localhost kernel: [ 0.000000] psci: Trusted OS migration not required
Feb 18 17:59:55 localhost kernel: [ 0.000000] random: get_random_bytes called from start_kernel+0xa4/0x448 with crng_init=0
Feb 18 17:59:55 localhost kernel: [ 0.000000] percpu: Embedded 23 pages/cpu @(____ptrval____) s53528 r8192 d32488 u94208
Feb 18 17:59:55 localhost kernel: [ 0.000000] pcpu-alloc: s53528 r8192 d32488 u94208 alloc=23*4096
Feb 18 17:59:55 localhost kernel: [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
Feb 18 17:59:55 localhost kernel: [ 0.000000] Detected VIPT I-cache on CPU0
Feb 18 17:59:55 localhost kernel: [ 0.000000] CPU features: detected: ARM erratum 843419
Feb 18 17:59:55 localhost kernel: [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 478528
Feb 18 17:59:55 localhost kernel: [ 0.000000] Kernel command line: console=ttyAML0,115200 root=/dev/mmcblk1p2 rootwait rootflags=data=writeback rw slub_debug=P page_poison=1 slab_nomerge
Feb 18 17:59:55 localhost kernel: [ 0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes)
Feb 18 17:59:55 localhost kernel: [ 0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes)
Feb 18 17:59:55 localhost kernel: [ 0.000000] Memory: 1626632K/1944576K available (9150K kernel code, 650K rwdata, 2288K rodata, 448K init, 1101K bss, 55800K reserved, 262144K cma-reserved)
Feb 18 17:59:55 localhost kernel: [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
Feb 18 17:59:55 localhost kernel: [ 0.000000] rcu: Hierarchical RCU implementation.
Feb 18 17:59:55 localhost kernel: [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
Feb 18 17:59:55 localhost kernel: [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
Feb 18 17:59:55 localhost kernel: [ 0.000000] GIC: Using split EOI/Deactivate mode
Feb 18 17:59:55 localhost kernel: [ 0.000000] irq_meson_gpio: 133 to 8 gpio interrupt mux initialized
Feb 18 17:59:55 localhost kernel: [ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
Feb 18 17:59:55 localhost kernel: [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
Feb 18 17:59:55 localhost kernel: [ 0.000002] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
Feb 18 17:59:55 localhost kernel: [ 0.000225] Console: colour dummy device 80x25
Feb 18 17:59:55 localhost kernel: [ 0.000252] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
Feb 18 17:59:55 localhost kernel: [ 0.000258] pid_max: default: 32768 minimum: 301
Feb 18 17:59:55 localhost kernel: [ 0.000388] LSM: Security Framework initializing
Feb 18 17:59:55 localhost kernel: [ 0.000517] AppArmor: AppArmor initialized
Feb 18 17:59:55 localhost kernel: [ 0.000571] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes)
Feb 18 17:59:55 localhost kernel: [ 0.000577] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes)
Feb 18 17:59:55 localhost kernel: [ 0.001752] ASID allocator initialised with 65536 entries
Feb 18 17:59:55 localhost kernel: [ 0.001810] rcu: Hierarchical SRCU implementation.
Feb 18 17:59:55 localhost kernel: [ 0.002265] smp: Bringing up secondary CPUs ...
Feb 18 17:59:55 localhost kernel: [ 0.003167] Detected VIPT I-cache on CPU1
Feb 18 17:59:55 localhost kernel: [ 0.003211] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
Feb 18 17:59:55 localhost kernel: [ 0.004117] Detected VIPT I-cache on CPU2
Feb 18 17:59:55 localhost kernel: [ 0.004138] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
Feb 18 17:59:55 localhost kernel: [ 0.005029] Detected VIPT I-cache on CPU3
Feb 18 17:59:55 localhost kernel: [ 0.005046] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
Feb 18 17:59:55 localhost kernel: [ 0.005088] smp: Brought up 1 node, 4 CPUs
Feb 18 17:59:55 localhost kernel: [ 0.005098] SMP: Total of 4 processors activated.
Feb 18 17:59:55 localhost kernel: [ 0.005103] CPU features: detected: 32-bit EL0 Support
Feb 18 17:59:55 localhost kernel: [ 0.005107] CPU features: detected: CRC32 instructions
Feb 18 17:59:55 localhost kernel: [ 0.005229] CPU: All CPU(s) started at EL2
Feb 18 17:59:55 localhost kernel: [ 0.005243] alternatives: patching kernel code
Feb 18 17:59:55 localhost kernel: [ 0.006001] devtmpfs: initialized
Feb 18 17:59:55 localhost kernel: [ 0.011301] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
Feb 18 17:59:55 localhost kernel: [ 0.011319] futex hash table entries: 1024 (order: 4, 65536 bytes)
Feb 18 17:59:55 localhost kernel: [ 0.089843] xor: measuring software checksum speed
Feb 18 17:59:55 localhost kernel: [ 0.128142] 8regs : 2947.000 MB/sec
Feb 18 17:59:55 localhost kernel: [ 0.168165] 32regs : 3491.000 MB/sec
Feb 18 17:59:55 localhost kernel: [ 0.208189] arm64_neon: 3199.000 MB/sec
Feb 18 17:59:55 localhost kernel: [ 0.208192] xor: using function: 32regs (3491.000 MB/sec)
Feb 18 17:59:55 localhost kernel: [ 0.208203] pinctrl core: initialized pinctrl subsystem
Feb 18 17:59:55 localhost kernel: [ 0.209116] NET: Registered protocol family 16
Feb 18 17:59:55 localhost kernel: [ 0.209429] audit: initializing netlink subsys (disabled)
Feb 18 17:59:55 localhost kernel: [ 0.209579] audit: type=2000 audit(0.208:1): state=initialized audit_enabled=0 res=1
Feb 18 17:59:55 localhost kernel: [ 0.210098] vdso: 2 pages (1 code @ (____ptrval____), 1 data @ (____ptrval____))
Feb 18 17:59:55 localhost kernel: [ 0.210105] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
Feb 18 17:59:55 localhost kernel: [ 0.212710] DMA: preallocated 256 KiB pool for atomic allocations
Feb 18 17:59:55 localhost kernel: [ 0.212754] Serial: AMBA PL011 UART driver
Feb 18 17:59:55 localhost kernel: [ 0.221756] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
Feb 18 17:59:55 localhost kernel: [ 0.221765] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
Feb 18 17:59:55 localhost kernel: [ 0.221768] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
Feb 18 17:59:55 localhost kernel: [ 0.221772] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
Feb 18 17:59:55 localhost kernel: [ 0.288287] raid6: neonx8 gen() 2048 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.356332] raid6: neonx8 xor() 1940 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.424411] raid6: neonx4 gen() 1940 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.492446] raid6: neonx4 xor() 1862 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.560488] raid6: neonx2 gen() 1495 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.628536] raid6: neonx2 xor() 1559 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.696599] raid6: neonx1 gen() 933 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.764656] raid6: neonx1 xor() 1104 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.832726] raid6: int64x8 gen() 1414 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.900767] raid6: int64x8 xor() 937 MB/s
Feb 18 17:59:55 localhost kernel: [ 0.968808] raid6: int64x4 gen() 1268 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.036851] raid6: int64x4 xor() 976 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.104910] raid6: int64x2 gen() 844 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.172990] raid6: int64x2 xor() 769 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.241028] raid6: int64x1 gen() 531 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.309084] raid6: int64x1 xor() 574 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.309088] raid6: using algorithm neonx8 gen() 2048 MB/s
Feb 18 17:59:55 localhost kernel: [ 1.309090] raid6: .... xor() 1940 MB/s, rmw enabled
Feb 18 17:59:55 localhost kernel: [ 1.309094] raid6: using neon recovery algorithm
Feb 18 17:59:55 localhost kernel: [ 1.310489] SCSI subsystem initialized
Feb 18 17:59:55 localhost kernel: [ 1.310673] libata version 3.00 loaded.
Feb 18 17:59:55 localhost kernel: [ 1.310819] usbcore: registered new interface driver usbfs
Feb 18 17:59:55 localhost kernel: [ 1.310850] usbcore: registered new interface driver hub
Feb 18 17:59:55 localhost kernel: [ 1.310891] usbcore: registered new device driver usb
Feb 18 17:59:55 localhost kernel: [ 1.310978] pps_core: LinuxPPS API ver. 1 registered
Feb 18 17:59:55 localhost kernel: [ 1.310981] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
Feb 18 17:59:55 localhost kernel: [ 1.310993] PTP clock support registered
Feb 18 17:59:55 localhost kernel: [ 1.311367] Advanced Linux Sound Architecture Driver Initialized.
Feb 18 17:59:55 localhost kernel: [ 1.311743] NetLabel: Initializing
Feb 18 17:59:55 localhost kernel: [ 1.311746] NetLabel: domain hash size = 128
Feb 18 17:59:55 localhost kernel: [ 1.311749] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
Feb 18 17:59:55 localhost kernel: [ 1.311823] NetLabel: unlabeled traffic allowed by default
Feb 18 17:59:55 localhost kernel: [ 1.312093] clocksource: Switched to clocksource arch_sys_counter
Feb 18 17:59:55 localhost kernel: [ 1.312217] VFS: Disk quotas dquot_6.6.0
Feb 18 17:59:55 localhost kernel: [ 1.312267] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
Feb 18 17:59:55 localhost kernel: [ 1.312352] FS-Cache: Loaded
Feb 18 17:59:55 localhost kernel: [ 1.312561] CacheFiles: Loaded
Feb 18 17:59:55 localhost kernel: [ 1.312894] AppArmor: AppArmor Filesystem Enabled
Feb 18 17:59:55 localhost kernel: [ 1.317960] NET: Registered protocol family 2
Feb 18 17:59:55 localhost kernel: [ 1.318447] tcp_listen_portaddr_hash hash table entries: 1024 (order: 2, 16384 bytes)
Feb 18 17:59:55 localhost kernel: [ 1.318480] TCP established hash table entries: 16384 (order: 5, 131072 bytes)
Feb 18 17:59:55 localhost kernel: [ 1.318565] TCP bind hash table entries: 16384 (order: 6, 262144 bytes)
Feb 18 17:59:55 localhost kernel: [ 1.318736] TCP: Hash tables configured (established 16384 bind 16384)
Feb 18 17:59:55 localhost kernel: [ 1.318820] UDP hash table entries: 1024 (order: 3, 32768 bytes)
Feb 18 17:59:55 localhost kernel: [ 1.318858] UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes)
Feb 18 17:59:55 localhost kernel: [ 1.319026] NET: Registered protocol family 1
Feb 18 17:59:55 localhost kernel: [ 1.319757] hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 counters available
Feb 18 17:59:55 localhost kernel: [ 1.319953] kvm [1]: 8-bit VMID
Feb 18 17:59:55 localhost kernel: [ 1.319957] kvm [1]: IPA Size Limit: 40bits
Feb 18 17:59:55 localhost kernel: [ 1.320247] kvm [1]: vgic interrupt IRQ1
Feb 18 17:59:55 localhost kernel: [ 1.320327] kvm [1]: Hyp mode initialized successfully
Feb 18 17:59:55 localhost kernel: [ 1.321264] Initialise system trusted keyrings
Feb 18 17:59:55 localhost kernel: [ 1.321421] workingset: timestamp_bits=46 max_order=19 bucket_order=0
Feb 18 17:59:55 localhost kernel: [ 1.334597] Key type asymmetric registered
Feb 18 17:59:55 localhost kernel: [ 1.334608] Asymmetric key parser 'x509' registered
Feb 18 17:59:55 localhost kernel: [ 1.334665] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 248)
Feb 18 17:59:55 localhost kernel: [ 1.334765] io scheduler mq-deadline registered
Feb 18 17:59:55 localhost kernel: [ 1.334770] io scheduler kyber registered
Feb 18 17:59:55 localhost kernel: [ 1.335983] GPIO line 501 (usb-hub-reset) hogged as output/high
Feb 18 17:59:55 localhost kernel: [ 1.344176] meson_vid_pll_div_recalc_rate: Invalid config value for vid_pll_div
Feb 18 17:59:55 localhost kernel: [ 1.346163] soc soc0: Amlogic Meson GXBB (S905) Revision 1f:c (0:1) Detected
Feb 18 17:59:55 localhost kernel: [ 1.347227] c81004c0.serial: ttyAML0 at MMIO 0xc81004c0 (irq = 13, base_baud = 1500000) is a meson_uart
Feb 18 17:59:55 localhost kernel: [ 2.072721] printk: console [ttyAML0] enabled
Feb 18 17:59:55 localhost kernel: [ 2.084406] loop: module loaded
Feb 18 17:59:55 localhost kernel: [ 2.084757] zram: Added device: zram0
Feb 18 17:59:55 localhost kernel: [ 2.086038] mtdoops: mtd device (mtddev=name/number) must be supplied
Feb 18 17:59:55 localhost kernel: [ 2.092259] libphy: Fixed MDIO Bus: probed
Feb 18 17:59:55 localhost kernel: [ 2.096044] tun: Universal TUN/TAP device driver, 1.6
Feb 18 17:59:55 localhost kernel: [ 2.101735] meson8b-dwmac c9410000.ethernet: PTP uses main clock
Feb 18 17:59:55 localhost kernel: [ 2.106950] meson8b-dwmac c9410000.ethernet: no reset control found
Feb 18 17:59:55 localhost kernel: [ 2.113570] meson8b-dwmac c9410000.ethernet: User ID: 0x11, Synopsys ID: 0x37
Feb 18 17:59:55 localhost kernel: [ 2.120230] meson8b-dwmac c9410000.ethernet: DWMAC1000
Feb 18 17:59:55 localhost kernel: [ 2.125399] meson8b-dwmac c9410000.ethernet: DMA HW capability register supported
Feb 18 17:59:55 localhost kernel: [ 2.132816] meson8b-dwmac c9410000.ethernet: RX Checksum Offload Engine supported
Feb 18 17:59:55 localhost kernel: [ 2.140233] meson8b-dwmac c9410000.ethernet: COE Type 2
Feb 18 17:59:55 localhost kernel: [ 2.145407] meson8b-dwmac c9410000.ethernet: TX Checksum insertion supported
Feb 18 17:59:55 localhost kernel: [ 2.152393] meson8b-dwmac c9410000.ethernet: Wake-Up On Lan supported
Feb 18 17:59:55 localhost kernel: [ 2.158803] meson8b-dwmac c9410000.ethernet: Normal descriptors
Feb 18 17:59:55 localhost kernel: [ 2.164643] meson8b-dwmac c9410000.ethernet: Ring mode enabled
Feb 18 17:59:55 localhost kernel: [ 2.170420] meson8b-dwmac c9410000.ethernet: Enable RX Mitigation via HW Watchdog Timer
Feb 18 17:59:55 localhost kernel: [ 3.232112] libphy: stmmac: probed
Feb 18 17:59:55 localhost kernel: [ 3.233745] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
Feb 18 17:59:55 localhost kernel: [ 3.236357] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
Feb 18 17:59:55 localhost kernel: [ 3.242541] usbcore: registered new interface driver usb-storage
Feb 18 17:59:55 localhost kernel: [ 3.248496] usbcore: registered new interface driver usbserial_generic
Feb 18 17:59:55 localhost kernel: [ 3.254910] usbserial: USB Serial support registered for generic
Feb 18 17:59:55 localhost kernel: [ 3.261063] mousedev: PS/2 mouse device common for all mice
Feb 18 17:59:55 localhost kernel: [ 3.266534] i2c /dev entries driver
Feb 18 17:59:55 localhost kernel: [ 3.270421] IR Sharp protocol handler initialized
Feb 18 17:59:55 localhost kernel: [ 3.274478] IR XMP protocol handler initialized
Feb 18 17:59:55 localhost kernel: [ 3.279101] Registered IR keymap rc-empty
Feb 18 17:59:55 localhost kernel: [ 3.282971] rc rc0: meson-ir as /devices/platform/soc/c8100000.bus/c8100580.ir/rc/rc0
Feb 18 17:59:55 localhost kernel: [ 3.290928] input: meson-ir as /devices/platform/soc/c8100000.bus/c8100580.ir/rc/rc0/input0
Feb 18 17:59:55 localhost kernel: [ 3.299261] meson-ir c8100580.ir: receiver initialized
Feb 18 17:59:55 localhost kernel: [ 3.304627] softdog: initialized. soft_noboot=0 soft_margin=60 sec soft_panic=0 (nowayout=0)
Feb 18 17:59:55 localhost kernel: [ 3.313299] meson-gx-mmc d0074000.mmc: Linked as a consumer to regulator.2
Feb 18 17:59:55 localhost kernel: [ 3.319313] meson-gx-mmc d0074000.mmc: Linked as a consumer to regulator.1
Feb 18 17:59:55 localhost kernel: [ 3.326098] meson-gx-mmc d0074000.mmc: allocated mmc-pwrseq
Feb 18 17:59:55 localhost kernel: [ 3.359962] ledtrig-cpu: registered to indicate activity on CPUs
Feb 18 17:59:55 localhost kernel: [ 3.360601] meson-sm: secure-monitor enabled
Feb 18 17:59:55 localhost kernel: [ 3.364975] usbcore: registered new interface driver usbhid
Feb 18 17:59:55 localhost kernel: [ 3.370147] usbhid: USB HID core driver
Feb 18 17:59:55 localhost kernel: [ 3.374156] meson-saradc c1108680.adc: Linked as a consumer to regulator.1
Feb 18 17:59:55 localhost kernel: [ 3.382191] GACT probability on
Feb 18 17:59:55 localhost kernel: [ 3.383832] Mirror/redirect action on
Feb 18 17:59:55 localhost kernel: [ 3.387490] u32 classifier
Feb 18 17:59:55 localhost kernel: [ 3.390080] Performance counters on
Feb 18 17:59:55 localhost kernel: [ 3.393874] input device check on
Feb 18 17:59:55 localhost kernel: [ 3.397497] Actions configured
Feb 18 17:59:55 localhost kernel: [ 3.401466] NET: Registered protocol family 10
Feb 18 17:59:55 localhost kernel: [ 3.406328] Segment Routing with IPv6
Feb 18 17:59:55 localhost kernel: [ 3.409106] mip6: Mobile IPv6
Feb 18 17:59:55 localhost kernel: [ 3.411812] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
Feb 18 17:59:55 localhost kernel: [ 3.418438] NET: Registered protocol family 17
Feb 18 17:59:55 localhost kernel: [ 3.422102] NET: Registered protocol family 15
Feb 18 17:59:55 localhost kernel: [ 3.426581] Bridge firewalling registered
Feb 18 17:59:55 localhost kernel: [ 3.430472] NET: Registered protocol family 35
Feb 18 17:59:55 localhost kernel: [ 3.434996] 8021q: 802.1Q VLAN Support v1.8
Feb 18 17:59:55 localhost kernel: [ 3.439022] Key type dns_resolver registered
Feb 18 17:59:55 localhost kernel: [ 3.443790] registered taskstats version 1
Feb 18 17:59:55 localhost kernel: [ 3.447358] Loading compiled-in X.509 certificates
Feb 18 17:59:55 localhost kernel: [ 3.453507] Btrfs loaded, crc32c=crc32c-generic
Feb 18 17:59:55 localhost kernel: [ 3.456633] AppArmor: AppArmor sha1 policy hashing enabled
Feb 18 17:59:55 localhost kernel: [ 3.472209] phy phy-c0000000.phy.0: Linked as a consumer to regulator.3
Feb 18 17:59:55 localhost kernel: [ 3.473381] phy phy-c0000020.phy.1: Linked as a consumer to regulator.3
Feb 18 17:59:55 localhost kernel: [ 3.480055] meson-drm d0100000.vpu: Queued 2 outputs on vpu
Feb 18 17:59:55 localhost kernel: [ 3.485552] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
Feb 18 17:59:55 localhost kernel: [ 3.491890] [drm] No driver support for vblank timestamp query.
Feb 18 17:59:55 localhost kernel: [ 3.497756] meson-drm d0100000.vpu: CVBS Output connector not available
Feb 18 17:59:55 localhost kernel: [ 3.532127] meson-dw-hdmi c883a000.hdmi-tx: Detected HDMI TX controller v2.01a with HDCP (meson_dw_hdmi_phy)
Feb 18 17:59:55 localhost kernel: [ 3.536619] meson-dw-hdmi c883a000.hdmi-tx: registered DesignWare HDMI I2C bus driver
Feb 18 17:59:55 localhost kernel: [ 3.544287] meson-drm d0100000.vpu: bound c883a000.hdmi-tx (ops 0xffffff8010a01668)
Feb 18 17:59:55 localhost kernel: [ 3.551959] [drm] Initialized meson 1.0.0 20161109 for d0100000.vpu on minor 0
Feb 18 17:59:55 localhost kernel: [ 3.558843] [drm] Cannot find any crtc or sizes
Feb 18 17:59:55 localhost kernel: [ 3.563526] dwc2 c9000000.usb: c9000000.usb supply vusb_d not found, using dummy regulator
Feb 18 17:59:55 localhost kernel: [ 3.571514] dwc2 c9000000.usb: Linked as a consumer to regulator.0
Feb 18 17:59:55 localhost kernel: [ 3.577601] dwc2 c9000000.usb: c9000000.usb supply vusb_a not found, using dummy regulator
Feb 18 17:59:55 localhost kernel: [ 3.585910] [drm] Cannot find any crtc or sizes
Feb 18 17:59:55 localhost kernel: [ 3.591361] phy phy-c0000000.phy.0: USB ID detect failed!
Feb 18 17:59:55 localhost kernel: [ 3.595629] phy phy-c0000000.phy.0: phy poweron failed --> -22
Feb 18 17:59:55 localhost kernel: [ 3.601446] WARNING: CPU: 0 PID: 32 at _regulator_put.part.12+0x118/0x120
Feb 18 17:59:55 localhost kernel: [ 3.608125] Modules linked in:
Feb 18 17:59:55 localhost kernel: [ 3.611146] CPU: 0 PID: 32 Comm: kworker/0:1 Not tainted 5.0.0-rc7+ #1
Feb 18 17:59:55 localhost kernel: [ 3.617612] Hardware name: Hardkernel ODROID-C2 (DT)
Feb 18 17:59:55 localhost kernel: [ 3.622536] Workqueue: events deferred_probe_work_func
Feb 18 17:59:55 localhost kernel: [ 3.627618] pstate: 80000005 (Nzcv daif -PAN -UAO)
Feb 18 17:59:55 localhost kernel: [ 3.632362] pc : _regulator_put.part.12+0x118/0x120
Feb 18 17:59:55 localhost kernel: [ 3.637192] lr : regulator_put+0x34/0x50
Feb 18 17:59:55 localhost kernel: [ 3.641072] sp : ffffff8010eaba90
Feb 18 17:59:55 localhost kernel: [ 3.644349] x29: ffffff8010eaba90 x28: ffffffc064ce7328
Feb 18 17:59:55 localhost kernel: [ 3.649610] x27: ffffffc064ce7328 x26: ffffff80105c6248
Feb 18 17:59:55 localhost kernel: [ 3.654872] x25: ffffff80105c6250 x24: 0000000000000009
Feb 18 17:59:55 localhost kernel: [ 3.660133] x23: ffffffc064ce7090 x22: ffffff8010eabb88
Feb 18 17:59:55 localhost kernel: [ 3.665394] x21: 0000000000000000 x20: ffffffc06400a900
Feb 18 17:59:55 localhost kernel: [ 3.670655] x19: ffffffc06400a900 x18: ffffffffffffffff
Feb 18 17:59:55 localhost kernel: [ 3.675917] x17: 000000008b9b3fdd x16: 00000000e39dafd8
Feb 18 17:59:55 localhost kernel: [ 3.681178] x15: ffffff8010c3c648 x14: ffffff8090eab787
Feb 18 17:59:55 localhost kernel: [ 3.686439] x13: ff00000000000000 x12: ffffffffffffffff
Feb 18 17:59:55 localhost kernel: [ 3.691700] x11: 0000000000000038 x10: 0000000000000006
Feb 18 17:59:55 localhost kernel: [ 3.696961] x9 : 0000000000000040 x8 : ffffffc06400bbff
Feb 18 17:59:55 localhost kernel: [ 3.702223] x7 : 6b6b6b6b6b6b6b6b x6 : 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.707484] x5 : 0000000000000000 x4 : 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.712745] x3 : 0000000000000000 x2 : 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.718006] x1 : ffffffc064c63800 x0 : 0000000000000001
Feb 18 17:59:55 localhost kernel: [ 3.723268] Call trace:
Feb 18 17:59:55 localhost kernel: [ 3.725685] _regulator_put.part.12+0x118/0x120
Feb 18 17:59:55 localhost kernel: [ 3.730169] regulator_put+0x34/0x50
Feb 18 17:59:55 localhost kernel: [ 3.733705] regulator_bulk_free+0x34/0x50
Feb 18 17:59:55 localhost kernel: [ 3.737760] devm_regulator_bulk_release+0x18/0x20
Feb 18 17:59:55 localhost kernel: [ 3.742504] release_nodes+0x17c/0x2f8
Feb 18 17:59:55 localhost kernel: [ 3.746212] devres_release_all+0x58/0x88
Feb 18 17:59:55 localhost kernel: [ 3.750179] really_probe+0xc4/0x2c0
Feb 18 17:59:55 localhost kernel: [ 3.753715] driver_probe_device+0x58/0x100
Feb 18 17:59:55 localhost kernel: [ 3.757855] __device_attach_driver+0x9c/0xf8
Feb 18 17:59:55 localhost kernel: [ 3.762170] bus_for_each_drv+0x70/0xc8
Feb 18 17:59:55 localhost kernel: [ 3.765962] __device_attach+0xe0/0x140
Feb 18 17:59:55 localhost kernel: [ 3.769758] device_initial_probe+0x10/0x18
Feb 18 17:59:55 localhost kernel: [ 3.773897] bus_probe_device+0x94/0xa0
Feb 18 17:59:55 localhost kernel: [ 3.777693] deferred_probe_work_func+0x80/0xb8
Feb 18 17:59:55 localhost kernel: [ 3.782181] process_one_work+0x1b0/0x348
Feb 18 17:59:55 localhost kernel: [ 3.786146] worker_thread+0x224/0x448
Feb 18 17:59:55 localhost kernel: [ 3.789855] kthread+0xf8/0x128
Feb 18 17:59:55 localhost kernel: [ 3.792960] ret_from_fork+0x10/0x1c
Feb 18 17:59:55 localhost kernel: [ 3.796495] ---[ end trace d139d5a470185e84 ]---
Feb 18 17:59:55 localhost kernel: [ 3.801135] WARNING: CPU: 0 PID: 32 at _regulator_put.part.12+0x118/0x120
Feb 18 17:59:55 localhost kernel: [ 3.807793] Modules linked in:
Feb 18 17:59:55 localhost kernel: [ 3.810814] CPU: 0 PID: 32 Comm: kworker/0:1 Tainted: G W 5.0.0-rc7+ #1
Feb 18 17:59:55 localhost kernel: [ 3.818661] Hardware name: Hardkernel ODROID-C2 (DT)
Feb 18 17:59:55 localhost kernel: [ 3.823579] Workqueue: events deferred_probe_work_func
Feb 18 17:59:55 localhost kernel: [ 3.828666] pstate: 80000005 (Nzcv daif -PAN -UAO)
Feb 18 17:59:55 localhost kernel: [ 3.833410] pc : _regulator_put.part.12+0x118/0x120
Feb 18 17:59:55 localhost kernel: [ 3.838240] lr : regulator_put+0x34/0x50
Feb 18 17:59:55 localhost kernel: [ 3.842120] sp : ffffff8010eaba90
Feb 18 17:59:55 localhost kernel: [ 3.845398] x29: ffffff8010eaba90 x28: ffffffc064ce7328
Feb 18 17:59:55 localhost kernel: [ 3.850659] x27: ffffffc064ce7328 x26: ffffff80105c6248
Feb 18 17:59:55 localhost kernel: [ 3.855920] x25: ffffff80105c6250 x24: 0000000000000009
Feb 18 17:59:55 localhost kernel: [ 3.861182] x23: ffffffc064ce7090 x22: ffffff8010eabb88
Feb 18 17:59:55 localhost kernel: [ 3.866443] x21: 0000000000000000 x20: ffffffc06400bc80
Feb 18 17:59:55 localhost kernel: [ 3.871704] x19: ffffffc06400bc80 x18: 0000000000000039
Feb 18 17:59:55 localhost kernel: [ 3.876965] x17: 000000008b9b3fdd x16: 00000000e39dafd8
Feb 18 17:59:55 localhost kernel: [ 3.882227] x15: ffffff8010c3c648 x14: ffffffc005335e10
Feb 18 17:59:55 localhost kernel: [ 3.887488] x13: ffffffc065109430 x12: 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.892749] x11: ffffffc065109240 x10: 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.898010] x9 : 0000000000000040 x8 : ffffffc06400a9ff
Feb 18 17:59:55 localhost kernel: [ 3.903271] x7 : 6b6b6b6b6b6b6b6b x6 : 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.908533] x5 : 0000000000000000 x4 : 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.913794] x3 : 0000000000000000 x2 : 0000000000000000
Feb 18 17:59:55 localhost kernel: [ 3.919055] x1 : ffffffc064c63800 x0 : 0000000000000001
Feb 18 17:59:55 localhost kernel: [ 3.924316] Call trace:
Feb 18 17:59:55 localhost kernel: [ 3.926733] _regulator_put.part.12+0x118/0x120
Feb 18 17:59:55 localhost kernel: [ 3.931218] regulator_put+0x34/0x50
Feb 18 17:59:55 localhost kernel: [ 3.934754] regulator_bulk_free+0x34/0x50
Feb 18 17:59:55 localhost kernel: [ 3.938808] devm_regulator_bulk_release+0x18/0x20
Feb 18 17:59:55 localhost kernel: [ 3.943552] release_nodes+0x17c/0x2f8
Feb 18 17:59:55 localhost kernel: [ 3.947261] devres_release_all+0x58/0x88
Feb 18 17:59:55 localhost kernel: [ 3.951227] really_probe+0xc4/0x2c0
Feb 18 17:59:55 localhost kernel: [ 3.954764] driver_probe_device+0x58/0x100
Feb 18 17:59:55 localhost kernel: [ 3.958904] __device_attach_driver+0x9c/0xf8
Feb 18 17:59:55 localhost kernel: [ 3.963218] bus_for_each_drv+0x70/0xc8
Feb 18 17:59:55 localhost kernel: [ 3.967011] __device_attach+0xe0/0x140
Feb 18 17:59:55 localhost kernel: [ 3.970806] device_initial_probe+0x10/0x18
Feb 18 17:59:55 localhost kernel: [ 3.974946] bus_probe_device+0x94/0xa0
Feb 18 17:59:55 localhost kernel: [ 3.978741] deferred_probe_work_func+0x80/0xb8
Feb 18 17:59:55 localhost kernel: [ 3.983227] process_one_work+0x1b0/0x348
Feb 18 17:59:55 localhost kernel: [ 3.987194] worker_thread+0x224/0x448
Feb 18 17:59:55 localhost kernel: [ 3.990903] kthread+0xf8/0x128
Feb 18 17:59:55 localhost kernel: [ 3.994008] ret_from_fork+0x10/0x1c
Feb 18 17:59:55 localhost kernel: [ 3.997543] ---[ end trace d139d5a470185e85 ]---
Feb 18 17:59:55 localhost kernel: [ 4.002170] dwc2: probe of c9000000.usb failed with error -22
Feb 18 17:59:55 localhost kernel: [ 4.008025] dwc2 c9100000.usb: c9100000.usb supply vusb_d not found, using dummy regulator
Feb 18 17:59:55 localhost kernel: [ 4.016048] dwc2 c9100000.usb: Linked as a consumer to regulator.0
Feb 18 17:59:55 localhost kernel: [ 4.022135] dwc2 c9100000.usb: c9100000.usb supply vusb_a not found, using dummy regulator
Feb 18 17:59:55 localhost kernel: [ 4.088103] dwc2 c9100000.usb: dwc2_check_params: Invalid parameter lpm=1
Feb 18 17:59:55 localhost kernel: [ 4.089237] dwc2 c9100000.usb: dwc2_check_params: Invalid parameter lpm_clock_gating=1
Feb 18 17:59:55 localhost kernel: [ 4.097094] dwc2 c9100000.usb: dwc2_check_params: Invalid parameter besl=1
Feb 18 17:59:55 localhost kernel: [ 4.103905] dwc2 c9100000.usb: dwc2_check_params: Invalid parameter hird_threshold_en=1
Feb 18 17:59:55 localhost kernel: [ 4.112794] dwc2 c9100000.usb: DWC OTG Controller
Feb 18 17:59:55 localhost kernel: [ 4.116514] dwc2 c9100000.usb: new USB bus registered, assigned bus number 1
Feb 18 17:59:55 localhost kernel: [ 4.123505] dwc2 c9100000.usb: irq 34, io mem 0xc9100000
Feb 18 17:59:55 localhost kernel: [ 4.129304] hub 1-0:1.0: USB hub found
Feb 18 17:59:55 localhost kernel: [ 4.132477] hub 1-0:1.0: 1 port detected
Feb 18 17:59:55 localhost kernel: [ 4.137029] meson-gx-mmc d0072000.mmc: Linked as a consumer to regulator.4
Feb 18 17:59:55 localhost kernel: [ 4.143189] meson-gx-mmc d0072000.mmc: Linked as a consumer to regulator.5
Feb 18 17:59:55 localhost kernel: [ 4.150006] meson-gx-mmc d0072000.mmc: Got CD GPIO
Feb 18 17:59:55 localhost kernel: [ 4.182949] hctosys: unable to open rtc device (rtc0)
Feb 18 17:59:55 localhost kernel: [ 4.183160] VCC3V3: disabling
Feb 18 17:59:55 localhost kernel: [ 4.185396] ALSA device list:
Feb 18 17:59:55 localhost kernel: [ 4.188230] No soundcards found.
Feb 18 17:59:55 localhost kernel: [ 4.197290] Waiting for root device /dev/mmcblk1p2...
Feb 18 17:59:55 localhost kernel: [ 4.262022] mmc1: new high speed SDHC card at address 0007
Feb 18 17:59:55 localhost kernel: [ 4.264022] mmcblk1: mmc1:0007 SL16G 14.5 GiB
Feb 18 17:59:55 localhost kernel: [ 4.267751] mmcblk1: p1 p2
Feb 18 17:59:55 localhost kernel: [ 4.277863] EXT4-fs (mmcblk1p2): Mount option "data=writeback" incompatible with ext2
Feb 18 17:59:55 localhost kernel: [ 4.337210] EXT4-fs (mmcblk1p2): mounted filesystem with writeback data mode. Opts: data=writeback
Feb 18 17:59:55 localhost kernel: [ 4.340552] VFS: Mounted root (ext4 filesystem) on device 179:2.
Feb 18 17:59:55 localhost kernel: [ 4.354380] devtmpfs: mounted
Feb 18 17:59:55 localhost kernel: [ 4.354679] Freeing unused kernel memory: 448K
Feb 18 17:59:55 localhost kernel: [ 4.368669] Checked W+X mappings: passed, no W+X pages found
Feb 18 17:59:55 localhost kernel: [ 4.368702] Run /sbin/init as init process
Feb 18 17:59:55 localhost kernel: [ 4.532116] usb 1-1: new high-speed USB device number 2 using dwc2
Feb 18 17:59:55 localhost kernel: [ 4.661729] random: fast init done
Feb 18 17:59:55 localhost kernel: [ 4.742039] hub 1-1:1.0: USB hub found
Feb 18 17:59:55 localhost kernel: [ 4.742348] hub 1-1:1.0: 4 ports detected
Feb 18 17:59:55 localhost kernel: [ 5.032130] usb 1-1.1: new high-speed USB device number 3 using dwc2
Feb 18 17:59:55 localhost kernel: [ 5.043062] random: systemd: uninitialized urandom read (16 bytes read)
Feb 18 17:59:55 localhost kernel: [ 5.059577] random: systemd: uninitialized urandom read (16 bytes read)
Feb 18 17:59:55 localhost kernel: [ 5.060601] random: systemd: uninitialized urandom read (16 bytes read)
Feb 18 17:59:55 localhost kernel: [ 5.212131] usb 1-1.2: new high-speed USB device number 4 using dwc2
Feb 18 17:59:55 localhost kernel: [ 5.969604] Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Feb 18 17:59:55 localhost kernel: [ 6.138323] RPC: Registered named UNIX socket transport module.
Feb 18 17:59:55 localhost kernel: [ 6.138598] RPC: Registered udp transport module.
Feb 18 17:59:55 localhost kernel: [ 6.143325] RPC: Registered tcp transport module.
Feb 18 17:59:55 localhost kernel: [ 6.147962] RPC: Registered tcp NFSv4.1 backchannel transport module.
Feb 18 17:59:55 localhost kernel: [ 6.206002] EXT4-fs (mmcblk1p2): re-mounted. Opts: commit=600,errors=remount-ro
Feb 18 17:59:55 localhost kernel: [ 6.415907] random: crng init done
Feb 18 17:59:55 localhost kernel: [ 6.417316] random: 7 urandom warning(s) missed due to ratelimiting
Feb 18 17:59:55 localhost kernel: [ 6.463575] synth uevent: /devices/platform/soc/c8100000.bus/c8100580.ir/rc/rc0/input0: failed to send uevent
Feb 18 17:59:55 localhost kernel: [ 6.463582] input input0: uevent: failed to send synthetic uevent
Feb 18 17:59:55 localhost kernel: [ 6.875888] cfg80211: Loading compiled-in X.509 certificates for regulatory database
Feb 18 17:59:55 localhost kernel: [ 6.888425] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
Feb 18 17:59:55 localhost kernel: [ 6.921727] Generic PHY stmmac-0:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=stmmac-0:00, irq=POLL)
Feb 18 17:59:55 localhost kernel: [ 6.932505] meson8b-dwmac c9410000.ethernet eth0: No Safety Features support found
Feb 18 17:59:55 localhost kernel: [ 6.932910] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
Feb 18 17:59:55 localhost kernel: [ 6.934435] meson8b-dwmac c9410000.ethernet eth0: PTP not supported by HW
Feb 18 17:59:55 localhost kernel: [ 6.936631] meson8b-dwmac c9410000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
Feb 18 17:59:55 localhost kernel: [ 6.943089] cfg80211: failed to load regulatory.db
Feb 18 17:59:55 localhost kernel: [ 7.192113] usb 1-1.2: reset high-speed USB device number 4 using dwc2
Feb 18 17:59:55 localhost kernel: [ 7.218345] br-lan: port 1(eth0.3) entered blocking state
Feb 18 17:59:55 localhost kernel: [ 7.218814] br-lan: port 1(eth0.3) entered disabled state
Feb 18 17:59:55 localhost kernel: [ 7.224445] device eth0.3 entered promiscuous mode
Feb 18 17:59:55 localhost kernel: [ 7.232066] device eth0 entered promiscuous mode
Feb 18 17:59:55 localhost kernel: [ 7.237269] br-lan: port 1(eth0.3) entered blocking state
Feb 18 17:59:55 localhost kernel: [ 7.238824] br-lan: port 1(eth0.3) entered forwarding state
Feb 18 17:59:55 localhost kernel: [ 7.241449] 88XXau: loading out-of-tree module taints kernel.
Feb 18 17:59:55 localhost kernel: [ 7.305670] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 2872, rev 0202 detected
Feb 18 17:59:55 localhost kernel: [ 7.362230] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0001 detected
Feb 18 17:59:55 localhost kernel: [ 7.364003] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
Feb 18 17:59:55 localhost kernel: [ 7.365596] usbcore: registered new interface driver rt2800usb
Feb 18 17:59:55 localhost kernel: [ 7.809068] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
Feb 18 17:59:55 localhost kernel: [ 7.826324] ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36
Feb 18 17:59:55 localhost kernel: [ 8.140162] usb 1-1.1: reset high-speed USB device number 3 using dwc2
Feb 18 17:59:55 localhost kernel: [ 8.240588] usb 1-1.1: device firmware changed
Feb 18 17:59:55 localhost kernel: [ 8.242290] usbcore: registered new interface driver rtl88xxau
Feb 18 17:59:55 localhost kernel: [ 8.243329] usb 1-1.1: USB disconnect, device number 3
Feb 18 17:59:55 localhost kernel: [ 8.328139] usb 1-1.1: new high-speed USB device number 5 using dwc2
Feb 18 17:59:55 localhost kernel: [ 8.514423] zram0: detected capacity change from 0 to 52428800
Feb 18 17:59:55 localhost kernel: [ 8.811641] rtl88xxau 1-1.1:1.0 wlan2: renamed from wlan1
Feb 18 17:59:55 localhost kernel: [ 8.907728] new mount options do not match the existing superblock, will be ignored
Feb 18 17:59:55 localhost kernel: [ 9.022314] fuse init (API version 7.28)
Feb 18 17:59:55 localhost kernel: [ 9.571880] br-dmz: port 1(eth0.2) entered blocking state
Feb 18 17:59:55 localhost kernel: [ 9.571919] br-dmz: port 1(eth0.2) entered disabled state
Feb 18 17:59:55 localhost kernel: [ 9.577524] device eth0.2 entered promiscuous mode
Feb 18 17:59:55 localhost kernel: [ 9.588962] br-dmz: port 1(eth0.2) entered blocking state
Feb 18 17:59:55 localhost kernel: [ 9.589003] br-dmz: port 1(eth0.2) entered forwarding state
Feb 18 17:59:55 localhost kernel: [ 9.970330] br-iot: port 1(eth0.5) entered blocking state
Feb 18 17:59:55 localhost kernel: [ 9.970375] br-iot: port 1(eth0.5) entered disabled state
Feb 18 17:59:55 localhost kernel: [ 9.975834] device eth0.5 entered promiscuous mode
Feb 18 17:59:55 localhost kernel: [ 9.986657] br-iot: port 1(eth0.5) entered blocking state
Feb 18 17:59:55 localhost kernel: [ 9.986698] br-iot: port 1(eth0.5) entered forwarding state
Feb 18 18:00:06 localhost kernel: [ 21.021783] CIFS: Attempting to mount //10.10.30.136/USBStick
Feb 18 18:00:06 localhost kernel: [ 21.021968] No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.
Feb 18 18:00:06 localhost kernel: [ 21.022464] CIFS: Attempting to mount //10.10.30.136/Multimedia
Feb 18 18:00:06 localhost kernel: [ 21.022797] CIFS: Attempting to mount //10.10.30.136/Public
Feb 18 18:00:06 localhost kernel: [ 21.022856] No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.
Feb 18 18:00:07 localhost kernel: [ 21.078731] No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.
Feb 18 18:00:07 localhost kernel: [ 21.203783] cryptd: max_cpu_qlen set to 1000
Feb 18 18:00:07 localhost kernel: [ 21.206254] input: lircd-uinput as /devices/virtual/input/input1
Feb 18 18:00:07 localhost kernel: [ 21.596363] input: meson-ir (lircd bypass) as /devices/virtual/input/input2
Feb 18 18:00:07 localhost kernel: [ 21.669334] br-guest: port 1(wlan0) entered blocking state
Feb 18 18:00:07 localhost kernel: [ 21.670122] br-guest: port 1(wlan0) entered disabled state
Feb 18 18:00:07 localhost kernel: [ 21.675913] device wlan0 entered promiscuous mode
Feb 18 18:00:07 localhost kernel: [ 21.825578] br-guest: port 1(wlan0) entered blocking state
Feb 18 18:00:07 localhost kernel: [ 21.830103] br-guest: port 1(wlan0) entered forwarding state
Feb 18 18:00:07 localhost kernel: [ 21.901449] br-lan: port 2(wlan0_1) entered blocking state
Feb 18 18:00:07 localhost kernel: [ 21.901489] br-lan: port 2(wlan0_1) entered disabled state
Feb 18 18:00:07 localhost kernel: [ 21.907035] device wlan0_1 entered promiscuous mode
Feb 18 18:00:07 localhost kernel: [ 21.922534] br-lan: port 2(wlan0_1) entered blocking state
Feb 18 18:00:07 localhost kernel: [ 21.922570] br-lan: port 2(wlan0_1) entered forwarding state
Feb 18 18:00:08 localhost kernel: [ 22.921295] br-lan: port 3(wlan2) entered blocking state
Feb 18 18:00:08 localhost kernel: [ 22.921344] br-lan: port 3(wlan2) entered disabled state
Feb 18 18:00:08 localhost kernel: [ 22.926623] device wlan2 entered promiscuous mode
Feb 18 18:00:08 localhost kernel: [ 22.931105] br-lan: port 3(wlan2) entered blocking state
Feb 18 18:00:08 localhost kernel: [ 22.936230] br-lan: port 3(wlan2) entered forwarding state
Feb 18 18:00:09 localhost kernel: [ 23.180963] ip_local_port_range: prefer different parity for start/end values.
[-- Attachment #4: ethtool_test.txt --]
[-- Type: text/plain, Size: 5360 bytes --]
NIC statistics:
mmc_tx_octetcount_gb: 0
mmc_tx_framecount_gb: 0
mmc_tx_broadcastframe_g: 0
mmc_tx_multicastframe_g: 0
mmc_tx_64_octets_gb: 0
mmc_tx_65_to_127_octets_gb: 0
mmc_tx_128_to_255_octets_gb: 0
mmc_tx_256_to_511_octets_gb: 0
mmc_tx_512_to_1023_octets_gb: 0
mmc_tx_1024_to_max_octets_gb: 0
mmc_tx_unicast_gb: 0
mmc_tx_multicast_gb: 0
mmc_tx_broadcast_gb: 0
mmc_tx_underflow_error: 0
mmc_tx_singlecol_g: 0
mmc_tx_multicol_g: 0
mmc_tx_deferred: 0
mmc_tx_latecol: 0
mmc_tx_exesscol: 0
mmc_tx_carrier_error: 0
mmc_tx_octetcount_g: 0
mmc_tx_framecount_g: 0
mmc_tx_excessdef: 0
mmc_tx_pause_frame: 0
mmc_tx_vlan_frame_g: 0
mmc_rx_framecount_gb: 210416
mmc_rx_octetcount_gb: 179141135
mmc_rx_octetcount_g: 179141135
mmc_rx_broadcastframe_g: 12969
mmc_rx_multicastframe_g: 62
mmc_rx_crc_error: 0
mmc_rx_align_error: 0
mmc_rx_run_error: 0
mmc_rx_jabber_error: 0
mmc_rx_undersize_g: 0
mmc_rx_oversize_g: 0
mmc_rx_64_octets_gb: 0
mmc_rx_65_to_127_octets_gb: 92779
mmc_rx_128_to_255_octets_gb: 3501
mmc_rx_256_to_511_octets_gb: 1242
mmc_rx_512_to_1023_octets_gb: 241
mmc_rx_1024_to_max_octets_gb: 112653
mmc_rx_unicast_g: 197385
mmc_rx_length_error: 0
mmc_rx_autofrangetype: 0
mmc_rx_pause_frames: 0
mmc_rx_fifo_overflow: 1837
mmc_rx_vlan_frames_gb: 210408
mmc_rx_watchdog_error: 0
mmc_rx_ipc_intr_mask: 3221078013
mmc_rx_ipc_intr: 0
mmc_rx_ipv4_gd: 197672
mmc_rx_ipv4_hderr: 0
mmc_rx_ipv4_nopay: 0
mmc_rx_ipv4_frag: 0
mmc_rx_ipv4_udsbl: 0
mmc_rx_ipv4_gd_octets: 173449744
mmc_rx_ipv4_hderr_octets: 0
mmc_rx_ipv4_nopay_octets: 0
mmc_rx_ipv4_frag_octets: 0
mmc_rx_ipv4_udsbl_octets: 0
mmc_rx_ipv6_gd_octets: 10629
mmc_rx_ipv6_hderr_octets: 0
mmc_rx_ipv6_nopay_octets: 0
mmc_rx_ipv6_gd: 26
mmc_rx_ipv6_hderr: 0
mmc_rx_ipv6_nopay: 0
mmc_rx_udp_gd: 5382
mmc_rx_udp_err: 0
mmc_rx_tcp_gd: 192230
mmc_rx_tcp_err: 0
mmc_rx_icmp_gd: 86
mmc_rx_icmp_err: 0
mmc_rx_udp_gd_octets: 1017976
mmc_rx_udp_err_octets: 0
mmc_rx_tcp_gd_octets: 168484207
mmc_rx_tcp_err_octets: 0
mmc_rx_icmp_gd_octets: 3710
mmc_rx_icmp_err_octets: 0
tx_underflow: 0
tx_carrier: 0
tx_losscarrier: 0
vlan_tag: 208571
tx_deferred: 0
tx_vlan: 517448
tx_jabber: 0
tx_frame_flushed: 0
tx_payload_error: 0
tx_ip_header_error: 0
rx_desc: 0
sa_filter_fail: 0
overflow_error: 0
ipc_csum_error: 0
rx_collision: 0
rx_crc_errors: 0
dribbling_bit: 0
rx_length: 0
rx_mii: 0
rx_multicast: 0
rx_gmac_overflow: 0
rx_watchdog: 0
da_rx_filter_fail: 0
sa_rx_filter_fail: 0
rx_missed_cntr: 0
rx_overflow_cntr: 0
rx_vlan: 0
tx_undeflow_irq: 0
tx_process_stopped_irq: 0
tx_jabber_irq: 0
rx_overflow_irq: 0
rx_buf_unav_irq: 0
rx_process_stopped_irq: 0
rx_watchdog_irq: 0
tx_early_irq: 0
fatal_bus_error_irq: 0
rx_early_irq: 14871
threshold: 1
tx_pkt_n: 517448
rx_pkt_n: 208579
normal_irq_n: 63099
rx_normal_irq_n: 38811
napi_poll: 65991
tx_normal_irq_n: 22368
tx_clean: 65991
tx_set_ic_bit: 20697
irq_receive_pmt_irq_n: 0
mmc_tx_irq_n: 0
mmc_rx_irq_n: 0
mmc_rx_csum_offload_irq_n: 0
irq_tx_path_in_lpi_mode_n: 18571
irq_tx_path_exit_lpi_mode_n: 18570
irq_rx_path_in_lpi_mode_n: 0
irq_rx_path_exit_lpi_mode_n: 0
phy_eee_wakeup_error_n: 0
ip_hdr_err: 0
ip_payload_err: 0
ip_csum_bypassed: 0
ipv4_pkt_rcvd: 0
ipv6_pkt_rcvd: 0
no_ptp_rx_msg_type_ext: 0
ptp_rx_msg_type_sync: 0
ptp_rx_msg_type_follow_up: 0
ptp_rx_msg_type_delay_req: 0
ptp_rx_msg_type_delay_resp: 0
ptp_rx_msg_type_pdelay_req: 0
ptp_rx_msg_type_pdelay_resp: 0
ptp_rx_msg_type_pdelay_follow_up: 0
ptp_rx_msg_type_announce: 0
ptp_rx_msg_type_management: 0
ptp_rx_msg_pkt_reserved_type: 0
ptp_frame_type: 0
ptp_ver: 0
timestamp_dropped: 0
av_pkt_rcvd: 0
av_tagged_pkt_rcvd: 0
vlan_tag_priority_val: 0
l3_filter_match: 0
l4_filter_match: 0
l3_l4_filter_no_match: 0
irq_pcs_ane_n: 0
irq_pcs_link_n: 0
irq_rgmii_n: 0
mtl_tx_status_fifo_full: 0
mtl_tx_fifo_not_empty: 0
mmtl_fifo_ctrl: 0
mtl_tx_fifo_read_ctrl_write: 0
mtl_tx_fifo_read_ctrl_wait: 0
mtl_tx_fifo_read_ctrl_read: 0
mtl_tx_fifo_read_ctrl_idle: 0
mac_tx_in_pause: 0
mac_tx_frame_ctrl_xfer: 0
mac_tx_frame_ctrl_idle: 0
mac_tx_frame_ctrl_wait: 0
mac_tx_frame_ctrl_pause: 0
mac_gmii_tx_proto_engine: 0
mtl_rx_fifo_fill_level_full: 0
mtl_rx_fifo_fill_above_thresh: 0
mtl_rx_fifo_fill_below_thresh: 0
mtl_rx_fifo_fill_level_empty: 0
mtl_rx_fifo_read_ctrl_flush: 0
mtl_rx_fifo_read_ctrl_read_data: 0
mtl_rx_fifo_read_ctrl_status: 0
mtl_rx_fifo_read_ctrl_idle: 0
mtl_rx_fifo_ctrl_active: 0
mac_rx_frame_ctrl_fifo: 0
mac_gmii_rx_proto_engine: 0
tx_tso_frames: 0
tx_tso_nfrags: 0
^ permalink raw reply
* Re: stmmac / meson8b-dwmac
From: Jose Abreu @ 2019-02-18 17:05 UTC (permalink / raw)
To: Simon Huelck, Jose Abreu, Martin Blumenstingl
Cc: Emiliano Ingrassia, Gpeppe.cavallaro, alexandre.torgue,
linux-amlogic, netdev
In-Reply-To: <4493b245-de93-46cd-327b-8091a3babc3a@gmx.de>
On 2/18/2019 4:51 PM, Simon Huelck wrote:
> Hi,
>
> no im testing vanilla mainline kernel and against 4.14. where
> performance was ok. but turning off EEE via ethtool should have same
> results than removal of that patch.
>
> But, since it was mainlined recently , not long ago, i think this was
> tested ??
The thing is that phy_init_eee() is called by stmmac and this
function does not take into account the broken modes if it's
called too early which will cause driver to enable LPI in MAC.
And anyway, if you have lpi values in the ethtool stats then EEE
is being enabled by stmmac.
Please try the change I suggested.
Thanks,
Jose Miguel Abreu
^ permalink raw reply
* [PATCH v2] bonding: fix PACKET_ORIGDEV regression
From: Michal Soltys @ 2019-02-18 16:55 UTC (permalink / raw)
To: David Miller
Cc: Michal Soltys, Maciej Żenczykowski, Jay Vosburgh,
Vincent Bernat, Mahesh Bandewar, Chonggang Li, Linux NetDev
In-Reply-To: <CAHo-OoxoboVcn=MJj_XhaqeYkS_woGnuQ8vS9+BoDvdoae0YDA@mail.gmail.com>
This patch fixes a subtle PACKET_ORIGDEV regression which was a side
effect of fixes introduced by:
6a9e461f6fe4 bonding: pass link-local packets to bonding master also.
... to:
b89f04c61efe bonding: deliver link-local packets with skb->dev set to link that packets arrived on
While 6a9e461f6fe4 restored pre-b89f04c61efe presence of link-local
packets on bonding masters (which is required e.g. by linux bridges
participating in spanning tree or needed for lab-like setups created
with group_fwd_mask) it also caused the originating device
information to be lost due to cloning.
Maciej Żenczykowski proposed another solution that doesn't require
packet cloning and retains original device information - instead of
returning RX_HANDLER_PASS for all link-local packets it's now limited
only to packets from inactive slaves.
At the same time, packets passed to bonding masters retain correct
information about the originating device and PACKET_ORIGDEV can be used
to determine it.
This elegantly solves all issues so far:
- link-local packets that were removed from bonding masters
- LLDP daemons being forced to explicitly bind to slave interfaces
- PACKET_ORIGDEV having no effect on bond interfaces
Fixes: 6a9e461f6fe4 (bonding: pass link-local packets to bonding master also.)
Reported-by: Vincent Bernat <vincent@bernat.ch>
Signed-off-by: Michal Soltys <soltys@ziu.info>
---
drivers/net/bonding/bond_main.c | 35 +++++++++++++--------------------
1 file changed, 14 insertions(+), 21 deletions(-)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 485462d3087f..537c90c8eb0a 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1183,29 +1183,22 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)
}
}
- /* Link-local multicast packets should be passed to the
- * stack on the link they arrive as well as pass them to the
- * bond-master device. These packets are mostly usable when
- * stack receives it with the link on which they arrive
- * (e.g. LLDP) they also must be available on master. Some of
- * the use cases include (but are not limited to): LLDP agents
- * that must be able to operate both on enslaved interfaces as
- * well as on bonds themselves; linux bridges that must be able
- * to process/pass BPDUs from attached bonds when any kind of
- * STP version is enabled on the network.
+ /*
+ * For packets determined by bond_should_deliver_exact_match() call to
+ * be suppressed we want to make an exception for link-local packets.
+ * This is necessary for e.g. LLDP daemons to be able to monitor
+ * inactive slave links without being forced to bind to them
+ * explicitly.
+ *
+ * At the same time, packets that are passed to the bonding master
+ * (including link-local ones) can have their originating interface
+ * determined via PACKET_ORIGDEV socket option.
*/
- if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) {
- struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
-
- if (nskb) {
- nskb->dev = bond->dev;
- nskb->queue_mapping = 0;
- netif_rx(nskb);
- }
- return RX_HANDLER_PASS;
- }
- if (bond_should_deliver_exact_match(skb, slave, bond))
+ if (bond_should_deliver_exact_match(skb, slave, bond)) {
+ if (is_link_local_ether_addr(eth_hdr(skb)->h_dest))
+ return RX_HANDLER_PASS;
return RX_HANDLER_EXACT;
+ }
skb->dev = bond->dev;
--
2.20.1
^ permalink raw reply related
* Fwd: Invitation to comment on Virtual I/O Device (VIRTIO) Version 1.1 - ends February 21st
From: Michael S. Tsirkin @ 2019-02-18 16:56 UTC (permalink / raw)
To: netdev, kvm, linux-kernel
For everyone's information, pls see below.
Unfortunately earlier attempts to forward this announcement got blocked
by the spm filter. Sorry about that. There are still a couple of days
left to comment though.
----- Forwarded message from Paul Knight <paul.knight@oasis-open.org> -----
Date: Mon, 11 Feb 2019 00:01:28 -0500
From: Paul Knight <paul.knight@oasis-open.org>
To: tc-announce@lists.oasis-open.org, members@lists.oasis-open.org, OASIS TAB <tab@lists.oasis-open.org>,
virtio-email@lists.oasis-open.org, virtio-comment@lists.oasis-open.org
Subject: [virtio-comment] Invitation to comment on Virtual I/O Device (VIRTIO) Version 1.1 - ends February 21st
Message-ID: <CADgeAH9MH8sJpuzmNidBsxf7-8CqnQteXVTSgPNcsrY9W9xg+w@mail.gmail.com>
OASIS members and other interested parties,
OASIS and the OASIS Virtual I/O Device (VIRTIO) TC are pleased to announce
that Virtual I/O Device (VIRTIO) Version 1.1 is now available for public
review and comment.
Specification Overview:
This document describes the specifications of the “virtio” family of
devices. These devices are found in virtual environments, yet by design
they look like physical devices to the guest within the virtual machine -
and this document treats them as such. This similarity allows the guest to
use standard drivers and discovery mechanisms. The purpose of virtio and
this specification is that virtual environments and guests should have a
straightforward, efficient, standard and extensible mechanism for virtual
devices, rather than boutique per-environment or per-OS mechanisms.
The documents and related files are available here:
Virtual I/O Device (VIRTIO) Version 1.1
Committee Specification Draft 01 / Public Review Draft 01
20 December 2018
Editable source (Authoritative):
https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/tex/
HTML:
https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html
PDF:
https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.pdf
Example driver listing:
https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/listings/
For your convenience, OASIS provides a complete package of the
specification document and any related files in ZIP distribution files. You
can download the ZIP file at:
https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.zip
How to Provide Feedback
OASIS and the OASIS Virtual I/O Device (VIRTIO) TC value your feedback. We
solicit input from developers, users and others, whether OASIS members or
not, for the sake of improving the interoperability and quality of its
technical work.
The public review starts 23 January 2019 at 00:00 UTC and ends 21 February
2019 at 23:59 UTC.
Comments may be submitted to the TC by any person through the use of the
OASIS TC Comment Facility which can be used by following the instructions
on the TC's "Send A Comment" page (
https://www.oasis-open.org/committees/comments/index.php?wg_abbrev=virtio).
Comments submitted by TC non-members for this work and for other work of
this TC are publicly archived and can be viewed at:
https://lists.oasis-open.org/archives/virtio-comment/
All comments submitted to OASIS are subject to the OASIS Feedback License,
which ensures that the feedback you provide carries the same obligations at
least as the obligations of the TC members. In connection with this public
review, we call your attention to the OASIS IPR Policy [1] applicable
especially [2] to the work of this technical committee. All members of the
TC should be familiar with this document, which may create obligations
regarding the disclosure and availability of a member's patent, copyright,
trademark and license rights that read on an approved OASIS specification.
OASIS invites any persons who know of any such claims to disclose these if
they may be essential to the implementation of the above specification, so
that notice of them may be posted to the notice page for this TC's work.
Additional information about the specification and the VIRTIO TC can be
found at the TC's public home page:
https://www.oasis-open.org/committees/virtio/
========== Additional references:
[1] https://www.oasis-open.org/policies-guidelines/ipr
[2] https://www.oasis-open.org/committees/virtio/ipr.php
https://www.oasis-open.org/policies-guidelines/ipr#Non-Assertion-Mode
Non-Assertion Mode
--
Paul Knight <paul.knight@oasis-open.org> - Tel: +1 781-883-1783
OASIS <https://www.oasis-open.org/> - Advancing open standards for the
information society - Document Process Analyst
<https://www.oasis-open.org/people/staff/paul-knight>
----- End forwarded message -----
^ permalink raw reply
* Re: [PATCH RFC 2/5] net/sched: prepare TC actions to properly validate the control action
From: Vlad Buslov @ 2019-02-18 16:52 UTC (permalink / raw)
To: Davide Caratti
Cc: Jamal Hadi Salim, Cong Wang, Jiri Pirko, David S. Miller,
Paolo Abeni, netdev@vger.kernel.org
In-Reply-To: <e5c17c6efa552ef10bb719f3f0532fa717aca367.1550271080.git.dcaratti@redhat.com>
Hi Davide,
I really like the idea of putting all action validation code in single
place, instead of spreading it between act API and specific actions init
code.
See my comment regarding minor problem with using
tcf_action_set_ctrlact() on current net-next below.
On Fri 15 Feb 2019 at 23:06, Davide Caratti <dcaratti@redhat.com> wrote:
> - add tcf_action_check_ctrlact(), and pass a pointer to struct tcf_proto
> in each actions's init() function, to allow validation of 'goto chain'
> control action.
> - add tcf_action_set_ctrlact(), to set the control action, release the
> previous 'goto_chain' handle and replace it with the new one.
>
> Signed-off-by: Davide Caratti <dcaratti@redhat.com>
> ---
> include/net/act_api.h | 9 +++++-
> net/sched/act_api.c | 58 ++++++++++++++++++++++++++++++++++++--
> net/sched/act_bpf.c | 2 +-
> net/sched/act_connmark.c | 1 +
> net/sched/act_csum.c | 2 +-
> net/sched/act_gact.c | 2 +-
> net/sched/act_ife.c | 2 +-
> net/sched/act_ipt.c | 11 ++++----
> net/sched/act_mirred.c | 1 +
> net/sched/act_nat.c | 3 +-
> net/sched/act_pedit.c | 2 +-
> net/sched/act_police.c | 1 +
> net/sched/act_sample.c | 2 +-
> net/sched/act_simple.c | 2 +-
> net/sched/act_skbedit.c | 1 +
> net/sched/act_skbmod.c | 1 +
> net/sched/act_tunnel_key.c | 1 +
> net/sched/act_vlan.c | 2 +-
> 18 files changed, 86 insertions(+), 17 deletions(-)
>
> diff --git a/include/net/act_api.h b/include/net/act_api.h
> index dbc795ec659e..55a8d44ac0c7 100644
> --- a/include/net/act_api.h
> +++ b/include/net/act_api.h
> @@ -90,7 +90,7 @@ struct tc_action_ops {
> int (*lookup)(struct net *net, struct tc_action **a, u32 index);
> int (*init)(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **act, int ovr,
> - int bind, bool rtnl_held,
> + int bind, bool rtnl_held, struct tcf_proto *tp,
> struct netlink_ext_ack *extack);
> int (*walk)(struct net *, struct sk_buff *,
> struct netlink_callback *, int,
> @@ -181,6 +181,13 @@ int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);
> int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
> int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int);
>
> +int tcf_action_check_ctrlact(int action, struct tcf_proto *tp,
> + struct tcf_chain **handle,
> + struct netlink_ext_ack *extack);
> +
> +void tcf_action_set_ctrlact(struct tc_action *p, int action,
> + struct tcf_chain *goto_chain);
> +
> #endif /* CONFIG_NET_CLS_ACT */
>
> static inline void tcf_action_stats_update(struct tc_action *a, u64 bytes,
> diff --git a/net/sched/act_api.c b/net/sched/act_api.c
> index 91d79fac8cb2..088b0d846bde 100644
> --- a/net/sched/act_api.c
> +++ b/net/sched/act_api.c
> @@ -71,6 +71,60 @@ static void tcf_set_action_cookie(struct tc_cookie __rcu **old_cookie,
> call_rcu(&old->rcu, tcf_free_cookie_rcu);
> }
>
> +int tcf_action_check_ctrlact(int action, struct tcf_proto *tp,
> + struct tcf_chain **handle,
> + struct netlink_ext_ack *extack)
> +{
> + int opcode = TC_ACT_EXT_OPCODE(action), ret = -EINVAL;
> + u32 chain_index;
> +
> + if (!opcode)
> + ret = action > TC_ACT_VALUE_MAX ? -EINVAL : 0;
> + else if (opcode <= TC_ACT_EXT_OPCODE_MAX || action == TC_ACT_UNSPEC)
> + ret = 0;
> + if (ret) {
> + NL_SET_ERR_MSG(extack, "invalid control action");
> + goto end;
> + }
> +
> + if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN)) {
> + chain_index = action & TC_ACT_EXT_VAL_MASK;
> + if (!tp) {
> + ret = -EINVAL;
> + NL_SET_ERR_MSG(extack,
> + "can't use goto_chain with NULL proto");
> + goto end;
> + }
> + if (!handle) {
> + ret = -EINVAL;
> + NL_SET_ERR_MSG(extack,
> + "can't put goto_chain on NULL handle");
> + goto end;
> + }
> + *handle = tcf_chain_get_by_act(tp->chain->block, chain_index);
> + if (!*handle) {
> + ret = -ENOMEM;
> + NL_SET_ERR_MSG(extack,
> + "can't allocate goto_chain handle");
> + }
> + }
> +end:
> + return ret;
> +}
> +EXPORT_SYMBOL(tcf_action_check_ctrlact);
> +
> +void tcf_action_set_ctrlact(struct tc_action *p, int action,
> + struct tcf_chain *goto_chain)
> +{
> + struct tcf_chain *old;
> +
> + old = xchg(&p->goto_chain, goto_chain);
> + if (old)
> + tcf_chain_put_by_act(old);
This is blocking in current net-next because tcf_chain_put_by_act()
obtains block->lock mutex, so you can't call it while holding tcf_lock
spinlock like you do in following patches. Its not a big problem but I
guess you will have to just inline this code into all init handlers
instead of tcf_action_set_ctrlact() function.
BTW is atomic xchg strictly necessary if you hold tcf_lock while
re-assigning goto_chain pointer?
> + p->tcfa_action = action;
> +}
> +EXPORT_SYMBOL(tcf_action_set_ctrlact);
> +
> /* XXX: For standalone actions, we don't need a RCU grace period either, because
> * actions are always connected to filters and filters are already destroyed in
> * RCU callbacks, so after a RCU grace period actions are already disconnected
> @@ -890,10 +944,10 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
> /* backward compatibility for policer */
> if (name == NULL)
> err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, &a, ovr, bind,
> - rtnl_held, extack);
> + rtnl_held, tp, extack);
> else
> err = a_o->init(net, nla, est, &a, ovr, bind, rtnl_held,
> - extack);
> + tp, extack);
> if (err < 0)
> goto err_mod;
>
> diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c
> index c7633843e223..88a729bdab25 100644
> --- a/net/sched/act_bpf.c
> +++ b/net/sched/act_bpf.c
> @@ -278,7 +278,7 @@ static void tcf_bpf_prog_fill_cfg(const struct tcf_bpf *prog,
> static int tcf_bpf_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **act,
> int replace, int bind, bool rtnl_held,
> - struct netlink_ext_ack *extack)
> + struct tcf_proto *tp, struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, bpf_net_id);
> struct nlattr *tb[TCA_ACT_BPF_MAX + 1];
> diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c
> index 8475913f2070..30c4c109c80c 100644
> --- a/net/sched/act_connmark.c
> +++ b/net/sched/act_connmark.c
> @@ -97,6 +97,7 @@ static const struct nla_policy connmark_policy[TCA_CONNMARK_MAX + 1] = {
> static int tcf_connmark_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> + struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, connmark_net_id);
> diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c
> index 3dc25b7806d7..1ae120c9ab02 100644
> --- a/net/sched/act_csum.c
> +++ b/net/sched/act_csum.c
> @@ -46,7 +46,7 @@ static struct tc_action_ops act_csum_ops;
>
> static int tcf_csum_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a, int ovr,
> - int bind, bool rtnl_held,
> + int bind, bool rtnl_held, struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, csum_net_id);
> diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c
> index b61c20ebb314..727bbca9534b 100644
> --- a/net/sched/act_gact.c
> +++ b/net/sched/act_gact.c
> @@ -57,7 +57,7 @@ static const struct nla_policy gact_policy[TCA_GACT_MAX + 1] = {
> static int tcf_gact_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> - struct netlink_ext_ack *extack)
> + struct tcf_proto *tp, struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, gact_net_id);
> struct nlattr *tb[TCA_GACT_MAX + 1];
> diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c
> index 30b63fa23ee2..9b2eb941e093 100644
> --- a/net/sched/act_ife.c
> +++ b/net/sched/act_ife.c
> @@ -469,7 +469,7 @@ static int populate_metalist(struct tcf_ife_info *ife, struct nlattr **tb,
> static int tcf_ife_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> - struct netlink_ext_ack *extack)
> + struct tcf_proto *tp, struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, ife_net_id);
> struct nlattr *tb[TCA_IFE_MAX + 1];
> diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c
> index 8af6c11d2482..4b3c844ca988 100644
> --- a/net/sched/act_ipt.c
> +++ b/net/sched/act_ipt.c
> @@ -97,7 +97,8 @@ static const struct nla_policy ipt_policy[TCA_IPT_MAX + 1] = {
>
> static int __tcf_ipt_init(struct net *net, unsigned int id, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> - const struct tc_action_ops *ops, int ovr, int bind)
> + const struct tc_action_ops *ops, int ovr, int bind,
> + struct tcf_proto *tp)
> {
> struct tc_action_net *tn = net_generic(net, id);
> struct nlattr *tb[TCA_IPT_MAX + 1];
> @@ -206,20 +207,20 @@ static int __tcf_ipt_init(struct net *net, unsigned int id, struct nlattr *nla,
>
> static int tcf_ipt_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a, int ovr,
> - int bind, bool rtnl_held,
> + int bind, bool rtnl_held, struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> return __tcf_ipt_init(net, ipt_net_id, nla, est, a, &act_ipt_ops, ovr,
> - bind);
> + bind, tp);
> }
>
> static int tcf_xt_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a, int ovr,
> - int bind, bool unlocked,
> + int bind, bool unlocked, struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> return __tcf_ipt_init(net, xt_net_id, nla, est, a, &act_xt_ops, ovr,
> - bind);
> + bind, tp);
> }
>
> static int tcf_ipt_act(struct sk_buff *skb, const struct tc_action *a,
> diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
> index c8cf4d10c435..69dda57f1097 100644
> --- a/net/sched/act_mirred.c
> +++ b/net/sched/act_mirred.c
> @@ -94,6 +94,7 @@ static struct tc_action_ops act_mirred_ops;
> static int tcf_mirred_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> + struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, mirred_net_id);
> diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c
> index c5c1e23add77..526c4c99bcce 100644
> --- a/net/sched/act_nat.c
> +++ b/net/sched/act_nat.c
> @@ -38,7 +38,8 @@ static const struct nla_policy nat_policy[TCA_NAT_MAX + 1] = {
>
> static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,
> struct tc_action **a, int ovr, int bind,
> - bool rtnl_held, struct netlink_ext_ack *extack)
> + bool rtnl_held, struct tcf_proto *tp,
> + struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, nat_net_id);
> struct nlattr *tb[TCA_NAT_MAX + 1];
> diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c
> index 2b372a06b432..1c7a0db7b466 100644
> --- a/net/sched/act_pedit.c
> +++ b/net/sched/act_pedit.c
> @@ -138,7 +138,7 @@ static int tcf_pedit_key_ex_dump(struct sk_buff *skb,
> static int tcf_pedit_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> - struct netlink_ext_ack *extack)
> + struct tcf_proto *tp, struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, pedit_net_id);
> struct nlattr *tb[TCA_PEDIT_MAX + 1];
> diff --git a/net/sched/act_police.c b/net/sched/act_police.c
> index ec8ec55e0fe8..a444dd78a244 100644
> --- a/net/sched/act_police.c
> +++ b/net/sched/act_police.c
> @@ -83,6 +83,7 @@ static const struct nla_policy police_policy[TCA_POLICE_MAX + 1] = {
> static int tcf_police_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> + struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> int ret = 0, tcfp_result = TC_ACT_OK, err, size;
> diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c
> index 1a0c682fd734..b2154edcb535 100644
> --- a/net/sched/act_sample.c
> +++ b/net/sched/act_sample.c
> @@ -37,7 +37,7 @@ static const struct nla_policy sample_policy[TCA_SAMPLE_MAX + 1] = {
>
> static int tcf_sample_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a, int ovr,
> - int bind, bool rtnl_held,
> + int bind, bool rtnl_held, struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, sample_net_id);
> diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c
> index 902957beceb3..640ee5b785dc 100644
> --- a/net/sched/act_simple.c
> +++ b/net/sched/act_simple.c
> @@ -80,7 +80,7 @@ static const struct nla_policy simple_policy[TCA_DEF_MAX + 1] = {
> static int tcf_simp_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> - struct netlink_ext_ack *extack)
> + struct tcf_proto *tp, struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, simp_net_id);
> struct nlattr *tb[TCA_DEF_MAX + 1];
> diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c
> index 64dba3708fce..9fc8cfdd35b1 100644
> --- a/net/sched/act_skbedit.c
> +++ b/net/sched/act_skbedit.c
> @@ -96,6 +96,7 @@ static const struct nla_policy skbedit_policy[TCA_SKBEDIT_MAX + 1] = {
> static int tcf_skbedit_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> + struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, skbedit_net_id);
> diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c
> index 59710a183bd3..35572d0e4576 100644
> --- a/net/sched/act_skbmod.c
> +++ b/net/sched/act_skbmod.c
> @@ -82,6 +82,7 @@ static const struct nla_policy skbmod_policy[TCA_SKBMOD_MAX + 1] = {
> static int tcf_skbmod_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> + struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, skbmod_net_id);
> diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c
> index 8b43fe0130f7..c4adc53e0fb4 100644
> --- a/net/sched/act_tunnel_key.c
> +++ b/net/sched/act_tunnel_key.c
> @@ -209,6 +209,7 @@ static void tunnel_key_release_params(struct tcf_tunnel_key_params *p)
> static int tunnel_key_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> + struct tcf_proto *tp,
> struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, tunnel_key_net_id);
> diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c
> index 93fdaf707313..80fd0e238a10 100644
> --- a/net/sched/act_vlan.c
> +++ b/net/sched/act_vlan.c
> @@ -105,7 +105,7 @@ static const struct nla_policy vlan_policy[TCA_VLAN_MAX + 1] = {
> static int tcf_vlan_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, struct tc_action **a,
> int ovr, int bind, bool rtnl_held,
> - struct netlink_ext_ack *extack)
> + struct tcf_proto *tp, struct netlink_ext_ack *extack)
> {
> struct tc_action_net *tn = net_generic(net, vlan_net_id);
> struct nlattr *tb[TCA_VLAN_MAX + 1];
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox