mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Dragos Tatulea <dtatulea@nvidia.com>
To: "Michael S . Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	Eugenio Perez Martin <eperezma@redhat.com>,
	<virtualization@lists.linux-foundation.org>
Cc: Dragos Tatulea <dtatulea@nvidia.com>,
	Si-Wei Liu <si-wei.liu@oracle.com>,
	Saeed Mahameed <saeedm@nvidia.com>,
	Leon Romanovsky <leon@kernel.org>, <kvm@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, Gal Pressman <gal@nvidia.com>,
	Parav Pandit <parav@nvidia.com>,
	Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	Leon Romanovsky <leonro@nvidia.com>,
	"Tariq Toukan" <tariqt@nvidia.com>
Subject: [PATCH mlx5-vhost v2 01/10] net/mlx5: Support throttled commands from async API
Date: Fri, 16 Aug 2024 12:01:50 +0300	[thread overview]
Message-ID: <20240816090159.1967650-2-dtatulea@nvidia.com> (raw)
In-Reply-To: <20240816090159.1967650-1-dtatulea@nvidia.com>

Currently, commands that qualify as throttled can't be used via the
async API. That's due to the fact that the throttle semaphore can sleep
but the async API can't.

This patch allows throttling in the async API by using the tentative
variant of the semaphore and upon failure (semaphore at 0) returns EBUSY
to signal to the caller that they need to wait for the completion of
previously issued commands.

Furthermore, make sure that the semaphore is released in the callback.

Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 21 ++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index 20768ef2e9d2..f69c977c1569 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -1882,10 +1882,12 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
 
 	throttle_op = mlx5_cmd_is_throttle_opcode(opcode);
 	if (throttle_op) {
-		/* atomic context may not sleep */
-		if (callback)
-			return -EINVAL;
-		down(&dev->cmd.vars.throttle_sem);
+		if (callback) {
+			if (down_trylock(&dev->cmd.vars.throttle_sem))
+				return -EBUSY;
+		} else {
+			down(&dev->cmd.vars.throttle_sem);
+		}
 	}
 
 	pages_queue = is_manage_pages(in);
@@ -2091,10 +2093,19 @@ static void mlx5_cmd_exec_cb_handler(int status, void *_work)
 {
 	struct mlx5_async_work *work = _work;
 	struct mlx5_async_ctx *ctx;
+	struct mlx5_core_dev *dev;
+	u16 opcode;
 
 	ctx = work->ctx;
-	status = cmd_status_err(ctx->dev, status, work->opcode, work->op_mod, work->out);
+	dev = ctx->dev;
+	opcode = work->opcode;
+	status = cmd_status_err(dev, status, work->opcode, work->op_mod, work->out);
 	work->user_callback(status, work);
+	/* Can't access "work" from this point on. It could have been freed in
+	 * the callback.
+	 */
+	if (mlx5_cmd_is_throttle_opcode(opcode))
+		up(&dev->cmd.vars.throttle_sem);
 	if (atomic_dec_and_test(&ctx->num_inflight))
 		complete(&ctx->inflight_done);
 }
-- 
2.45.1


  reply	other threads:[~2024-08-16  9:02 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-16  9:01 [PATCH vhost v2 00/10] vdpa/mlx5: Parallelize device suspend/resume Dragos Tatulea
2024-08-16  9:01 ` Dragos Tatulea [this message]
2024-09-09  9:32   ` [PATCH mlx5-vhost v2 01/10] net/mlx5: Support throttled commands from async API Dragos Tatulea
2024-09-11  8:00     ` Eugenio Perez Martin
2024-09-11 17:05       ` Dragos Tatulea
2024-08-16  9:01 ` [PATCH vhost v2 02/10] vdpa/mlx5: Introduce error logging function Dragos Tatulea
2024-08-16  9:01 ` [PATCH vhost v2 03/10] vdpa/mlx5: Introduce async fw command wrapper Dragos Tatulea
2024-08-28 12:34   ` Eugenio Perez Martin
2024-08-16  9:01 ` [PATCH vhost v2 04/10] vdpa/mlx5: Use async API for vq query command Dragos Tatulea
2024-08-28 12:34   ` Eugenio Perez Martin
2024-08-16  9:01 ` [PATCH vhost v2 05/10] vdpa/mlx5: Use async API for vq modify commands Dragos Tatulea
2024-08-28 12:35   ` Eugenio Perez Martin
2024-08-16  9:01 ` [PATCH vhost v2 06/10] vdpa/mlx5: Parallelize device suspend Dragos Tatulea
2024-08-16  9:01 ` [PATCH vhost v2 07/10] vdpa/mlx5: Parallelize device resume Dragos Tatulea
2024-08-16  9:01 ` [PATCH vhost v2 08/10] vdpa/mlx5: Keep notifiers during suspend but ignore Dragos Tatulea
2024-08-16  9:01 ` [PATCH vhost v2 09/10] vdpa/mlx5: Small improvement for change_num_qps() Dragos Tatulea
2024-08-28 12:48   ` Eugenio Perez Martin
2024-08-16  9:01 ` [PATCH vhost v2 10/10] vdpa/mlx5: Parallelize VQ suspend/resume for CVQ MQ command Dragos Tatulea
2024-08-28 12:59   ` Eugenio Perez Martin
     [not found] ` <CAJaqyWfwkNUYcMWwG4LthhYEquUYDJPRvHeyh9C_R-ioeFYuXw@mail.gmail.com>
2024-09-02 10:03   ` [PATCH vhost v2 00/10] vdpa/mlx5: Parallelize device suspend/resume Lei Yang
2024-09-02 11:05     ` Dragos Tatulea
2024-09-03  7:40       ` Lei Yang
2024-09-03  7:47         ` Dragos Tatulea
2024-09-03  8:10           ` Eugenio Perez Martin
2024-09-03  8:16             ` Dragos Tatulea

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=20240816090159.1967650-2-dtatulea@nvidia.com \
    --to=dtatulea@nvidia.com \
    --cc=eperezma@redhat.com \
    --cc=gal@nvidia.com \
    --cc=jasowang@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=leon@kernel.org \
    --cc=leonro@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=parav@nvidia.com \
    --cc=saeedm@nvidia.com \
    --cc=si-wei.liu@oracle.com \
    --cc=tariqt@nvidia.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=xuanzhuo@linux.alibaba.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

all inboxes | Powered by JetHome®