lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <752c07fc-2417-1685-5950-8d8770b9f048@huawei.com> Date: Sat, 16 Apr 2022 11:33:58 +0800 From: "shenjian (K)" <shenjian15@...wei.com> To: Jakub Kicinski <kuba@...nel.org> CC: <davem@...emloft.net>, <andrew@...n.ch>, <ecree.xilinx@...il.com>, <hkallweit1@...il.com>, <alexandr.lobakin@...el.com>, <saeed@...nel.org>, <leon@...nel.org>, <netdev@...r.kernel.org>, <linuxarm@...neuler.org>, <lipeng321@...wei.com> Subject: Re: [RFCv5 PATCH net-next 02/20] net: introduce operation helpers for netdev features 在 2022/3/25 9:09, Jakub Kicinski 写道: > On Thu, 24 Mar 2022 23:49:14 +0800 Jian Shen wrote: >> Introduce a set of bitmap operation helpers for netdev features, >> then we can use them to replace the logical operation with them. >> As the nic driversare not supposed to modify netdev_features >> directly, it also introduces wrappers helpers to this. >> >> The implementation of these helpers are based on the old prototype >> of netdev_features_t is still u64. I will rewrite them on the last >> patch, when the prototype changes. >> >> Signed-off-by: Jian Shen <shenjian15@...wei.com> >> --- >> include/linux/netdevice.h | 597 ++++++++++++++++++++++++++++++++++++++ > Please move these helpers to a new header file which won't be included > by netdevice.h and include it at users appropriately. I introduced a new header file "netdev_features_helper", and moved thses helpers to it. Some helpers need to include struct net_device which defined in netdevice.h, but there are also some inline functions in netdevice.h need to use these netdev_features helpers. It's conflicted. So far I thought 3 ways to solved it, but all of them are not satisfactory. 1) Split netdevice.h, move the definition of struct net_device and its relative definitions to a new header file A( haven't got a reasonable name). Both the netdev_features_helper.h and the netdevice include A. 2) Split netdevice.h, move the inline functions to a new header file B. The netdev_features_helper.h inlucde netdevice.h, and B include netdev_features_helper.h and netdevice.h. All the source files which using these ininline functions should include B. 3) Split netdevice.h, move the inline functions to to netdev_featurer_helper.h. The netdev_features_helper.h inlucde netdevice.h, All the source files which using these ininline functions should include netde_features_helper.h. I'd like to get more advice to this. Thanks! >> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h >> index 7307b9553bcf..0af4b26896d6 100644 >> --- a/include/linux/netdevice.h >> +++ b/include/linux/netdevice.h >> @@ -2295,6 +2295,603 @@ struct net_device { >> }; >> #define to_net_dev(d) container_of(d, struct net_device, dev) >> >> +static inline void netdev_features_zero(netdev_features_t *dst) >> +{ >> + *dst = 0; >> +} >> + >> +static inline void netdev_features_fill(netdev_features_t *dst) >> +{ >> + *dst = ~0ULL; >> +} >> + >> +static inline bool netdev_features_empty(const netdev_features_t src) > Don't pass by value something larger than 64 bit. > >> +{ >> + return src == 0; >> +} >> + >> +/* helpers for netdev features '==' operation */ >> +static inline bool netdev_features_equal(const netdev_features_t src1, >> + const netdev_features_t src2) >> +{ >> + return src1 == src2; >> +} >> +/* helpers for netdev features '&=' operation */ >> +static inline void >> +netdev_features_direct_and(netdev_features_t *dst, >> + const netdev_features_t features) >> +{ >> + *dst = netdev_features_and(*dst, features); >> +} >> + >> +static inline void >> +netdev_active_features_direct_and(struct net_device *ndev, > s/direct_and/mask/ ? > >> + const netdev_features_t features) >> +{ >> + ndev->active_features = netdev_active_features_and(ndev, features); >> +} >> + >> +/* helpers for netdev features '|' operation */ >> +static inline netdev_features_t >> +netdev_features_or(const netdev_features_t a, const netdev_features_t b) >> +{ >> + return a | b; >> +} >> +/* helpers for netdev features '|=' operation */ >> +static inline void >> +netdev_features_direct_or(netdev_features_t *dst, > s/direct_or/set/ ? > >> + const netdev_features_t features) >> +{ >> + *dst = netdev_features_or(*dst, features); >> +} >> +/* helpers for netdev features '^' operation */ >> +static inline netdev_features_t >> +netdev_features_xor(const netdev_features_t a, const netdev_features_t b) >> +{ >> + return a ^ b; >> +} >> +/* helpers for netdev features '^=' operation */ >> +static inline void >> +netdev_active_features_direct_xor(struct net_device *ndev, > s/direct_xor/toggle/ ? > >> +/* helpers for netdev features '& ~' operation */ >> +static inline netdev_features_t >> +netdev_features_andnot(const netdev_features_t a, const netdev_features_t b) >> +{ >> + return a & ~b; >> +} >> +static inline void >> +netdev_features_direct_andnot(netdev_features_t *dst, > s/andnot/clear/ ? > >> + const netdev_features_t features) >> +{ >> + *dst = netdev_features_andnot(*dst, features); >> +} >> +/* helpers for netdev features 'set bit' operation */ >> +static inline void netdev_features_set_bit(int nr, netdev_features_t *src) > s/features_set_bit/feature_add/ ? > >> +{ >> + *src |= __NETIF_F_BIT(nr); >> +} >> +/* helpers for netdev features 'set bit array' operation */ >> +static inline void netdev_features_set_array(const int *array, int array_size, >> + netdev_features_t *dst) >> +{ >> + int i; >> + >> + for (i = 0; i < array_size; i++) >> + netdev_features_set_bit(array[i], dst); >> +} >> + >> +#define netdev_active_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->active_features) >> + >> +#define netdev_hw_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->hw_features) >> + >> +#define netdev_wanted_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->wanted_features) >> + >> +#define netdev_vlan_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->vlan_features) >> + >> +#define netdev_hw_enc_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->hw_enc_features) >> + >> +#define netdev_mpls_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->mpls_features) >> + >> +#define netdev_gso_partial_features_set_array(ndev, array, array_size) \ >> + netdev_features_set_array(array, array_size, &ndev->gso_partial_features) >> + >> +/* helpers for netdev features 'clear bit' operation */ >> +static inline void netdev_features_clear_bit(int nr, netdev_features_t *src) > All the mentions of '_bit' are unnecessary IMHO. > . >
Powered by blists - more mailing lists