OSDN Git Service

sfc: include vport_id in filter spec hash and equal()
authorPieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
Tue, 18 Oct 2022 09:28:41 +0000 (10:28 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 20 Oct 2022 00:08:43 +0000 (17:08 -0700)
Filters on different vports are qualified by different implicit MACs and/or
VLANs, so shouldn't be considered equal even if their other match fields
are identical.

Fixes: 7c460d9be610 ("sfc: Extend and abstract efx_filter_spec to cover Huntington/EF10")
Co-developed-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
Link: https://lore.kernel.org/r/20221018092841.32206-1-pieter.jansen-van-vuuren@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/sfc/filter.h
drivers/net/ethernet/sfc/rx_common.c

index be72e71..5f201a5 100644 (file)
@@ -162,9 +162,9 @@ struct efx_filter_spec {
        u32     priority:2;
        u32     flags:6;
        u32     dmaq_id:12;
-       u32     vport_id;
        u32     rss_context;
-       __be16  outer_vid __aligned(4); /* allow jhash2() of match values */
+       u32     vport_id;
+       __be16  outer_vid;
        __be16  inner_vid;
        u8      loc_mac[ETH_ALEN];
        u8      rem_mac[ETH_ALEN];
index 4826e6a..9220afe 100644 (file)
@@ -660,17 +660,17 @@ bool efx_filter_spec_equal(const struct efx_filter_spec *left,
             (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)))
                return false;
 
-       return memcmp(&left->outer_vid, &right->outer_vid,
+       return memcmp(&left->vport_id, &right->vport_id,
                      sizeof(struct efx_filter_spec) -
-                     offsetof(struct efx_filter_spec, outer_vid)) == 0;
+                     offsetof(struct efx_filter_spec, vport_id)) == 0;
 }
 
 u32 efx_filter_spec_hash(const struct efx_filter_spec *spec)
 {
-       BUILD_BUG_ON(offsetof(struct efx_filter_spec, outer_vid) & 3);
-       return jhash2((const u32 *)&spec->outer_vid,
+       BUILD_BUG_ON(offsetof(struct efx_filter_spec, vport_id) & 3);
+       return jhash2((const u32 *)&spec->vport_id,
                      (sizeof(struct efx_filter_spec) -
-                      offsetof(struct efx_filter_spec, outer_vid)) / 4,
+                      offsetof(struct efx_filter_spec, vport_id)) / 4,
                      0);
 }