From: Caleb Sander Mateos <csander@purestorage.com>
To: Saeed Mahameed <saeedm@nvidia.com>,
Leon Romanovsky <leon@kernel.org>,
Tariq Toukan <tariqt@nvidia.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>
Cc: Caleb Sander Mateos <csander@purestorage.com>,
netdev@vger.kernel.org, linux-rdma@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH net-next 1/2] mlx5/core: avoid memory barrier in eq_update_ci()
Date: Thu, 31 Oct 2024 21:46:39 -0600 [thread overview]
Message-ID: <20241101034647.51590-1-csander@purestorage.com> (raw)
The memory barrier in eq_update_ci() after the doorbell write is a
significant hot spot in mlx5_eq_comp_int(). Under heavy TCP load, we see
3% of CPU time spent on the mfence. As explained in [1], this barrier is
only needed to preserve the ordering of writes to the doorbell register.
Use writel() instead of __raw_writel() for the doorbell write to provide
this ordering without the need for a full memory barrier.
memory-barriers.txt guarantees MMIO writes using writel() appear to the
device in the same order they were made. On strongly-ordered
architectures like x86, writel() adds no overhead to __raw_writel();
both translate into a single store instruction. Removing the mb() avoids
the costly mfence instruction.
[1]: https://lore.kernel.org/netdev/CALzJLG8af0SMfA1C8U8r_Fddb_ZQhvEZd6=2a97dOoBcgLA0xg@mail.gmail.com/
Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
---
drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h b/drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h
index 4b7f7131c560..f03736711343 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h
@@ -68,13 +68,12 @@ static inline struct mlx5_eqe *next_eqe_sw(struct mlx5_eq *eq)
static inline void eq_update_ci(struct mlx5_eq *eq, int arm)
{
__be32 __iomem *addr = eq->doorbell + (arm ? 0 : 2);
u32 val = (eq->cons_index & 0xffffff) | (eq->eqn << 24);
- __raw_writel((__force u32)cpu_to_be32(val), addr);
- /* We still want ordering, just not swabbing, so add a barrier */
- mb();
+ /* Ensure ordering of consecutive doorbell writes */
+ writel((__force u32)cpu_to_be32(val), addr);
}
int mlx5_eq_table_init(struct mlx5_core_dev *dev);
void mlx5_eq_table_cleanup(struct mlx5_core_dev *dev);
int mlx5_eq_table_create(struct mlx5_core_dev *dev);
--
2.45.2
next reply other threads:[~2024-11-01 3:48 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-01 3:46 Caleb Sander Mateos [this message]
2024-11-01 3:46 ` [PATCH net-next 2/2] mlx5/core: deduplicate {mlx5_,}eq_update_ci() Caleb Sander Mateos
2024-11-03 3:55 ` Parav Pandit
2024-11-03 22:18 ` Caleb Sander
2024-11-05 5:22 ` Parav Pandit
2024-11-05 16:06 ` Caleb Sander
2024-11-06 5:44 ` Parav Pandit
2024-11-06 23:44 ` Caleb Sander
2024-11-07 2:36 ` Saeed Mahameed
2024-11-07 2:43 ` Parav Pandit
2024-11-07 4:45 ` Caleb Sander
2024-11-07 5:14 ` Saeed Mahameed
2024-11-07 18:30 ` [PATCH net-next v2 1/2] mlx5/core: relax memory barrier in eq_update_ci() Caleb Sander Mateos
2024-11-07 18:30 ` [PATCH net-next v2 2/2] mlx5/core: deduplicate {mlx5_,}eq_update_ci() Caleb Sander Mateos
2024-11-08 10:49 ` Parav Pandit
2024-11-11 11:59 ` Tariq Toukan
2024-11-08 10:46 ` [PATCH net-next v2 1/2] mlx5/core: relax memory barrier in eq_update_ci() Parav Pandit
2024-11-11 11:59 ` Tariq Toukan
2024-11-12 2:38 ` Jakub Kicinski
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=20241101034647.51590-1-csander@purestorage.com \
--to=csander@purestorage.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=saeedm@nvidia.com \
--cc=tariqt@nvidia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.