public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Vladimir Oltean <vladimir.oltean@nxp.com>,
	Jakub Kicinski <kuba@kernel.org>, Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.15 009/102] net: mscc: ocelot: avoid corrupting hardware counters when moving VCAP filters
Date: Mon, 16 May 2022 21:35:43 +0200	[thread overview]
Message-ID: <20220516193624.262148362@linuxfoundation.org> (raw)
In-Reply-To: <20220516193623.989270214@linuxfoundation.org>

From: Vladimir Oltean <vladimir.oltean@nxp.com>

[ Upstream commit 93a8417088ea570b5721d2b526337a2d3aed9fa3 ]

Given the following order of operations:

(1) we add filter A using tc-flower
(2) we send a packet that matches it
(3) we read the filter's statistics to find a hit count of 1
(4) we add a second filter B with a higher preference than A, and A
    moves one position to the right to make room in the TCAM for it
(5) we send another packet, and this matches the second filter B
(6) we read the filter statistics again.

When this happens, the hit count of filter A is 2 and of filter B is 1,
despite a single packet having matched each filter.

Furthermore, in an alternate history, reading the filter stats a second
time between steps (3) and (4) makes the hit count of filter A remain at
1 after step (6), as expected.

The reason why this happens has to do with the filter->stats.pkts field,
which is written to hardware through the call path below:

               vcap_entry_set
               /      |      \
              /       |       \
             /        |        \
            /         |         \
es0_entry_set   is1_entry_set   is2_entry_set
            \         |         /
             \        |        /
              \       |       /
        vcap_data_set(data.counter, ...)

The primary role of filter->stats.pkts is to transport the filter hit
counters from the last readout all the way from vcap_entry_get() ->
ocelot_vcap_filter_stats_update() -> ocelot_cls_flower_stats().
The reason why vcap_entry_set() writes it to hardware is so that the
counters (saturating and having a limited bit width) are cleared
after each user space readout.

The writing of filter->stats.pkts to hardware during the TCAM entry
movement procedure is an unintentional consequence of the code design,
because the hit count isn't up to date at this point.

So at step (4), when filter A is moved by ocelot_vcap_filter_add() to
make room for filter B, the hardware hit count is 0 (no packet matched
on it in the meantime), but filter->stats.pkts is 1, because the last
readout saw the earlier packet. The movement procedure programs the old
hit count back to hardware, so this creates the impression to user space
that more packets have been matched than they really were.

The bug can be seen when running the gact_drop_and_ok_test() from the
tc_actions.sh selftest.

Fix the issue by reading back the hit count to tmp->stats.pkts before
migrating the VCAP filter. Sure, this is a best-effort technique, since
the packets that hit the rule between vcap_entry_get() and
vcap_entry_set() won't be counted, but at least it allows the counters
to be reliably used for selftests where the traffic is under control.

The vcap_entry_get() name is a bit unintuitive, but it only reads back
the counter portion of the TCAM entry, not the entire entry.

The index from which we retrieve the counter is also a bit unintuitive
(i - 1 during add, i + 1 during del), but this is the way in which TCAM
entry movement works. The "entry index" isn't a stored integer for a
TCAM filter, instead it is dynamically computed by
ocelot_vcap_block_get_filter_index() based on the entry's position in
the &block->rules list. That position (as well as block->count) is
automatically updated by ocelot_vcap_filter_add_to_block() on add, and
by ocelot_vcap_block_remove_filter() on del. So "i" is the new filter
index, and "i - 1" or "i + 1" respectively are the old addresses of that
TCAM entry (we only support installing/deleting one filter at a time).

Fixes: b596229448dd ("net: mscc: ocelot: Add support for tcam")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/net/ethernet/mscc/ocelot_vcap.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/ethernet/mscc/ocelot_vcap.c b/drivers/net/ethernet/mscc/ocelot_vcap.c
index c01cbc4f7a1a..732a4ef22518 100644
--- a/drivers/net/ethernet/mscc/ocelot_vcap.c
+++ b/drivers/net/ethernet/mscc/ocelot_vcap.c
@@ -1152,6 +1152,8 @@ int ocelot_vcap_filter_add(struct ocelot *ocelot,
 		struct ocelot_vcap_filter *tmp;
 
 		tmp = ocelot_vcap_block_find_filter_by_index(block, i);
+		/* Read back the filter's counters before moving it */
+		vcap_entry_get(ocelot, i - 1, tmp);
 		vcap_entry_set(ocelot, i, tmp);
 	}
 
