From patchwork Fri Feb 10 12:27:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 726534 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vKZh12nP5z9ryr for ; Fri, 10 Feb 2017 23:56:17 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="LXQ+zGNG"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752013AbdBJM4P (ORCPT ); Fri, 10 Feb 2017 07:56:15 -0500 Received: from mail-pg0-f67.google.com ([74.125.83.67]:33042 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751457AbdBJM4O (ORCPT ); Fri, 10 Feb 2017 07:56:14 -0500 Received: by mail-pg0-f67.google.com with SMTP id 194so3173794pgd.0 for ; Fri, 10 Feb 2017 04:56:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=GQCJdOiociWgk5GrxVeHjfJqPQsEyUX1G/bBtZhJ9P8=; b=LXQ+zGNGB4duTHZAEZJhh3nZUfXLbMVodu/L+Cyx91MdfSqa5e+9nja3HKnzxle+hC dSqwfdnSRD0y8x/LSs5sSuTU4lT2fL+G/U4VGHrGy/gIGIigWXdEVLJ8dDrwKJsUqSrk WS28sA10lnHekq/k08nQCeVVgE5cKqBeBWP4MIpKtZZT4gsPnrO0D4OdyMhf/t8FM108 kK4eEg2GzPtP3xKNYR+DfeQ6y51thoboBtsQ+RK30Ocr+FXgip+9AqN8IHoFts87sZsu 2NxSdEdT/5qnreajaVtTDHjLGzI+8b+mD/SvY6y2Y464aD9rsvNwC6oZDlX1RRPRbwhp JF9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=GQCJdOiociWgk5GrxVeHjfJqPQsEyUX1G/bBtZhJ9P8=; b=oap2THrdqfMPWsYUCBzcGdAiVcWkmsVb8liLzKZflD/xuSIv6XYMnT7pubgqsuDM+L Ovxov3A9Zu1bHuTKs6DpjvJpLgO40nrvF16YUkXrjwYQG3FhIaaGeWp/IN649TIFwsXm cWi3iNZlO5WtuEpl5OZnni1zvYAe/ZPgvxrZVThIaIh8zFdHtXXSQhjlLF7PuaedEMKw dGhYquKfoUNeozzlgIyznB9EvgZoDs4idYcYKgib2cnWG6xpOeBQ+q+i+omdS4L5KCIn QnMCG8OdID5p6dyAKDFgMXW7v6yJHNH9EkIhmoXNmbdrrpNvljK/mjTT+stD8yKmJTky eKDQ== X-Gm-Message-State: AMke39lzaxdQlbtQp6+8PSK0eTMLXh8vlMA8kIENGXDGmNpjAZk5+TCcnUqKFlM2u4xWug== X-Received: by 10.99.55.91 with SMTP id g27mr10445735pgn.65.1486729680608; Fri, 10 Feb 2017 04:28:00 -0800 (PST) Received: from [172.19.248.187] ([172.19.248.187]) by smtp.googlemail.com with ESMTPSA id t6sm5402549pgt.8.2017.02.10.04.27.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Feb 2017 04:27:59 -0800 (PST) Message-ID: <1486729678.7793.139.camel@edumazet-glaptop3.roam.corp.google.com> Subject: [PATCH net-next] mlx4: do not fire tasklet unless necessary From: Eric Dumazet To: David Miller Cc: netdev , Tariq Toukan , Saeed Mahameed Date: Fri, 10 Feb 2017 04:27:58 -0800 X-Mailer: Evolution 3.10.4-0ubuntu2 Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Eric Dumazet All rx and rx netdev interrupts are handled by respectively by mlx4_en_rx_irq() and mlx4_en_tx_irq() which simply schedule a NAPI. But mlx4_eq_int() also fires a tasklet to service all items that were queued via mlx4_add_cq_to_tasklet(), but this handler was not called unless user cqe was handled. This is very confusing, as "mpstat -I SCPU ..." show huge number of tasklet invocations. This patch saves this overhead, by carefully firing the tasklet directly from mlx4_add_cq_to_tasklet(), removing four atomic operations per IRQ. Signed-off-by: Eric Dumazet Cc: Tariq Toukan Cc: Saeed Mahameed Acked-by: Saeed Mahameed --- drivers/net/ethernet/mellanox/mlx4/cq.c | 6 +++++- drivers/net/ethernet/mellanox/mlx4/eq.c | 9 +-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/cq.c b/drivers/net/ethernet/mellanox/mlx4/cq.c index 6b8635378f1fcb2aae4e8ac390bcd09d552c2256..fa6d2354a0e910ee160863e3cbe21a512d77bf03 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cq.c +++ b/drivers/net/ethernet/mellanox/mlx4/cq.c @@ -81,8 +81,9 @@ void mlx4_cq_tasklet_cb(unsigned long data) static void mlx4_add_cq_to_tasklet(struct mlx4_cq *cq) { - unsigned long flags; struct mlx4_eq_tasklet *tasklet_ctx = cq->tasklet_ctx.priv; + unsigned long flags; + bool kick; spin_lock_irqsave(&tasklet_ctx->lock, flags); /* When migrating CQs between EQs will be implemented, please note @@ -92,7 +93,10 @@ static void mlx4_add_cq_to_tasklet(struct mlx4_cq *cq) */ if (list_empty_careful(&cq->tasklet_ctx.list)) { atomic_inc(&cq->refcount); + kick = list_empty(&tasklet_ctx->list); list_add_tail(&cq->tasklet_ctx.list, &tasklet_ctx->list); + if (kick) + tasklet_schedule(&tasklet_ctx->task); } spin_unlock_irqrestore(&tasklet_ctx->lock, flags); } diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 0509996957d9664b612358dd805359f4bc67b8dc..39232b6a974f4b4b961d3b0b8634f04e6b9d0caa 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c @@ -494,7 +494,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) { struct mlx4_priv *priv = mlx4_priv(dev); struct mlx4_eqe *eqe; - int cqn = -1; + int cqn; int eqes_found = 0; int set_ci = 0; int port; @@ -840,13 +840,6 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) eq_set_ci(eq, 1); - /* cqn is 24bit wide but is initialized such that its higher bits - * are ones too. Thus, if we got any event, cqn's high bits should be off - * and we need to schedule the tasklet. - */ - if (!(cqn & ~0xffffff)) - tasklet_schedule(&eq->tasklet_ctx.task); - return eqes_found; }