From: "shenjian (K)" <shenjian15@huawei.com>
To: Alexander Lobakin <alexandr.lobakin@intel.com>
Cc: <davem@davemloft.net>, <kuba@kernel.org>, <andrew@lunn.ch>,
<ecree.xilinx@gmail.com>, <hkallweit1@gmail.com>,
<saeed@kernel.org>, <leon@kernel.org>, <netdev@vger.kernel.org>,
<linuxarm@openeuler.org>
Subject: Re: [RFCv7 PATCH net-next 01/36] net: introduce operation helpers for netdev features
Date: Wed, 10 Aug 2022 19:32:28 +0800 [thread overview]
Message-ID: <444c4f87-ed36-721a-f619-97c7725e2c87@huawei.com> (raw)
In-Reply-To: <20220810094358.1303843-1-alexandr.lobakin@intel.com>
在 2022/8/10 17:43, Alexander Lobakin 写道:
> From: Jian Shen <shenjian15@huawei.com>
> Date: Wed, 10 Aug 2022 11:05:49 +0800
>
>> Introduce a set of bitmap operation helpers for netdev features,
>> then we can use them to replace the logical operation with them.
>>
>> The implementation of these helpers are based on the old prototype
>> of netdev_features_t is still u64. These helpers will be rewritten
>> on the last patch, when the prototype changes.
>>
>> To avoid interdependencies between netdev_features_helper.h and
>> netdevice.h, put the helpers for testing feature in the netdevice.h,
>> and move advandced helpers like netdev_get_wanted_features() and
>> netdev_intersect_features() to netdev_features_helper.h.
>>
>> Signed-off-by: Jian Shen <shenjian15@huawei.com>
>> ---
>> include/linux/netdev_features.h | 11 +
>> include/linux/netdev_features_helper.h | 707 +++++++++++++++++++++++++
> 'netdev_feature_helpers.h' fits more I guess, doesn't it? It
> contains several helpers, not only one.
ok, will rename it.
> And BTW, do you think it's worth to create a new file rather than
> put everything just in netdev_features.h?
Jakub suggested me to move them to a new file, then it can be includued
at users appropriately.
[https://www.spinics.net/lists/netdev/msg809370.html]
And it's unable to put everything in netdev_features.h, because these
helpers
need to see the definition of struct net_device which is defined in
netdevice.h.
It leading interdependence for netdeice.h include netdev_features.h.
>> include/linux/netdevice.h | 45 +-
>> net/8021q/vlan_dev.c | 1 +
>> net/core/dev.c | 1 +
>> 5 files changed, 747 insertions(+), 18 deletions(-)
>> create mode 100644 include/linux/netdev_features_helper.h
>>
>> diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
>> index 7c2d77d75a88..9d434b4e6e6e 100644
>> --- a/include/linux/netdev_features.h
>> +++ b/include/linux/netdev_features.h
>> @@ -11,6 +11,17 @@
>>
>> typedef u64 netdev_features_t;
>>
>> +struct netdev_feature_set {
>> + unsigned int cnt;
>> + unsigned short feature_bits[];
>> +};
>> +
>> +#define DECLARE_NETDEV_FEATURE_SET(name, features...) \
>> + const struct netdev_feature_set name = { \
>> + .cnt = sizeof((unsigned short[]){ features }) / sizeof(unsigned short), \
>> + .feature_bits = { features }, \
>> + }
>> +
>> enum {
>> NETIF_F_SG_BIT, /* Scatter/gather IO. */
>> NETIF_F_IP_CSUM_BIT, /* Can checksum TCP/UDP over IPv4. */
>> diff --git a/include/linux/netdev_features_helper.h b/include/linux/netdev_features_helper.h
>> new file mode 100644
>> index 000000000000..5423927d139b
>> --- /dev/null
>> +++ b/include/linux/netdev_features_helper.h
>> @@ -0,0 +1,707 @@
>> +/* SPDX-License-Identifier: GPL-2.0-or-later */
>> +/*
>> + * Network device features helpers.
>> + */
>> +#ifndef _LINUX_NETDEV_FEATURES_HELPER_H
>> +#define _LINUX_NETDEV_FEATURES_HELPER_H
>> +
>> +#include <linux/netdevice.h>
>> +
>> +static inline void netdev_features_zero(netdev_features_t *dst)
>> +{
>> + *dst = 0;
>> +}
>> +
>> +/* active_feature prefer to netdev->features */
>> +#define netdev_active_features_zero(ndev) \
>> + netdev_features_zero(&ndev->features)
> netdev_features_t sometimes is being placed and used on the stack.
> I think it's better to pass just `netdev_features_t *` to those
> helpers, this way you wouldn't also need to create a new helper
> for each net_device::*_features.
My purpose of defining helpers for each net_device::*_features is to
avoiding driver to change net_device::*_features directly.
>> +
>> +#define netdev_hw_features_zero(ndev) \
>> + netdev_features_zero(&ndev->hw_features)
>> +
>> +#define netdev_wanted_features_zero(ndev) \
> [...]
>
>> +#define netdev_gso_partial_features_and(ndev, __features) \
>> + netdev_features_and(ndev->gso_partial_features, __features)
>> +
>> +/* helpers for netdev features '&=' operation */
>> +static inline void
>> +netdev_features_mask(netdev_features_t *dst,
>> + const netdev_features_t features)
>> +{
>> + *dst = netdev_features_and(*dst, features);
> A small proposal: if you look at bitmap_and() for example, it
> returns 1 if the resulting bitmap is non-empty and 0 if it is. What
> about doing the same here? It would probably help to do reduce
> boilerplating in the drivers where we only want to know if there's
> anything left after masking.
> Same for xor, toggle etc.
Thanks for point this. Return whether empty, then I can remove
netdev_features_intersects
helpers. But there are also many places to use 'f1 & f2' as return value
or input param, then
I need to define more temporay features to store the result, and then
return the temporay
features or pass into it.
>> +}
>> +
>> +static inline void
>> +netdev_active_features_mask(struct net_device *ndev,
>> + const netdev_features_t features)
>> +{
>> + ndev->features = netdev_active_features_and(ndev, features);
>> +}
> [...]
>
>> +/* helpers for netdev features 'set bit array' operation */
>> +static inline void
>> +netdev_features_set_array(const struct netdev_feature_set *set,
>> + netdev_features_t *dst)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < set->cnt; i++)
> Nit: kernel is C11 now, you can do just `for (u32 i = 0; i ...`.
> (and yeah, it's better to use unsigned types when you don't plan
> to store negative values there).
ok, will fix it.
>> + netdev_feature_add(set->feature_bits[i], dst);
>> +}
> [...]
>
>> --
>> 2.33.0
> Thanks,
> Olek
>
> .
>
next prev parent reply other threads:[~2022-08-10 11:33 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-10 3:05 [RFCv7 PATCH net-next 00/36] net: extend the type of netdev_features_t to bitmap Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 01/36] net: introduce operation helpers for netdev features Jian Shen
2022-08-10 9:43 ` Alexander Lobakin
2022-08-10 11:32 ` shenjian (K) [this message]
2022-08-11 10:49 ` Alexander Lobakin
2022-08-12 2:39 ` shenjian (K)
2022-08-10 3:05 ` [RFCv7 PATCH net-next 02/36] net: replace general features macroes with global netdev_features variables Jian Shen
2022-08-10 9:58 ` Alexander Lobakin
2022-08-10 12:01 ` shenjian (K)
2022-08-11 11:05 ` Alexander Lobakin
2022-08-12 10:58 ` shenjian (K)
2022-08-10 3:05 ` [RFCv7 PATCH net-next 03/36] net: replace multiple feature bits with DECLARE_NETDEV_FEATURE_SET Jian Shen
2022-08-10 10:37 ` Alexander Lobakin
2022-08-10 12:15 ` shenjian (K)
2022-08-10 3:05 ` [RFCv7 PATCH net-next 04/36] net: sfc: replace const features initialization " Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 05/36] net: atlantic: replace const features initialization with NETDEV_FEATURE_SET Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 06/36] iwlwifi: " Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 07/36] net: ethernet: mtk_eth_soc: " Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 08/36] ravb: " Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 09/36] test_bpf: " Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 10/36] treewide: replace NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK by netdev_csum_gso_features_mask Jian Shen
2022-08-10 3:05 ` [RFCv7 PATCH net-next 11/36] treewide: replace NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM by netdev_ip_csum_features Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 12/36] treewide: replace NETIF_F_TSO | NETIF_F_TSO6 by netdev_general_tso_features Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 13/36] treewide: replace VLAN tag feature array by const vlan features Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 14/36] net: simplify the netdev features expressions for xxx_gso_segment Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 15/36] treewide: simplify the netdev features expression Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 16/36] treewide: use replace features '0' by netdev_empty_features Jian Shen
2022-08-10 10:48 ` Alexander Lobakin
2022-08-10 12:25 ` shenjian (K)
2022-08-11 12:35 ` Alexander Lobakin
2022-08-10 3:06 ` [RFCv7 PATCH net-next 17/36] treewide: adjust features initialization Jian Shen
2022-08-10 10:58 ` Alexander Lobakin
2022-08-10 14:06 ` shenjian (K)
2022-08-10 3:06 ` [RFCv7 PATCH net-next 18/36] net: mlx4: adjust the net device feature relative macroes Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 19/36] net: mlx5e: adjust " Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 20/36] net: mlxsw: adjust input parameter for function mlxsw_sp_handle_feature Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 21/36] net: iavf: adjust net device features relative macroes Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 22/36] net: core: adjust netdev_sync_xxx_features Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 23/36] net: adjust the build check for net_gso_ok() Jian Shen
2022-08-10 11:09 ` Alexander Lobakin
2022-08-10 14:41 ` shenjian (K)
2022-08-10 3:06 ` [RFCv7 PATCH net-next 24/36] treewide: use netdev_feature_add helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 25/36] treewide: use netdev_features_or/set helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 26/36] treewide: use netdev_feature_change helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 27/36] treewide: use netdev_feature_del helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 28/36] treewide: use netdev_features_andnot and netdev_features_clear helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 29/36] treewide: use netdev_features_xor helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 30/36] treewide: use netdev_feature_test helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 31/36] treewide: use netdev_features_intersects helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 32/36] net: use netdev_features_and and netdev_features_mask helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 33/36] treewide: use netdev_features_subset helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 34/36] treewide: use netdev_features_equal helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 35/36] treewide: use netdev_features_empty helpers Jian Shen
2022-08-10 3:06 ` [RFCv7 PATCH net-next 36/36] net: redefine the prototype of netdev_features_t Jian Shen
2022-08-10 11:35 ` Alexander Lobakin
[not found] ` <3df89822-7dec-c01e-0df9-15b8e6f7d4e5@huawei.com>
2022-08-11 13:07 ` Alexander Lobakin
2022-08-11 15:13 ` Jakub Kicinski
2022-08-12 11:43 ` shenjian (K)
2022-08-12 11:30 ` shenjian (K)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=444c4f87-ed36-721a-f619-97c7725e2c87@huawei.com \
--to=shenjian15@huawei.com \
--cc=alexandr.lobakin@intel.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=ecree.xilinx@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linuxarm@openeuler.org \
--cc=netdev@vger.kernel.org \
--cc=saeed@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).