@@ -1210,6 +1212,8 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot,
 		struct ocelot_vcap_filter *tmp;
 
 		tmp = ocelot_vcap_block_find_filter_by_index(block, i);
+		/* Read back the filter's counters before moving it */
+		vcap_entry_get(ocelot, i + 1, tmp);
 		vcap_entry_set(ocelot, i, tmp);
 	}
 
-- 
2.35.1




  parent reply	other threads:[~2022-05-16 20:02 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-16 19:35 [PATCH 5.15 000/102] 5.15.41-rc1 review Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 001/102] batman-adv: Dont skb_split skbuffs with frag_list Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 002/102] iwlwifi: iwl-dbg: Use del_timer_sync() before freeing Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 003/102] hwmon: (tmp401) Add OF device ID table Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 004/102] mac80211: Reset MBSSID parameters upon connection Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 005/102] net: Fix features skip in for_each_netdev_feature() Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 006/102] net: mscc: ocelot: fix last VCAP IS1/IS2 filter persisting in hardware when deleted Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 007/102] net: mscc: ocelot: fix VCAP IS2 filters matching on both lookups Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 008/102] net: mscc: ocelot: restrict tc-trap actions to VCAP IS2 lookup 0 Greg Kroah-Hartman
2022-05-16 19:35 ` Greg Kroah-Hartman [this message]
2022-05-16 19:35 ` [PATCH 5.15 010/102] fbdev: simplefb: Cleanup fb_info in .fb_destroy rather than .remove Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 011/102] fbdev: efifb: " Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 012/102] fbdev: vesafb: " Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 013/102] platform/surface: aggregator: Fix initialization order when compiling as builtin module Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 014/102] ice: Fix race during aux device (un)plugging Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 015/102] ice: fix PTP stale Tx timestamps cleanup Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 016/102] ipv4: drop dst in multicast routing path Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 017/102] drm/nouveau: Fix a potential theorical leak in nouveau_get_backlight_name() Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 018/102] netlink: do not reset transport header in netlink_recvmsg() Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 019/102] net: chelsio: cxgb4: Avoid potential negative array offset Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 020/102] fbdev: efifb: Fix a use-after-free due early fb_info cleanup Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 021/102] sfc: Use swap() instead of open coding it Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 022/102] net: sfc: fix memory leak due to ptp channel Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 023/102] mac80211_hwsim: call ieee80211_tx_prepare_skb under RCU protection Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 024/102] nfs: fix broken handling of the softreval mount option Greg Kroah-Hartman
2022-05-16 19:35 ` [PATCH 5.15 025/102] ionic: fix missing pci_release_regions() on error in ionic_probe() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 026/102] dim: initialize all struct fields Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 027/102] hwmon: (ltq-cputemp) restrict it to SOC_XWAY Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 028/102] procfs: prevent unprivileged processes accessing fdinfo dir Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 029/102] selftests: vm: Makefile: rename TARGETS to VMTARGETS Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 030/102] arm64: vdso: fix makefile dependency on vdso.so Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 031/102] virtio: fix virtio transitional ids Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 032/102] s390/ctcm: fix variable dereferenced before check Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 033/102] s390/ctcm: fix potential memory leak Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 034/102] s390/lcs: fix variable dereferenced before check Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 035/102] net/sched: act_pedit: really ensure the skb is writable Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 036/102] net: ethernet: mediatek: ppe: fix wrong size passed to memset() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 037/102] net: bcmgenet: Check for Wake-on-LAN interrupt probe deferral Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 038/102] drm/vc4: hdmi: Fix build error for implicit function declaration Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 039/102] net: dsa: bcm_sf2: Fix Wake-on-LAN with mac_link_down() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 040/102] net/smc: non blocking recvmsg() return -EAGAIN when no data and signal_pending Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 041/102] net: sfc: ef10: fix memory leak in efx_ef10_mtd_probe() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 042/102] tls: Fix context leak on tls_device_down Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 043/102] drm/vmwgfx: Fix fencing on SVGAv3 Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 044/102] gfs2: Fix filesystem block deallocation for short writes Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 045/102] hwmon: (f71882fg) Fix negative temperature Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 046/102] RDMA/irdma: Fix deadlock in irdma_cleanup_cm_core() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 047/102] iommu: arm-smmu: disable large page mappings for Nvidia arm-smmu Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 048/102] ASoC: max98090: Reject invalid values in custom control put() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 049/102] ASoC: max98090: Generate notifications on changes for custom control Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 050/102] ASoC: ops: Validate input values in snd_soc_put_volsw_range() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 051/102] s390: disable -Warray-bounds Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 052/102] ASoC: SOF: Fix NULL pointer exception in sof_pci_probe callback Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 053/102] net: emaclite: Dont advertise 1000BASE-T and do auto negotiation Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 054/102] net: sfp: Add tx-fault workaround for Huawei MA5671A SFP ONT Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 055/102] secure_seq: use the 64 bits of the siphash for port offset calculation Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 056/102] tcp: use different parts of the port_offset for index and offset Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 057/102] tcp: resalt the secret every 10 seconds Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 058/102] tcp: add small random increments to the source port Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 059/102] tcp: dynamically allocate the perturb table used by source ports Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 060/102] tcp: increase source port perturb table to 2^16 Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 061/102] tcp: drop the hash_32() part from the index calculation Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 062/102] interconnect: Restore sync state by ignoring ipa-virt in provider count Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 063/102] firmware_loader: use kernel credentials when reading firmware Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 064/102] KVM: PPC: Book3S PR: Enable MSR_DR for switch_mmu_context() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 065/102] usb: xhci-mtk: fix fs isocs transfer error Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 066/102] x86/mm: Fix marking of unused sub-pmd ranges Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 067/102] tty/serial: digicolor: fix possible null-ptr-deref in digicolor_uart_probe() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 068/102] tty: n_gsm: fix buffer over-read in gsm_dlci_data() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 069/102] tty: n_gsm: fix mux activation issues in gsm_config() Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 070/102] usb: cdc-wdm: fix reading stuck on device close Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 071/102] usb: typec: tcpci: Dont skip cleanup in .remove() on error Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 072/102] usb: typec: tcpci_mt6360: Update for BMC PHY setting Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 073/102] USB: serial: pl2303: add device id for HP LM930 Display Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 074/102] USB: serial: qcserial: add support for Sierra Wireless EM7590 Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 075/102] USB: serial: option: add Fibocom L610 modem Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 076/102] USB: serial: option: add Fibocom MA510 modem Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 077/102] slimbus: qcom: Fix IRQ check in qcom_slim_probe Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 078/102] fsl_lpuart: Dont enable interrupts too early Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 079/102] serial: 8250_mtk: Fix UART_EFR register address Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 080/102] serial: 8250_mtk: Fix register address for XON/XOFF character Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 081/102] ceph: fix setting of xattrs on async created inodes Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 082/102] Revert "mm/memory-failure.c: skip huge_zero_page in memory_failure()" Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 083/102] mm/huge_memory: do not overkill when splitting huge_zero_page Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 084/102] drm/vmwgfx: Disable command buffers on svga3 without gbobjects Greg Kroah-Hartman
2022-05-16 19:36 ` [PATCH 5.15 085/102] drm/nouveau/tegra: Stop using iommu_present() Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 086/102] i40e: i40e_main: fix a missing check on list iterator Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 087/102] net: atlantic: always deep reset on pm op, fixing up my null deref regression Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 088/102] net: phy: Fix race condition on link status change Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 089/102] writeback: Avoid skipping inode writeback Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 090/102] cgroup/cpuset: Remove cpus_allowed/mems_allowed setup in cpuset_init_smp() Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 091/102] arm[64]/memremap: dont abuse pfn_valid() to ensure presence of linear map Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 092/102] net: phy: micrel: Do not use kszphy_suspend/resume for KSZ8061 Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 093/102] net: phy: micrel: Pass .probe for KS8737 Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 094/102] SUNRPC: Ensure that the gssproxy client can start in a connected state Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 095/102] drm/vmwgfx: Initialize drm_mode_fb_cmd2 Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 096/102] Revert "drm/amd/pm: keep the BACO feature enabled for suspend" Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 097/102] dma-buf: call dma_buf_stats_setup after dmabuf is in valid list Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 098/102] mm/hwpoison: use pr_err() instead of dump_page() in get_any_page() Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 099/102] SUNRPC: Ensure we flush any closed sockets before xs_xprt_free() Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 100/102] ping: fix address binding wrt vrf Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 101/102] usb: gadget: uvc: rename function to be more consistent Greg Kroah-Hartman
2022-05-16 19:37 ` [PATCH 5.15 102/102] usb: gadget: uvc: allow for application to cleanly shutdown Greg Kroah-Hartman
2022-05-17  4:12 ` [PATCH 5.15 000/102] 5.15.41-rc1 review Shuah Khan
2022-05-17  8:08 ` Fox Chen
2022-05-17 11:03 ` Sudip Mukherjee
2022-05-17 11:15 ` Naresh Kamboju
2022-05-17 15:59 ` Ron Economos
2022-05-17 16:22 ` Florian Fainelli
2022-05-17 19:31 ` Guenter Roeck

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=20220516193624.262148362@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=vladimir.oltean@nxp.com \
    /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