* [PATCH net-next v3] route: Add multipath_hash in flowi_common to make user-define hash
@ 2019-02-23 14:53 wenxu
2019-02-24 2:57 ` kbuild test robot
0 siblings, 1 reply; 2+ messages in thread
From: wenxu @ 2019-02-23 14:53 UTC (permalink / raw)
To: nikolay, davem; +Cc: netdev
From: wenxu <wenxu@ucloud.cn>
Current fib_multipath_hash_policy can make hash based on the L3 or
L4. But it only work on the outer IP. So a specific tunnel always
has the same hash value. But a specific tunnel may contain so many
inner connections.
This patch provide a generic multipath_hash in floi_common. It can
make a user-define hash which can mix with L3 or L4 hash.
Signed-off-by: wenxu <wenxu@ucloud.cn>
---
drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c | 2 +-
include/net/flow.h | 2 ++
include/net/ip_tunnels.h | 3 ++-
net/ipv4/ip_gre.c | 2 +-
net/ipv4/ip_tunnel.c | 6 +++---
net/ipv4/route.c | 4 ++++
6 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
index ad5a9b9..536c23c 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
@@ -305,7 +305,7 @@ static int mlxsw_sp_span_dmac(struct neigh_table *tbl,
parms = mlxsw_sp_ipip_netdev_parms4(to_dev);
ip_tunnel_init_flow(&fl4, parms.iph.protocol, *daddrp, *saddrp,
- 0, 0, parms.link, tun->fwmark);
+ 0, 0, parms.link, tun->fwmark, 0);
rt = ip_route_output_key(tun->net, &fl4);
if (IS_ERR(rt))
diff --git a/include/net/flow.h b/include/net/flow.h
index 93f2c9a..4da503a 100644
--- a/include/net/flow.h
+++ b/include/net/flow.h
@@ -40,6 +40,7 @@ struct flowi_common {
__u32 flowic_secid;
kuid_t flowic_uid;
struct flowi_tunnel flowic_tun_key;
+ __be32 flowic_multipath_hash;
};
union flowi_uli {
@@ -78,6 +79,7 @@ struct flowi4 {
#define flowi4_secid __fl_common.flowic_secid
#define flowi4_tun_key __fl_common.flowic_tun_key
#define flowi4_uid __fl_common.flowic_uid
+#define flowi4_multipath_hash __fl_common.flowic_multipath_hash
/* (saddr,daddr) must be grouped, same order as in IP header */
__be32 saddr;
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index f069f64..af64560 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -241,7 +241,7 @@ static inline void ip_tunnel_init_flow(struct flowi4 *fl4,
int proto,
__be32 daddr, __be32 saddr,
__be32 key, __u8 tos, int oif,
- __u32 mark)
+ __u32 mark, __u32 tun_inner_hash)
{
memset(fl4, 0, sizeof(*fl4));
fl4->flowi4_oif = oif;
@@ -251,6 +251,7 @@ static inline void ip_tunnel_init_flow(struct flowi4 *fl4,
fl4->flowi4_proto = proto;
fl4->fl4_gre_key = key;
fl4->flowi4_mark = mark;
+ fl4->flowi4_multipath_hash = tun_inner_hash;
}
int ip_tunnel_init(struct net_device *dev);
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index ccee941..88ad95e 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -578,7 +578,7 @@ static int gre_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
key = &info->key;
ip_tunnel_init_flow(&fl4, IPPROTO_GRE, key->u.ipv4.dst, key->u.ipv4.src,
tunnel_id_to_key32(key->tun_id), key->tos, 0,
- skb->mark);
+ skb->mark, skb_get_hash(skb));
rt = ip_route_output_key(dev_net(dev), &fl4);
if (IS_ERR(rt))
return PTR_ERR(rt);
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index 893f013..3a03114 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -310,7 +310,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
ip_tunnel_init_flow(&fl4, iph->protocol, iph->daddr,
iph->saddr, tunnel->parms.o_key,
RT_TOS(iph->tos), tunnel->parms.link,
- tunnel->fwmark);
+ tunnel->fwmark, 0);
rt = ip_route_output_key(tunnel->net, &fl4);
if (!IS_ERR(rt)) {
@@ -584,7 +584,7 @@ void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
}
ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src,
tunnel_id_to_key32(key->tun_id), RT_TOS(tos),
- 0, skb->mark);
+ 0, skb->mark, skb_get_hash(skb));
if (tunnel->encap.type != TUNNEL_ENCAP_NONE)
goto tx_error;
@@ -738,7 +738,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr,
tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
- tunnel->fwmark);
+ tunnel->fwmark, skb_get_hash(skb));
if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
goto tx_error;
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index ecc12a7..6b9a8b7 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1820,6 +1820,7 @@ static void ip_multipath_l3_keys(const struct sk_buff *skb,
int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
const struct sk_buff *skb, struct flow_keys *flkeys)
{
+ u32 multipath_hash = fl4->flowi4_multipath_hash;
struct flow_keys hash_keys;
u32 mhash;
@@ -1869,6 +1870,9 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
break;
}
mhash = flow_hash_from_keys(&hash_keys);
+
+ if (multipath_hash)
+ mhash = jhash_2words(mhash, multipath_hash, 0);
return mhash >> 1;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH net-next v3] route: Add multipath_hash in flowi_common to make user-define hash
2019-02-23 14:53 [PATCH net-next v3] route: Add multipath_hash in flowi_common to make user-define hash wenxu
@ 2019-02-24 2:57 ` kbuild test robot
0 siblings, 0 replies; 2+ messages in thread
From: kbuild test robot @ 2019-02-24 2:57 UTC (permalink / raw)
To: wenxu; +Cc: kbuild-all, nikolay, davem, netdev
[-- Attachment #1: Type: text/plain, Size: 7008 bytes --]
Hi wenxu,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on net-next/master]
url: https://github.com/0day-ci/linux/commits/wenxu-ucloud-cn/route-Add-multipath_hash-in-flowi_common-to-make-user-define-hash/20190224-075532
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'
All warnings (new ones prefixed by >>):
net/ipv4/route.c:771:46: sparse: warning: incorrect type in argument 2 (different base types)
net/ipv4/route.c:771:46: sparse: expected unsigned int [usertype] key
net/ipv4/route.c:771:46: sparse: got restricted __be32 [usertype] new_gw
>> net/ipv4/route.c:1823:35: sparse: warning: incorrect type in initializer (different base types)
net/ipv4/route.c:1823:35: sparse: expected unsigned int [usertype] multipath_hash
net/ipv4/route.c:1823:35: sparse: got restricted __be32 const [usertype] flowic_multipath_hash
net/ipv4/route.c:2746:27: sparse: warning: incorrect type in assignment (different base types)
net/ipv4/route.c:2746:27: sparse: expected restricted __be16 [usertype] len
net/ipv4/route.c:2746:27: sparse: got unsigned long
--
>> include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
>> include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
>> include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
--
>> include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
sparse warnings: (new ones prefixed by >>)
net/ipv4/route.c:771:46: sparse: warning: incorrect type in argument 2 (different base types)
net/ipv4/route.c:771:46: sparse: expected unsigned int [usertype] key
net/ipv4/route.c:771:46: sparse: got restricted __be32 [usertype] new_gw
net/ipv4/route.c:1823:35: sparse: warning: incorrect type in initializer (different base types)
>> net/ipv4/route.c:1823:35: sparse: expected unsigned int [usertype] multipath_hash
>> net/ipv4/route.c:1823:35: sparse: got restricted __be32 const [usertype] flowic_multipath_hash
net/ipv4/route.c:2746:27: sparse: warning: incorrect type in assignment (different base types)
net/ipv4/route.c:2746:27: sparse: expected restricted __be16 [usertype] len
net/ipv4/route.c:2746:27: sparse: got unsigned long
--
include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
>> include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
>> include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
>> include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
>> include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
>> include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
>> include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
--
include/net/ip_tunnels.h:254:36: sparse: warning: incorrect type in assignment (different base types)
>> include/net/ip_tunnels.h:254:36: sparse: expected restricted __be32 [usertype] flowic_multipath_hash
>> include/net/ip_tunnels.h:254:36: sparse: got unsigned int [usertype] tun_inner_hash
vim +1823 net/ipv4/route.c
1818
1819 /* if skb is set it will be used and fl4 can be NULL */
1820 int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
1821 const struct sk_buff *skb, struct flow_keys *flkeys)
1822 {
> 1823 u32 multipath_hash = fl4->flowi4_multipath_hash;
1824 struct flow_keys hash_keys;
1825 u32 mhash;
1826
1827 switch (net->ipv4.sysctl_fib_multipath_hash_policy) {
1828 case 0:
1829 memset(&hash_keys, 0, sizeof(hash_keys));
1830 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
1831 if (skb) {
1832 ip_multipath_l3_keys(skb, &hash_keys);
1833 } else {
1834 hash_keys.addrs.v4addrs.src = fl4->saddr;
1835 hash_keys.addrs.v4addrs.dst = fl4->daddr;
1836 }
1837 break;
1838 case 1:
1839 /* skb is currently provided only when forwarding */
1840 if (skb) {
1841 unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
1842 struct flow_keys keys;
1843
1844 /* short-circuit if we already have L4 hash present */
1845 if (skb->l4_hash)
1846 return skb_get_hash_raw(skb) >> 1;
1847
1848 memset(&hash_keys, 0, sizeof(hash_keys));
1849
1850 if (!flkeys) {
1851 skb_flow_dissect_flow_keys(skb, &keys, flag);
1852 flkeys = &keys;
1853 }
1854
1855 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
1856 hash_keys.addrs.v4addrs.src = flkeys->addrs.v4addrs.src;
1857 hash_keys.addrs.v4addrs.dst = flkeys->addrs.v4addrs.dst;
1858 hash_keys.ports.src = flkeys->ports.src;
1859 hash_keys.ports.dst = flkeys->ports.dst;
1860 hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
1861 } else {
1862 memset(&hash_keys, 0, sizeof(hash_keys));
1863 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
1864 hash_keys.addrs.v4addrs.src = fl4->saddr;
1865 hash_keys.addrs.v4addrs.dst = fl4->daddr;
1866 hash_keys.ports.src = fl4->fl4_sport;
1867 hash_keys.ports.dst = fl4->fl4_dport;
1868 hash_keys.basic.ip_proto = fl4->flowi4_proto;
1869 }
1870 break;
1871 }
1872 mhash = flow_hash_from_keys(&hash_keys);
1873
1874 if (multipath_hash)
1875 mhash = jhash_2words(mhash, multipath_hash, 0);
1876
1877 return mhash >> 1;
1878 }
1879 #endif /* CONFIG_IP_ROUTE_MULTIPATH */
1880
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 67279 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-02-24 2:57 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-02-23 14:53 [PATCH net-next v3] route: Add multipath_hash in flowi_common to make user-define hash wenxu
2019-02-24 2:57 ` kbuild test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox