From patchwork Thu Oct 21 12:23:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544334 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=Tbi+jmPp; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrC0lsVz9sWJ for ; Thu, 21 Oct 2021 23:24:25 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7G-0002rX-95; Thu, 21 Oct 2021 12:24:14 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7C-0002qn-IW for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:10 +0000 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 5E92A3FFF3 for ; Thu, 21 Oct 2021 12:24:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819050; bh=t9xCyOH06vJiI6sEj0Le3mq40bmcJhk3ant75zG0+Sw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Tbi+jmPpx7X6uICHx3ibzwcMDARli8D7yRD+UEnfgIPvtV+n2WGrNGJHrrqFSUyh5 o/EZ5rq9FT3zSLW+N6t7bLB9EDVd2zrletSK4Cjt+xtOqDD0DdQvjSTDNql2GeGQmr pedTD3udCZn5eMjCkoWPhZkW260NU27MjwpPWoaS4U/Fncq7YhpJdE1pjsqE1PJvOx hp36yRglmg6v7j83vAjIciqiUTTQoMjNvZRD1AGn6MI/KoQgbk8HDFcwqw/o12Vcgd tRVsGQ06ZIPmje2djS8Qwz48ghogB1t9sGHYs0L77MyfKIU39TsmdyxIe5jr+W2hiu MdX/6lpdYsfMA== Received: by mail-pl1-f200.google.com with SMTP id s15-20020a170902b18f00b0013fb4449cecso105101plr.19 for ; Thu, 21 Oct 2021 05:24:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=t9xCyOH06vJiI6sEj0Le3mq40bmcJhk3ant75zG0+Sw=; b=4/xKiBwJ39H++1rRz1Vt1SPZGlilqIMnglzzFbN1QkE8WnvMfEzw7dgVYe34ksNiek qIaRfw88ekAKho+0814NR+fqA6cSfU3eZVgTrbaBOY+nvxD662KcQ5A27d1M5Wen9xU0 L4ESjrr9wtk289eqYTsytVUa0BXKpPfawf5DyrzTeuNmd3XLH7s8mBnWqYiZPv11AgAr Po0ajveAu2FxrokQ6gIMZ/u5lZRdU9HE6fMVjtyQWXBF4YklCLyJrhNXRGIfbiXKXqGK VihQSV60Uwxs1qrxRTwaHrtn8UyIip4uA6kxHQ9JN0Whcy8a+pqqR6t7RfgiRy0XWlMe Uu5w== X-Gm-Message-State: AOAM531xXXdQJGHSMrBPsjfebV0GFMQo1Q8QpffoFQEEBXS1BYjQ/SAh wsmij0Re6ggFMAK3tOgNgfge9YmuiHC9e8V56kzq296qKyX6dYxcJQdzFBF1ozCSa2yXIdl/h7y UIcqBwXqT3/ku2SUTny6URMHiGY84W4Jlt8rKwPIURQ== X-Received: by 2002:a17:90b:3b8e:: with SMTP id pc14mr6317240pjb.180.1634819048866; Thu, 21 Oct 2021 05:24:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxusIcHUGSSkqi1gvCCm/41OeMDBBjo9rjixJRg85hbfSSEqfJg/TW04Y3EMCGZqQCGuZhtHg== X-Received: by 2002:a17:90b:3b8e:: with SMTP id pc14mr6317221pjb.180.1634819048666; Thu, 21 Oct 2021 05:24:08 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:08 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 1/7][Focal/linux-azure] net: mana: Use struct_size() in kzalloc() Date: Thu, 21 Oct 2021 06:23:35 -0600 Message-Id: <20211021122400.10390-2-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: "Gustavo A. R. Silva" BugLink: https://bugs.launchpad.net/bugs/1947859 Make use of the struct_size() helper instead of an open-coded version, in order to avoid any potential type mistakes or integer overflows that, in the worst scenario, could lead to heap overflows. This code was detected with the help of Coccinelle and, audited and fixed manually. Signed-off-by: Gustavo A. R. Silva Signed-off-by: David S. Miller (cherry picked from commit ea89c862f01e02ec459932c7c3113fa37aedd09a) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/mana_en.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 987e11c02f727..02aff16df27f0 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1388,8 +1388,7 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, gc = gd->gdma_context; - rxq = kzalloc(sizeof(*rxq) + - RX_BUFFERS_PER_QUEUE * sizeof(struct mana_recv_buf_oob), + rxq = kzalloc(struct_size(rxq, rx_oobs, RX_BUFFERS_PER_QUEUE), GFP_KERNEL); if (!rxq) return NULL; From patchwork Thu Oct 21 12:23:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544332 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=ejsb79id; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrB70qpz9sS8 for ; Thu, 21 Oct 2021 23:24:25 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7G-0002rk-FY; Thu, 21 Oct 2021 12:24:14 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7D-0002qu-KS for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:11 +0000 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 76CC640010 for ; Thu, 21 Oct 2021 12:24:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819051; bh=ln4ePXD17l195o3JZVR0/2GiTT0ZVR3nr3+ie4Obm6g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ejsb79iddwbVaFsryS4raCVsK8j59bxrRTOekWw1u/p6SqabIo0z8L++fqEGCqATl xmeKZDDnA+TJjxIziVl6/u07w2TBaQr4RdspelP1x/nMM7oZaaPfWKszsP53nilG76 4/V23dHsbz2RgVr6snT6zFYLVGwbfrqeuDqCDQE2ivIQn/wmBoU6zqTZgIOgEewo/7 zWyJEYZf77JAWe2pkaYwhJCIS6gEcEm0wJRAvlbuY3mVw2GO6Dm1u4VdGW/WMVUOGL mHhJ9VjGX3b75xZhckRp2170e7ctI+/3L0rUKRn01UaQ6JK4QuB+3UuwLsYdg7Ww60 zujJ3Q1Ob0Nsg== Received: by mail-pl1-f199.google.com with SMTP id w4-20020a1709029a8400b00138e222b06aso117565plp.12 for ; Thu, 21 Oct 2021 05:24:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ln4ePXD17l195o3JZVR0/2GiTT0ZVR3nr3+ie4Obm6g=; b=WbRUZMRChkAbvDEfNKderfd/rS/j8v010sP6RartJWFXDE0kCdI/7hi1HUlomWX5NY OVwe8FnXGjrSjA/kRynRS9qzKtGskZGiteJWwNWQMETaOgncS5fLLE0xb9L4nNnKiWO8 ye7qtqOKKWBfGyrTuAiOUQM1xHyjLnFEHXo9+WtGv40iif4TtnqKL4A5XPEUCvKDQhlC E15VUFMLSOZf35PkrUmIZ8NdOXwqak6WaKH6z6OQ6tyO3HTt0hcQWhj/qbtdT4qwTIVZ geaueGLRQR/+ETqZWyWvasJLqa9X9/ALo2nCWWNIAM2zExJfcLhGjsw7Mb0MDGAnbgyh E8uQ== X-Gm-Message-State: AOAM532QYjj+mSPauf9wrfKogA6YiL7VGnkv8RskMYiT1k2rgh/f1ifE Jyv2nzSLORK8yuEoCG0m4Iu4dgUMiKJGFMXSSh8IXe31a9tT6rBaw7n+GPmqlO9MhpjQTsdHo2k NQFKb1pgvuvzPSs7+s8LAadVaICxPlTcPu8y9nyzJuw== X-Received: by 2002:a63:7219:: with SMTP id n25mr4144187pgc.258.1634819049798; Thu, 21 Oct 2021 05:24:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzIbvRGhBxR4NOVw3/nBMPz64wUSCGorEiah4qjgapNSwECwu3aLoDyuGRMo77Jv2OfCQQ5Bw== X-Received: by 2002:a63:7219:: with SMTP id n25mr4144169pgc.258.1634819049569; Thu, 21 Oct 2021 05:24:09 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:09 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 2/7][Focal/linux-azure] net: mana: Fix a memory leak in an error handling path in 'mana_create_txq()' Date: Thu, 21 Oct 2021 06:23:36 -0600 Message-Id: <20211021122400.10390-3-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Christophe JAILLET BugLink: https://bugs.launchpad.net/bugs/1947859 If this test fails we must free some resources as in all the other error handling paths of this function. Fixes: ca9c54d2d6a5 ("net: mana: Add a driver for Microsoft Azure Network Adapter (MANA)") Signed-off-by: Christophe JAILLET Reviewed-by: Dexuan Cui Signed-off-by: David S. Miller (cherry picked from commit b90788459cd6d140171b046f0b37fad341ade0a3) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/mana_en.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 02aff16df27f0..8fdf0104c4155 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1231,8 +1231,10 @@ static int mana_create_txq(struct mana_port_context *apc, cq->gdma_id = cq->gdma_cq->id; - if (WARN_ON(cq->gdma_id >= gc->max_num_cqs)) - return -EINVAL; + if (WARN_ON(cq->gdma_id >= gc->max_num_cqs)) { + err = -EINVAL; + goto out; + } gc->cq_table[cq->gdma_id] = cq->gdma_cq; From patchwork Thu Oct 21 12:23:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544337 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=tIACtx1f; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrN0DMbz9sRR for ; Thu, 21 Oct 2021 23:24:36 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7Q-0002xa-6q; Thu, 21 Oct 2021 12:24:24 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7F-0002rR-Lf for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:13 +0000 Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 6980940010 for ; Thu, 21 Oct 2021 12:24:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819053; bh=FwIdor3i0qzFDgVchVRMGbRo/3lrUPXz4QGbMgPBKW8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tIACtx1fBFnicETVYq9VWy+0iOpSWfzgcwcpS/laE5cyCl3Z7s81aqijBwwwc/a9j 5EVy2oo/W4pS+vRTUuM3Sni7zGldpP7ACa7//oJr2MpwzTnBNucTTnXYeJFlIqm4GU M1l2XP3xdTR9vyNhQZHGD7FtYbzjI+XIXsdlYUA9tEEoOS5/aAQuHTAQn6JN5bg54m bjMvzU33GXKfzCEaNZiPvOnjPJkVddhvF0S0zqWf6ZOdJZcO633fbX6W3GZOR8dBPE UCZvLsMPbDPn4/lHvEA52HXYIpK1WzyjquIMeufJFzHaN+ynFfdSVutc37TD2sZm/9 WjnpjDJYZh/hw== Received: by mail-pj1-f71.google.com with SMTP id ge16-20020a17090b0e1000b001a06598a6e2so318318pjb.0 for ; Thu, 21 Oct 2021 05:24:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FwIdor3i0qzFDgVchVRMGbRo/3lrUPXz4QGbMgPBKW8=; b=AqadhQkO4XSkbxwsgUD9ZF9uX/fbWTQAMISc6CjSgL9Z3qGMx5KTWmT/j1ObK6FR6X LY+Uw1RRaM+S1UQRreARVC3r2a759il95JE4rekBhtanKIexWzHkHQcaDrNs9pcMsYqd HqIuT96mFvzBtsM6vS2avTo9G3G+K6mE4wqMfw8VsKQ8aIPvNx4KyUWxfI+TC6Z7zERM bGl/ODnfFkH7sU8YeWZnHJJFQrT92xG1EkB5JJpzaQ8T6YkUUZEvAY6o3n2HpZ4YGoDE WcNUmc/UuoThZl1ZO4SFVFN6HH3DwWlIDTZTzXIvKP/6ULQqZNBE33TvaY/x4uSRWC76 M3PQ== X-Gm-Message-State: AOAM532lJDVQjV7snLwhjF7uJgiToyEw7VzbevC9SJswNeF3ATxVDK+a 2xxgLIEEeTAg5om8g6tXYYwaMO+eQOnK7jMySQRBzvMXQx3TzsXS1qtwsw82MHe0bzO3EexIh4r bgfSoKP1dqUqnpvyRolIqxR9Of/j0OdYmwIu1LJPjig== X-Received: by 2002:a05:6a00:1484:b0:44c:de7f:30 with SMTP id v4-20020a056a00148400b0044cde7f0030mr5254434pfu.62.1634819051437; Thu, 21 Oct 2021 05:24:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwszFDa2ugtst+O7ryOgvX2JMfFCwewv/jwsFbDq/PDHSh907nf3ijZVXbINHeb9OyP8Ze6gQ== X-Received: by 2002:a05:6a00:1484:b0:44c:de7f:30 with SMTP id v4-20020a056a00148400b0044cde7f0030mr5254384pfu.62.1634819050985; Thu, 21 Oct 2021 05:24:10 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:10 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 3/7][Focal/linux-azure] net: mana: Move NAPI from EQ to CQ Date: Thu, 21 Oct 2021 06:23:37 -0600 Message-Id: <20211021122400.10390-4-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 The existing code has NAPI threads polling on EQ directly. To prepare for EQ sharing among vPorts, move NAPI from EQ to CQ so that one EQ can serve multiple CQs from different vPorts. The "arm bit" is only set when CQ processing is completed to reduce the number of EQ entries, which in turn reduce the number of interrupts on EQ. Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit e1b5683ff62e7b328317aec08869495992053e9d) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/gdma.h | 9 +- .../net/ethernet/microsoft/mana/gdma_main.c | 55 +--------- .../net/ethernet/microsoft/mana/hw_channel.c | 2 +- drivers/net/ethernet/microsoft/mana/mana.h | 11 +- drivers/net/ethernet/microsoft/mana/mana_en.c | 100 +++++++++++------- 5 files changed, 74 insertions(+), 103 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma.h b/drivers/net/ethernet/microsoft/mana/gdma.h index 33e53d32e8915..ddbca64bab07a 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma.h +++ b/drivers/net/ethernet/microsoft/mana/gdma.h @@ -239,10 +239,8 @@ struct gdma_event { struct gdma_queue; -#define CQE_POLLING_BUFFER 512 struct mana_eq { struct gdma_queue *eq; - struct gdma_comp cqe_poll[CQE_POLLING_BUFFER]; }; typedef void gdma_eq_callback(void *context, struct gdma_queue *q, @@ -291,11 +289,6 @@ struct gdma_queue { unsigned int msix_index; u32 log2_throttle_limit; - - /* NAPI data */ - struct napi_struct napi; - int work_done; - int budget; } eq; struct { @@ -406,7 +399,7 @@ void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue *queue); int mana_gd_poll_cq(struct gdma_queue *cq, struct gdma_comp *comp, int num_cqe); -void mana_gd_arm_cq(struct gdma_queue *cq); +void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit); struct gdma_wqe { u32 reserved :24; diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 2f87bf90f8ecb..560472fa2d00e 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -267,7 +267,7 @@ void mana_gd_wq_ring_doorbell(struct gdma_context *gc, struct gdma_queue *queue) queue->id, queue->head * GDMA_WQE_BU_SIZE, 1); } -void mana_gd_arm_cq(struct gdma_queue *cq) +void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit) { struct gdma_context *gc = cq->gdma_dev->gdma_context; @@ -276,7 +276,7 @@ void mana_gd_arm_cq(struct gdma_queue *cq) u32 head = cq->head % (num_cqe << GDMA_CQE_OWNER_BITS); mana_gd_ring_doorbell(gc, cq->gdma_dev->doorbell, cq->type, cq->id, - head, SET_ARM_BIT); + head, arm_bit); } static void mana_gd_process_eqe(struct gdma_queue *eq) @@ -339,7 +339,6 @@ static void mana_gd_process_eq_events(void *arg) struct gdma_queue *eq = arg; struct gdma_context *gc; struct gdma_eqe *eqe; - unsigned int arm_bit; u32 head, num_eqe; int i; @@ -370,48 +369,16 @@ static void mana_gd_process_eq_events(void *arg) eq->head++; } - /* Always rearm the EQ for HWC. For MANA, rearm it when NAPI is done. */ - if (mana_gd_is_hwc(eq->gdma_dev)) { - arm_bit = SET_ARM_BIT; - } else if (eq->eq.work_done < eq->eq.budget && - napi_complete_done(&eq->eq.napi, eq->eq.work_done)) { - arm_bit = SET_ARM_BIT; - } else { - arm_bit = 0; - } - head = eq->head % (num_eqe << GDMA_EQE_OWNER_BITS); mana_gd_ring_doorbell(gc, eq->gdma_dev->doorbell, eq->type, eq->id, - head, arm_bit); -} - -static int mana_poll(struct napi_struct *napi, int budget) -{ - struct gdma_queue *eq = container_of(napi, struct gdma_queue, eq.napi); - - eq->eq.work_done = 0; - eq->eq.budget = budget; - - mana_gd_process_eq_events(eq); - - return min(eq->eq.work_done, budget); -} - -static void mana_gd_schedule_napi(void *arg) -{ - struct gdma_queue *eq = arg; - struct napi_struct *napi; - - napi = &eq->eq.napi; - napi_schedule_irqoff(napi); + head, SET_ARM_BIT); } static int mana_gd_register_irq(struct gdma_queue *queue, const struct gdma_queue_spec *spec) { struct gdma_dev *gd = queue->gdma_dev; - bool is_mana = mana_gd_is_mana(gd); struct gdma_irq_context *gic; struct gdma_context *gc; struct gdma_resource *r; @@ -442,20 +409,11 @@ static int mana_gd_register_irq(struct gdma_queue *queue, gic = &gc->irq_contexts[msi_index]; - if (is_mana) { - netif_napi_add(spec->eq.ndev, &queue->eq.napi, mana_poll, - NAPI_POLL_WEIGHT); - napi_enable(&queue->eq.napi); - } - WARN_ON(gic->handler || gic->arg); gic->arg = queue; - if (is_mana) - gic->handler = mana_gd_schedule_napi; - else - gic->handler = mana_gd_process_eq_events; + gic->handler = mana_gd_process_eq_events; return 0; } @@ -549,11 +507,6 @@ static void mana_gd_destroy_eq(struct gdma_context *gc, bool flush_evenets, mana_gd_deregiser_irq(queue); - if (mana_gd_is_mana(queue->gdma_dev)) { - napi_disable(&queue->eq.napi); - netif_napi_del(&queue->eq.napi); - } - if (queue->eq.disable_needed) mana_gd_disable_queue(queue); } diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net/ethernet/microsoft/mana/hw_channel.c index 1a923fd999903..c1310ea1c216f 100644 --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c @@ -304,7 +304,7 @@ static void mana_hwc_comp_event(void *ctx, struct gdma_queue *q_self) &comp_data); } - mana_gd_arm_cq(q_self); + mana_gd_ring_cq(q_self, SET_ARM_BIT); } static void mana_hwc_destroy_cq(struct gdma_context *gc, struct hwc_cq *hwc_cq) diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index a2c3f826f022a..5341dbdb726e1 100644 --- a/drivers/net/ethernet/microsoft/mana/mana.h +++ b/drivers/net/ethernet/microsoft/mana/mana.h @@ -225,6 +225,8 @@ struct mana_tx_comp_oob { struct mana_rxq; +#define CQE_POLLING_BUFFER 512 + struct mana_cq { struct gdma_queue *gdma_cq; @@ -244,8 +246,13 @@ struct mana_cq { */ struct mana_txq *txq; - /* Pointer to a buffer which the CQ handler can copy the CQE's into. */ - struct gdma_comp *gdma_comp_buf; + /* Buffer which the CQ handler can copy the CQE's into. */ + struct gdma_comp gdma_comp_buf[CQE_POLLING_BUFFER]; + + /* NAPI data */ + struct napi_struct napi; + int work_done; + int budget; }; #define GDMA_MAX_RQE_SGES 15 diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 8fdf0104c4155..279dd8aa264bf 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -697,14 +697,6 @@ static void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type, resp.hdr.status); } -static void mana_init_cqe_poll_buf(struct gdma_comp *cqe_poll_buf) -{ - int i; - - for (i = 0; i < CQE_POLLING_BUFFER; i++) - memset(&cqe_poll_buf[i], 0, sizeof(struct gdma_comp)); -} - static void mana_destroy_eq(struct gdma_context *gc, struct mana_port_context *apc) { @@ -747,8 +739,6 @@ static int mana_create_eq(struct mana_port_context *apc) spec.eq.ndev = apc->ndev; for (i = 0; i < apc->num_queues; i++) { - mana_init_cqe_poll_buf(apc->eqs[i].cqe_poll); - err = mana_gd_create_mana_eq(gd, &spec, &apc->eqs[i].eq); if (err) goto out; @@ -791,7 +781,6 @@ static void mana_unmap_skb(struct sk_buff *skb, struct mana_port_context *apc) static void mana_poll_tx_cq(struct mana_cq *cq) { - struct gdma_queue *gdma_eq = cq->gdma_cq->cq.parent; struct gdma_comp *completions = cq->gdma_comp_buf; struct gdma_posted_wqe_info *wqe_info; unsigned int pkt_transmitted = 0; @@ -813,6 +802,9 @@ static void mana_poll_tx_cq(struct mana_cq *cq) comp_read = mana_gd_poll_cq(cq->gdma_cq, completions, CQE_POLLING_BUFFER); + if (comp_read < 1) + return; + for (i = 0; i < comp_read; i++) { struct mana_tx_comp_oob *cqe_oob; @@ -862,7 +854,7 @@ static void mana_poll_tx_cq(struct mana_cq *cq) mana_unmap_skb(skb, apc); - napi_consume_skb(skb, gdma_eq->eq.budget); + napi_consume_skb(skb, cq->budget); pkt_transmitted++; } @@ -891,6 +883,8 @@ static void mana_poll_tx_cq(struct mana_cq *cq) if (atomic_sub_return(pkt_transmitted, &txq->pending_sends) < 0) WARN_ON_ONCE(1); + + cq->work_done = pkt_transmitted; } static void mana_post_pkt_rxq(struct mana_rxq *rxq) @@ -919,17 +913,13 @@ static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, struct mana_stats *rx_stats = &rxq->stats; struct net_device *ndev = rxq->ndev; uint pkt_len = cqe->ppi[0].pkt_len; - struct mana_port_context *apc; u16 rxq_idx = rxq->rxq_idx; struct napi_struct *napi; - struct gdma_queue *eq; struct sk_buff *skb; u32 hash_value; - apc = netdev_priv(ndev); - eq = apc->eqs[rxq_idx].eq; - eq->eq.work_done++; - napi = &eq->eq.napi; + rxq->rx_cq.work_done++; + napi = &rxq->rx_cq.napi; if (!buf_va) { ++ndev->stats.rx_dropped; @@ -1082,6 +1072,7 @@ static void mana_poll_rx_cq(struct mana_cq *cq) static void mana_cq_handler(void *context, struct gdma_queue *gdma_queue) { struct mana_cq *cq = context; + u8 arm_bit; WARN_ON_ONCE(cq->gdma_cq != gdma_queue); @@ -1090,7 +1081,33 @@ static void mana_cq_handler(void *context, struct gdma_queue *gdma_queue) else mana_poll_tx_cq(cq); - mana_gd_arm_cq(gdma_queue); + if (cq->work_done < cq->budget && + napi_complete_done(&cq->napi, cq->work_done)) { + arm_bit = SET_ARM_BIT; + } else { + arm_bit = 0; + } + + mana_gd_ring_cq(gdma_queue, arm_bit); +} + +static int mana_poll(struct napi_struct *napi, int budget) +{ + struct mana_cq *cq = container_of(napi, struct mana_cq, napi); + + cq->work_done = 0; + cq->budget = budget; + + mana_cq_handler(cq, cq->gdma_cq); + + return min(cq->work_done, budget); +} + +static void mana_schedule_napi(void *context, struct gdma_queue *gdma_queue) +{ + struct mana_cq *cq = context; + + napi_schedule_irqoff(&cq->napi); } static void mana_deinit_cq(struct mana_port_context *apc, struct mana_cq *cq) @@ -1115,12 +1132,18 @@ static void mana_deinit_txq(struct mana_port_context *apc, struct mana_txq *txq) static void mana_destroy_txq(struct mana_port_context *apc) { + struct napi_struct *napi; int i; if (!apc->tx_qp) return; for (i = 0; i < apc->num_queues; i++) { + napi = &apc->tx_qp[i].tx_cq.napi; + napi_synchronize(napi); + napi_disable(napi); + netif_napi_del(napi); + mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object); mana_deinit_cq(apc, &apc->tx_qp[i].tx_cq); @@ -1187,7 +1210,6 @@ static int mana_create_txq(struct mana_port_context *apc, /* Create SQ's CQ */ cq = &apc->tx_qp[i].tx_cq; - cq->gdma_comp_buf = apc->eqs[i].cqe_poll; cq->type = MANA_CQ_TYPE_TX; cq->txq = txq; @@ -1196,7 +1218,7 @@ static int mana_create_txq(struct mana_port_context *apc, spec.type = GDMA_CQ; spec.monitor_avl_buf = false; spec.queue_size = cq_size; - spec.cq.callback = mana_cq_handler; + spec.cq.callback = mana_schedule_napi; spec.cq.parent_eq = apc->eqs[i].eq; spec.cq.context = cq; err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq); @@ -1238,7 +1260,10 @@ static int mana_create_txq(struct mana_port_context *apc, gc->cq_table[cq->gdma_id] = cq->gdma_cq; - mana_gd_arm_cq(cq->gdma_cq); + netif_tx_napi_add(net, &cq->napi, mana_poll, NAPI_POLL_WEIGHT); + napi_enable(&cq->napi); + + mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); } return 0; @@ -1247,21 +1272,6 @@ static int mana_create_txq(struct mana_port_context *apc, return err; } -static void mana_napi_sync_for_rx(struct mana_rxq *rxq) -{ - struct net_device *ndev = rxq->ndev; - struct mana_port_context *apc; - u16 rxq_idx = rxq->rxq_idx; - struct napi_struct *napi; - struct gdma_queue *eq; - - apc = netdev_priv(ndev); - eq = apc->eqs[rxq_idx].eq; - napi = &eq->eq.napi; - - napi_synchronize(napi); -} - static void mana_destroy_rxq(struct mana_port_context *apc, struct mana_rxq *rxq, bool validate_state) @@ -1269,13 +1279,19 @@ static void mana_destroy_rxq(struct mana_port_context *apc, struct gdma_context *gc = apc->ac->gdma_dev->gdma_context; struct mana_recv_buf_oob *rx_oob; struct device *dev = gc->dev; + struct napi_struct *napi; int i; if (!rxq) return; + napi = &rxq->rx_cq.napi; + if (validate_state) - mana_napi_sync_for_rx(rxq); + napi_synchronize(napi); + + napi_disable(napi); + netif_napi_del(napi); mana_destroy_wq_obj(apc, GDMA_RQ, rxq->rxobj); @@ -1419,7 +1435,6 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, /* Create RQ's CQ */ cq = &rxq->rx_cq; - cq->gdma_comp_buf = eq->cqe_poll; cq->type = MANA_CQ_TYPE_RX; cq->rxq = rxq; @@ -1427,7 +1442,7 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, spec.type = GDMA_CQ; spec.monitor_avl_buf = false; spec.queue_size = cq_size; - spec.cq.callback = mana_cq_handler; + spec.cq.callback = mana_schedule_napi; spec.cq.parent_eq = eq->eq; spec.cq.context = cq; err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq); @@ -1467,7 +1482,10 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, gc->cq_table[cq->gdma_id] = cq->gdma_cq; - mana_gd_arm_cq(cq->gdma_cq); + netif_napi_add(ndev, &cq->napi, mana_poll, 1); + napi_enable(&cq->napi); + + mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); out: if (!err) return rxq; From patchwork Thu Oct 21 12:23:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544335 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=J48bd5vx; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrF4v5gz9sX3 for ; Thu, 21 Oct 2021 23:24:29 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7K-0002te-Um; Thu, 21 Oct 2021 12:24:18 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7G-0002rg-EH for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:14 +0000 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 374753FFF3 for ; Thu, 21 Oct 2021 12:24:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819054; bh=QeZaPNvO8wOk6wpP47lIzm6DmIb8vkW0sNQ/ACsfZCk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=J48bd5vxFedRUH8rYYbEMhgvDHjOUiOK+3klYBbtJiF+49/2xmMzn4wnT4yqiez5N 6koo+W5oZkKZHch9VuNBnvK0l0LyaLsCTl7BnWVsFdL2/vl9MRyfLMfx4NN/bOqGEo c0Vjgntp2jAiS0ka9gd2+eP/hlfYIPY9gpS8lu7IwrovMdcbpH3uWfkD6+rTbIppNC PZHnxU8zRZiGC6DSpSAV46exh3iV5xC5HWZIoruQ6dWVndTmvM3a+ooiKuAn9xuET4 XZkr8RFEUJE8Ag/24+5FI3dCWJF6AksdvCiYpct27qFhgrrrXJeuPYvm2bEERyQmfe YNAQt7RB84KVg== Received: by mail-pg1-f198.google.com with SMTP id g18-20020a631112000000b00299f5f53824so85885pgl.2 for ; Thu, 21 Oct 2021 05:24:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QeZaPNvO8wOk6wpP47lIzm6DmIb8vkW0sNQ/ACsfZCk=; b=olfhhimcUkyxqXh3dQrdynTiSd2nykyps+Iv5tmxFyixk5hoyNDj1EoJiW5gqPeQOJ e9gpJGvK+d+Muafeu6pxnV8/zF9iCZxnodW7bzeG4aYwP6a0gMbenwyF5OP8PaRdoW5z agM3IjMeJ3LHOzyzZoRSbkaP04UCyVhmG6r5eEnHoW6QTiAOmEO4oQab3TGSjUTiYwwF NLgZAIRvIdgzUu8HZ+AulkduT2tVVo73tz/J41oN9a39XCbcucvrOi/otf6JV2cLoTsr B5egiEhcJn5su4N86Qw7vWLO8LZck9mFLFeRCXAeHtuKpYVFoi4UQZeE0Pub96UbHcrw Wz9A== X-Gm-Message-State: AOAM532IyvEp73t3H1FJJYiAhphjijtCqnF3FmfUu6fs77uH9362lP5v kQkEeES8Om6uvHQPm9Q2OHQen2JNbVgu59a9ypYTL64IyFEIzOuju/BEQcb/risiXGhL7bYRf5z eem5U4ONQ5YNn5UoA7014Z6cnoB2h9+zP6rjib10UWQ== X-Received: by 2002:a62:ce01:0:b0:44c:569c:5c3e with SMTP id y1-20020a62ce01000000b0044c569c5c3emr5752620pfg.77.1634819052413; Thu, 21 Oct 2021 05:24:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyW3irwdcM1m3GVziaHHBPUk2F8l3SgRyMG2abnlhijIw0Z1n8nkm3oqQuKbXYqIKf+aZH+Yg== X-Received: by 2002:a62:ce01:0:b0:44c:569c:5c3e with SMTP id y1-20020a62ce01000000b0044c569c5c3emr5752581pfg.77.1634819051961; Thu, 21 Oct 2021 05:24:11 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:11 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 4/7][Focal/linux-azure] net: mana: Add support for EQ sharing Date: Thu, 21 Oct 2021 06:23:38 -0600 Message-Id: <20211021122400.10390-5-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 The existing code uses (1 + #vPorts * #Queues) MSIXs, which may exceed the device limit. Support EQ sharing, so that multiple vPorts (NICs) can share the same set of MSIXs. And, report the EQ-sharing capability bit to the host, which means the host can potentially offer more vPorts and queues to the VM. Also update the resource limit checking and error handling for better robustness. Now, we support up to 256 virtual ports per VF (it was 16/VF), and support up to 64 queues per vPort (it was 16). Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit 1e2d0824a9c3de5371a46601aac0c14af5c0a50a) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/gdma.h | 23 ++++--- .../net/ethernet/microsoft/mana/gdma_main.c | 31 +++++++--- drivers/net/ethernet/microsoft/mana/mana.h | 18 +++--- drivers/net/ethernet/microsoft/mana/mana_en.c | 62 +++++++++---------- 4 files changed, 78 insertions(+), 56 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma.h b/drivers/net/ethernet/microsoft/mana/gdma.h index ddbca64bab07a..41ecd156e95f5 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma.h +++ b/drivers/net/ethernet/microsoft/mana/gdma.h @@ -312,9 +312,6 @@ struct gdma_queue_spec { void *context; unsigned long log2_throttle_limit; - - /* Only used by the MANA device. */ - struct net_device *ndev; } eq; struct { @@ -489,16 +486,28 @@ enum { GDMA_PROTOCOL_LAST = GDMA_PROTOCOL_V1, }; +#define GDMA_DRV_CAP_FLAG_1_EQ_SHARING_MULTI_VPORT BIT(0) + +#define GDMA_DRV_CAP_FLAGS1 GDMA_DRV_CAP_FLAG_1_EQ_SHARING_MULTI_VPORT + +#define GDMA_DRV_CAP_FLAGS2 0 + +#define GDMA_DRV_CAP_FLAGS3 0 + +#define GDMA_DRV_CAP_FLAGS4 0 + struct gdma_verify_ver_req { struct gdma_req_hdr hdr; /* Mandatory fields required for protocol establishment */ u64 protocol_ver_min; u64 protocol_ver_max; - u64 drv_cap_flags1; - u64 drv_cap_flags2; - u64 drv_cap_flags3; - u64 drv_cap_flags4; + + /* Gdma Driver Capability Flags */ + u64 gd_drv_cap_flags1; + u64 gd_drv_cap_flags2; + u64 gd_drv_cap_flags3; + u64 gd_drv_cap_flags4; /* Advisory fields */ u64 drv_ver; diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 560472fa2d00e..798099d642027 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -67,6 +67,10 @@ static int mana_gd_query_max_resources(struct pci_dev *pdev) if (gc->max_num_queues > resp.max_rq) gc->max_num_queues = resp.max_rq; + /* The Hardware Channel (HWC) used 1 MSI-X */ + if (gc->max_num_queues > gc->num_msix_usable - 1) + gc->max_num_queues = gc->num_msix_usable - 1; + return 0; } @@ -384,28 +388,31 @@ static int mana_gd_register_irq(struct gdma_queue *queue, struct gdma_resource *r; unsigned int msi_index; unsigned long flags; - int err; + struct device *dev; + int err = 0; gc = gd->gdma_context; r = &gc->msix_resource; + dev = gc->dev; spin_lock_irqsave(&r->lock, flags); msi_index = find_first_zero_bit(r->map, r->size); - if (msi_index >= r->size) { + if (msi_index >= r->size || msi_index >= gc->num_msix_usable) { err = -ENOSPC; } else { bitmap_set(r->map, msi_index, 1); queue->eq.msix_index = msi_index; - err = 0; } spin_unlock_irqrestore(&r->lock, flags); - if (err) - return err; + if (err) { + dev_err(dev, "Register IRQ err:%d, msi:%u rsize:%u, nMSI:%u", + err, msi_index, r->size, gc->num_msix_usable); - WARN_ON(msi_index >= gc->num_msix_usable); + return err; + } gic = &gc->irq_contexts[msi_index]; @@ -836,6 +843,11 @@ int mana_gd_verify_vf_version(struct pci_dev *pdev) req.protocol_ver_min = GDMA_PROTOCOL_FIRST; req.protocol_ver_max = GDMA_PROTOCOL_LAST; + req.gd_drv_cap_flags1 = GDMA_DRV_CAP_FLAGS1; + req.gd_drv_cap_flags2 = GDMA_DRV_CAP_FLAGS2; + req.gd_drv_cap_flags3 = GDMA_DRV_CAP_FLAGS3; + req.gd_drv_cap_flags4 = GDMA_DRV_CAP_FLAGS4; + err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); if (err || resp.hdr.status) { dev_err(gc->dev, "VfVerifyVersionOutput: %d, status=0x%x\n", @@ -1154,10 +1166,8 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev) if (max_queues_per_port > MANA_MAX_NUM_QUEUES) max_queues_per_port = MANA_MAX_NUM_QUEUES; - max_irqs = max_queues_per_port * MAX_PORTS_IN_MANA_DEV; - /* Need 1 interrupt for the Hardware communication Channel (HWC) */ - max_irqs++; + max_irqs = max_queues_per_port + 1; nvec = pci_alloc_irq_vectors(pdev, 2, max_irqs, PCI_IRQ_MSIX); if (nvec < 0) @@ -1244,6 +1254,9 @@ static int mana_gd_probe(struct pci_dev *pdev, const struct pci_device_id *ent) int bar = 0; int err; + /* Each port has 2 CQs, each CQ has at most 1 EQE at a time */ + BUILD_BUG_ON(2 * MAX_PORTS_IN_MANA_DEV * GDMA_EQE_SIZE > EQ_SIZE); + err = pci_enable_device(pdev); if (err) return -ENXIO; diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index 5341dbdb726e1..fc98a5ba5ed07 100644 --- a/drivers/net/ethernet/microsoft/mana/mana.h +++ b/drivers/net/ethernet/microsoft/mana/mana.h @@ -46,7 +46,7 @@ enum TRI_STATE { #define EQ_SIZE (8 * PAGE_SIZE) #define LOG2_EQ_THROTTLE 3 -#define MAX_PORTS_IN_MANA_DEV 16 +#define MAX_PORTS_IN_MANA_DEV 256 struct mana_stats { u64 packets; @@ -322,6 +322,8 @@ struct mana_context { u16 num_ports; + struct mana_eq *eqs; + struct net_device *ports[MAX_PORTS_IN_MANA_DEV]; }; @@ -331,8 +333,6 @@ struct mana_port_context { u8 mac_addr[ETH_ALEN]; - struct mana_eq *eqs; - enum TRI_STATE rss_state; mana_handle_t default_rxobj; @@ -402,11 +402,11 @@ enum mana_command_code { struct mana_query_device_cfg_req { struct gdma_req_hdr hdr; - /* Driver Capability flags */ - u64 drv_cap_flags1; - u64 drv_cap_flags2; - u64 drv_cap_flags3; - u64 drv_cap_flags4; + /* MANA Nic Driver Capability flags */ + u64 mn_drv_cap_flags1; + u64 mn_drv_cap_flags2; + u64 mn_drv_cap_flags3; + u64 mn_drv_cap_flags4; u32 proto_major_ver; u32 proto_minor_ver; @@ -523,7 +523,7 @@ struct mana_cfg_rx_steer_resp { struct gdma_resp_hdr hdr; }; /* HW DATA */ -#define MANA_MAX_NUM_QUEUES 16 +#define MANA_MAX_NUM_QUEUES 64 #define MANA_SHORT_VPORT_OFFSET_MAX ((1U << 8) - 1) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 279dd8aa264bf..cc22ada9c085c 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -697,56 +697,56 @@ static void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type, resp.hdr.status); } -static void mana_destroy_eq(struct gdma_context *gc, - struct mana_port_context *apc) +static void mana_destroy_eq(struct mana_context *ac) { + struct gdma_context *gc = ac->gdma_dev->gdma_context; struct gdma_queue *eq; int i; - if (!apc->eqs) + if (!ac->eqs) return; - for (i = 0; i < apc->num_queues; i++) { - eq = apc->eqs[i].eq; + for (i = 0; i < gc->max_num_queues; i++) { + eq = ac->eqs[i].eq; if (!eq) continue; mana_gd_destroy_queue(gc, eq); } - kfree(apc->eqs); - apc->eqs = NULL; + kfree(ac->eqs); + ac->eqs = NULL; } -static int mana_create_eq(struct mana_port_context *apc) +static int mana_create_eq(struct mana_context *ac) { - struct gdma_dev *gd = apc->ac->gdma_dev; + struct gdma_dev *gd = ac->gdma_dev; + struct gdma_context *gc = gd->gdma_context; struct gdma_queue_spec spec = {}; int err; int i; - apc->eqs = kcalloc(apc->num_queues, sizeof(struct mana_eq), - GFP_KERNEL); - if (!apc->eqs) + ac->eqs = kcalloc(gc->max_num_queues, sizeof(struct mana_eq), + GFP_KERNEL); + if (!ac->eqs) return -ENOMEM; spec.type = GDMA_EQ; spec.monitor_avl_buf = false; spec.queue_size = EQ_SIZE; spec.eq.callback = NULL; - spec.eq.context = apc->eqs; + spec.eq.context = ac->eqs; spec.eq.log2_throttle_limit = LOG2_EQ_THROTTLE; - spec.eq.ndev = apc->ndev; - for (i = 0; i < apc->num_queues; i++) { - err = mana_gd_create_mana_eq(gd, &spec, &apc->eqs[i].eq); + for (i = 0; i < gc->max_num_queues; i++) { + err = mana_gd_create_mana_eq(gd, &spec, &ac->eqs[i].eq); if (err) goto out; } return 0; out: - mana_destroy_eq(gd->gdma_context, apc); + mana_destroy_eq(ac); return err; } @@ -1158,7 +1158,8 @@ static void mana_destroy_txq(struct mana_port_context *apc) static int mana_create_txq(struct mana_port_context *apc, struct net_device *net) { - struct gdma_dev *gd = apc->ac->gdma_dev; + struct mana_context *ac = apc->ac; + struct gdma_dev *gd = ac->gdma_dev; struct mana_obj_spec wq_spec; struct mana_obj_spec cq_spec; struct gdma_queue_spec spec; @@ -1219,7 +1220,7 @@ static int mana_create_txq(struct mana_port_context *apc, spec.monitor_avl_buf = false; spec.queue_size = cq_size; spec.cq.callback = mana_schedule_napi; - spec.cq.parent_eq = apc->eqs[i].eq; + spec.cq.parent_eq = ac->eqs[i].eq; spec.cq.context = cq; err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq); if (err) @@ -1503,12 +1504,13 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, static int mana_add_rx_queues(struct mana_port_context *apc, struct net_device *ndev) { + struct mana_context *ac = apc->ac; struct mana_rxq *rxq; int err = 0; int i; for (i = 0; i < apc->num_queues; i++) { - rxq = mana_create_rxq(apc, i, &apc->eqs[i], ndev); + rxq = mana_create_rxq(apc, i, &ac->eqs[i], ndev); if (!rxq) { err = -ENOMEM; goto out; @@ -1620,16 +1622,11 @@ static int mana_init_port(struct net_device *ndev) int mana_alloc_queues(struct net_device *ndev) { struct mana_port_context *apc = netdev_priv(ndev); - struct gdma_dev *gd = apc->ac->gdma_dev; int err; - err = mana_create_eq(apc); - if (err) - return err; - err = mana_create_vport(apc, ndev); if (err) - goto destroy_eq; + return err; err = netif_set_real_num_tx_queues(ndev, apc->num_queues); if (err) @@ -1655,8 +1652,6 @@ int mana_alloc_queues(struct net_device *ndev) destroy_vport: mana_destroy_vport(apc); -destroy_eq: - mana_destroy_eq(gd->gdma_context, apc); return err; } @@ -1733,8 +1728,6 @@ static int mana_dealloc_queues(struct net_device *ndev) mana_destroy_vport(apc); - mana_destroy_eq(apc->ac->gdma_dev->gdma_context, apc); - return 0; } @@ -1787,7 +1780,7 @@ static int mana_probe_port(struct mana_context *ac, int port_idx, apc->ac = ac; apc->ndev = ndev; apc->max_queues = gc->max_num_queues; - apc->num_queues = min_t(uint, gc->max_num_queues, MANA_MAX_NUM_QUEUES); + apc->num_queues = gc->max_num_queues; apc->port_handle = INVALID_MANA_HANDLE; apc->port_idx = port_idx; @@ -1859,6 +1852,10 @@ int mana_probe(struct gdma_dev *gd) ac->num_ports = 1; gd->driver_data = ac; + err = mana_create_eq(ac); + if (err) + goto out; + err = mana_query_device_cfg(ac, MANA_MAJOR_VERSION, MANA_MINOR_VERSION, MANA_MICRO_VERSION, &ac->num_ports); if (err) @@ -1908,6 +1905,9 @@ void mana_remove(struct gdma_dev *gd) free_netdev(ndev); } + + mana_destroy_eq(ac); + out: mana_gd_deregister_device(gd); gd->driver_data = NULL; From patchwork Thu Oct 21 12:23:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544338 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=RNr+Na3O; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrR1kyFz9sRR for ; Thu, 21 Oct 2021 23:24:39 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7T-00030N-Rw; Thu, 21 Oct 2021 12:24:27 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7G-0002s4-PE for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:14 +0000 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 8F01D3FFF4 for ; Thu, 21 Oct 2021 12:24:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819054; bh=dQbdfv+llP30vAAn7dLHxaM11tmO5yo/OPlkIEg2Lt0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=RNr+Na3OadLBJybv6Y+iQ+/dYjiNHITVvRxCHJYNvZr1oHFe/vxXZvpAVHGSytcqj Q/ZbTrPGeGWpyah7p7FzJXv3FRyqcb5vlF62Jy/wpRL44K5iS7HTsjU+M7+wSsiwVj oWygYkX/QZ/09xEZhHfQU98DH5Nvt2ak5mxWSRp+yFb47DUV2b+o8FFCXRLBRUDcJ9 4qomJFrn6obOY3rFJchX3orKg0uxvTVT8ctSc4G2/7WUdtK4+aky61NoeelJTKgp9v aWHl7KMULe669rmeJ3VooUPMAMzFKn3SbDYDWIIB6AefM4KDb0BVIhMEfsGOuFdgBO 8Epq6TCidmfrw== Received: by mail-pj1-f72.google.com with SMTP id nv1-20020a17090b1b4100b001a04861d474so254270pjb.5 for ; Thu, 21 Oct 2021 05:24:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dQbdfv+llP30vAAn7dLHxaM11tmO5yo/OPlkIEg2Lt0=; b=d4wMzneBtWyIThuDuqHP0O+WwpZDq4IXjlpTkMfUKlMT5KPZsDav+R0nMy3A/1TE+D 4JPwjUikwhJXBrMN6GnDjt68peDngn8PHuC+9hLwzRypHsqOBLkQ54LNw7pTyYZ93Uoc cmAUlqpX9PaKTmHuy8/r8fbw/VLRA91U+AsjMhDH89onBu79BreZUfY5yKMZEkmfYiO2 IXaSgRdyJ4+7hthkHzWMvcC0wNJR9ni+8U/HVYOls3sQMx44fAZ8avpzR4GxHx1Dd1XD +qjTuMg8JUkvjabHExZKVeLXkzClkq/dbw4NTrMqNWTqjwWJ+kukjDPHDdyb+cyRT/bH MW3g== X-Gm-Message-State: AOAM5319syPECEdoUit/Ws5cUq6YkUuI5PGp97/W/bkT02bR9XRtbmK5 yhc7TTkJEE3Iw7FiY1++PZbHSxdee61lUPanA4wP4K+QTmDcxXnYuiTG3Z8skIuBuKZxv379enE yimQY8OJ22+fGi72gqX0kdzRZnxhBqpmYvMy0+yt72Q== X-Received: by 2002:a05:6a00:1a46:b0:44d:c9de:9911 with SMTP id h6-20020a056a001a4600b0044dc9de9911mr5308157pfv.63.1634819052972; Thu, 21 Oct 2021 05:24:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxlM9M7FyUt03TJKm9J/RjWvVVQqw5nwu2JsZGnOQu1ZvLi2YgYH6LG6IUHCI4cNZfdlkZQvg== X-Received: by 2002:a05:6a00:1a46:b0:44d:c9de:9911 with SMTP id h6-20020a056a001a4600b0044dc9de9911mr5308143pfv.63.1634819052758; Thu, 21 Oct 2021 05:24:12 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:12 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 5/7][Focal/linux-azure] net: mana: Add WARN_ON_ONCE in case of CQE read overflow Date: Thu, 21 Oct 2021 06:23:39 -0600 Message-Id: <20211021122400.10390-6-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 This is not an expected case normally. Add WARN_ON_ONCE in case of CQE read overflow, instead of failing silently. Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit c1a3e9f98dde4782290d2c4871e42b7e76ad5593) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/gdma_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 798099d642027..cee75b561f59d 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -1093,7 +1093,7 @@ static int mana_gd_read_cqe(struct gdma_queue *cq, struct gdma_comp *comp) new_bits = (cq->head / num_cqe) & GDMA_CQE_OWNER_MASK; /* Return -1 if overflow detected. */ - if (owner_bits != new_bits) + if (WARN_ON_ONCE(owner_bits != new_bits)) return -1; comp->wq_num = cqe->cqe_info.wq_num; From patchwork Thu Oct 21 12:23:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544336 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=Rf1xnA8L; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrH3crnz9sRR for ; Thu, 21 Oct 2021 23:24:31 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7L-0002uB-HG; Thu, 21 Oct 2021 12:24:19 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7H-0002sU-VI for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:15 +0000 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id B205240010 for ; Thu, 21 Oct 2021 12:24:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819055; bh=O8TGurVycwoRJNhqux8XCHzge+D3hMAHfdQ16NSp2hQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Rf1xnA8LqCuLbrqY//vlN9PGB0/PMa0gMYStLovxLEjICjX/0cj4Ev6/30SaFfcZl y7QZwN1Q6TsK/wTBcSZh8OZQr7a1Mhc4WnoXFopAa1jBtC/UVs7Dm4xlosg1Amtn3R TGLDu87IeIFhDOJ6TRdiJz2LzgBDMwR6RESTl21v6m6/WNdtx0vKmuKMFBBxOHayfc o+ScXcunrZl/c4P/wYXKcdUHwYrF33ouoADGbzoRFJjWsEi6t6KDouCk9wN5l+US88 c3hBrasdg4yatlk+SwxGi3g88A2rrv0cQM8asHZtPpz85Rc7+vIHwxdcxisLNtqbdA 0Ax3cD0JF0czA== Received: by mail-pj1-f72.google.com with SMTP id z20-20020a17090abd9400b001a1b91abc81so944607pjr.0 for ; Thu, 21 Oct 2021 05:24:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=O8TGurVycwoRJNhqux8XCHzge+D3hMAHfdQ16NSp2hQ=; b=PZ4vRA1Fat1F6rp3zuwuz8StNQ8OQEHE/QgjofwjjbKd8sA0bSIIClsxPKodkkLMbv ClREVxwmIgu5tHixTTT/ndKR0RgIN4x+mbm6sK8mft1rRnsS53CDkxiBCTjRHm+kBwvP Hfd/AeB6LCZ80QZqDd6XbAufynVFzrKUTknb1wvtQEAvtnWZebwPMbY+5UFm4xD3ghdD Fz5YoebAwSSL//z+QS2B5+EPJoWYCbw7LegJ7/xVfeASmeEpN7MJsqQy6vq4gqbQ801Z XFKb0PB/oHW9z5J8fXwo1DJ/XoYDl+Zus6IlWXM4pIvggnxTf611OtKCfNQmEewh6r5J 4WLA== X-Gm-Message-State: AOAM532hGwytIwTJQJ+OnEAb7RCSaYu3rGmpmIXn8T8VJkk4a2FJMPpf Sv6OzNuY/RSS3CGXRlfjrPn+TPtIBY+dMxCHc7lpgGPJboyLOyxHLbS0JW/lasW6s03ewS7nqjj 2pdSpow5TPl4xkAO3f5tsp8YRbUZlm8WJFHUNqGE39w== X-Received: by 2002:a63:b50d:: with SMTP id y13mr4149838pge.286.1634819053963; Thu, 21 Oct 2021 05:24:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxs7J6IhrCK/Ai6njXiJE6HOvDBeKtjmCshjt2119n6j2/Cs/IJb16hW+gtTGoRbS1Duak4TA== X-Received: by 2002:a63:b50d:: with SMTP id y13mr4149823pge.286.1634819053723; Thu, 21 Oct 2021 05:24:13 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:13 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 6/7][Focal/linux-azure] net: mana: Prefer struct_size over open coded arithmetic Date: Thu, 21 Oct 2021 06:23:40 -0600 Message-Id: <20211021122400.10390-7-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Len Baker BugLink: https://bugs.launchpad.net/bugs/1947859 As noted in the "Deprecated Interfaces, Language Features, Attributes, and Conventions" documentation [1], size calculations (especially multiplication) should not be performed in memory allocator (or similar) function arguments due to the risk of them overflowing. This could lead to values wrapping around and a smaller allocation being made than the caller was expecting. Using those allocations could lead to linear overflows of heap memory and other misbehaviors. So, use the struct_size() helper to do the arithmetic instead of the argument "size + count * size" in the kzalloc() function. [1] https://www.kernel.org/doc/html/v5.14/process/deprecated.html#open-coded-arithmetic-in-allocator-arguments Signed-off-by: Len Baker Reviewed-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit f11ee2ad25b22c2ee587045dd6999434375532f7) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/hw_channel.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net/ethernet/microsoft/mana/hw_channel.c index c1310ea1c216f..d5c485a6d2845 100644 --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c @@ -398,9 +398,7 @@ static int mana_hwc_alloc_dma_buf(struct hw_channel_context *hwc, u16 q_depth, int err; u16 i; - dma_buf = kzalloc(sizeof(*dma_buf) + - q_depth * sizeof(struct hwc_work_request), - GFP_KERNEL); + dma_buf = kzalloc(struct_size(dma_buf, reqs, q_depth), GFP_KERNEL); if (!dma_buf) return -ENOMEM; From patchwork Thu Oct 21 12:23:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544339 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=wNUUvv/1; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmrV3DpJz9sRR for ; Thu, 21 Oct 2021 23:24:42 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7Y-00033k-HG; Thu, 21 Oct 2021 12:24:32 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7I-0002su-OC for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:16 +0000 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 871BC3FFF4 for ; Thu, 21 Oct 2021 12:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819056; bh=qA5XPKugUlCEd33pe+75l0AyT9MeuJTHe9SVdTYcXcU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=wNUUvv/16eO3mTsjGKOlE2+YRMD0JXe6686HV4YGLtSSq9CxKySWhCDCNIHCKvGQQ UMm7HMhOeJi728FGsH2UIPEf1/hVL97qxD12Go6R6BsAZLONPq5vlaiknUu2B7tTZ3 77USDa6jEhkFKc+FT2+ztJcPLCincvu+gIsnemsRAHg9k9cqCKOCwbUE9b3ihN/yOR tP5xoyOlnNjG3NmwHXomaJrzT1TsU4cSAwGqmWWUo3nct0vVPUHJ69y2u1zz/OsI9Y Xr1HQM3YIjv3rpHUUDhifSaFRJJrU4UNCBzTLTKRH5en94JFv/z3m3LtymCAAXOyAV KnVJlMqzpKJlg== Received: by mail-pg1-f197.google.com with SMTP id d6-20020a63d646000000b00268d368ead8so78354pgj.6 for ; Thu, 21 Oct 2021 05:24:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qA5XPKugUlCEd33pe+75l0AyT9MeuJTHe9SVdTYcXcU=; b=szdxWhshaQ35x+bNouv8HtYcjwjWWBXA6aTrGTocK1LDLbz8vnMKX2XDPza3Iy9nYe yfJBm8QqxO3xfi4o40o5VDP/HcanqB2oc+0Yw8ZFlmpinQJx13xTY2Ckzinz2FBa5tL7 RB5p338WkqdOZE8VMpwUu1h3hkilOO0wd/KxqgABa0kaz80HKHsuuRSdAboiBL/vYNBN wxZnkqAZAXYaqNVY9ybijWS21ctdeZ/U89dCeXgzW+C3Xx+BzRyi+7NPbaF8/QDSAYlF kMMwoC7p08pqpWeXLxIdlAAf0Hz0imO2uQztSnnPmxIFGwT2hXCFXYJxXZUCoTR8m32r GL8A== X-Gm-Message-State: AOAM532gF43zrFdmOltaO9oz0ksrvh2KgTbdcaYYbeXCWmAA6y4fCe7t FGj9vetnK2wmEEGdwopEtlYEBmXdebNN8/b9ij0nfz8wvz56VPQyuNxVvDO3m7NiIduHU8ZD4xy uAF/KYNSMIhPs+TssxQHVwIwcvphtU/u8ZXg4zNxy+A== X-Received: by 2002:a63:79cf:: with SMTP id u198mr4187631pgc.259.1634819054862; Thu, 21 Oct 2021 05:24:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxME4hDXKrUuCaL3BxbnVj0by1UZEkGf7BQLzJmc3jr0ysugGsRodOhajZs60fIF7R3VReLWQ== X-Received: by 2002:a63:79cf:: with SMTP id u198mr4187617pgc.259.1634819054568; Thu, 21 Oct 2021 05:24:14 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:14 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 7/7][Focal/linux-azure] net: mana: Fix error handling in mana_create_rxq() Date: Thu, 21 Oct 2021 06:23:41 -0600 Message-Id: <20211021122400.10390-8-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 Fix error handling in mana_create_rxq() when cq->gdma_id >= gc->max_num_cqs. Fixes: ca9c54d2d6a5 ("net: mana: Add a driver for Microsoft Azure Network Adapter (MANA)") Signed-off-by: Haiyang Zhang Link: https://lore.kernel.org/r/1633698691-31721-1-git-send-email-haiyangz@microsoft.com Signed-off-by: Jakub Kicinski (cherry picked from commit be0499369d6376e70b5b80bbced94c0c32d508b1) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/mana_en.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index cc22ada9c085c..67662a46e788b 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1478,8 +1478,10 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, if (err) goto out; - if (cq->gdma_id >= gc->max_num_cqs) + if (WARN_ON(cq->gdma_id >= gc->max_num_cqs)) { + err = -EINVAL; goto out; + } gc->cq_table[cq->gdma_id] = cq->gdma_cq; From patchwork Thu Oct 21 12:23:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544349 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=meOaUe3l; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmsN1Ndkz9sRR for ; Thu, 21 Oct 2021 23:25:28 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX8J-0003Wq-37; Thu, 21 Oct 2021 12:25:19 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7T-0002zS-Hf for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:27 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id DDBA63FFF3 for ; Thu, 21 Oct 2021 12:24:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819065; bh=HVXHpW2HcvGWaO7DKzBaF5OCB+83b7t/haDVf2pzJhg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=meOaUe3lPgi5QKNiu7SzRfp3vOxh7lVGCYp4OB98l/bWeKnRI3gSwntXVAHkYGth3 NE8tYcBNSCo9sY2QU8FtLVe6/yxRsL/TrcqvrcAp1xdaLoF6kUe/ghicC4d4ZMzuK8 ohrkBFG4SY67HxwVE/Zaj67ej63bmSKQceXp5eNNMnOvvah6l4qI8aWJD5ujAStWI4 rTPooJqHiuwbgm2Jl8HMQTz4ExECq9SutqnaY4mBrhtINC12JAt1ro5Dz/7uqzdGAf e5t80jhKVwbddxZARzzYD65KMNpYfnLEiS9/NljQUFB5uUNIXkVNgd6MvPDffolnyY b2VjaYqWUPmHA== Received: by mail-pf1-f200.google.com with SMTP id x123-20020a626381000000b0044da6d19df6so335597pfb.3 for ; Thu, 21 Oct 2021 05:24:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HVXHpW2HcvGWaO7DKzBaF5OCB+83b7t/haDVf2pzJhg=; b=IwdOwhFj7yJNhALbDYbfAtULXe3xuE9Alps/C8h0DgwX4XuCJgC25u+Cpg3lsgyV4u J/3wipxol7RCODYzb1P8V/Jvgmd/1Fd9vo13jTube8O5H6kV3DbKHI8YcAFj9SUeiJIe BVKB4WYjfQgkjg2pQoHf6CDsRTIu9khMBl2vLofEF1KYl74C9Z7RHEHNJ+fi9VHMiI5l jai96sE4Q2lyI8ksF5hQE4Z3EcBm4vywprgz03wxH33Nyh4R4kdzOguCsUh7XaMUt9LY +ddmU2rCqW0c5OAw554k60er0DOlTcIaYIfuuRs4hzndEIWzWAsyybLrJeEGD5fDh6CT bHzg== X-Gm-Message-State: AOAM530Enz091cLgZjvUrFMuF0scQUdmBpKSM3UWAsp/lbJqeE68/cn0 xA1HiPoBWKO8rkGzk4bcmO5bWiP6j6MypATq6Hymx5MZQZWnbbmXllJxzGxWQ8qni9afvPDHpt3 HZx3J8mI5Rzp3dHv+5DaWIOE0iTSXUioCZs6VqJTYrA== X-Received: by 2002:a17:902:8bc4:b029:12b:8470:e29e with SMTP id r4-20020a1709028bc4b029012b8470e29emr4951768plo.2.1634819064325; Thu, 21 Oct 2021 05:24:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyv3bFTvHNr5cryu9uK2cZTEDZ3Gxj0TbGlFqlCYUNeZUY5y5ch08Yy5PovR+IkVRfTA/r7lA== X-Received: by 2002:a17:902:8bc4:b029:12b:8470:e29e with SMTP id r4-20020a1709028bc4b029012b8470e29emr4951744plo.2.1634819064073; Thu, 21 Oct 2021 05:24:24 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:23 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 08/13][Hirsute/linux-azure] net: mana: Fix a memory leak in an error handling path in 'mana_create_txq()' Date: Thu, 21 Oct 2021 06:23:49 -0600 Message-Id: <20211021122400.10390-16-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Christophe JAILLET BugLink: https://bugs.launchpad.net/bugs/1947859 If this test fails we must free some resources as in all the other error handling paths of this function. Fixes: ca9c54d2d6a5 ("net: mana: Add a driver for Microsoft Azure Network Adapter (MANA)") Signed-off-by: Christophe JAILLET Reviewed-by: Dexuan Cui Signed-off-by: David S. Miller (cherry picked from commit b90788459cd6d140171b046f0b37fad341ade0a3) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/mana_en.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 46aee2c49f1b..fff78900fc8a 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1230,8 +1230,10 @@ static int mana_create_txq(struct mana_port_context *apc, cq->gdma_id = cq->gdma_cq->id; - if (WARN_ON(cq->gdma_id >= gc->max_num_cqs)) - return -EINVAL; + if (WARN_ON(cq->gdma_id >= gc->max_num_cqs)) { + err = -EINVAL; + goto out; + } gc->cq_table[cq->gdma_id] = cq->gdma_cq; From patchwork Thu Oct 21 12:23:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544344 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=pNcvn1p+; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZms23P3Rz9sRR for ; Thu, 21 Oct 2021 23:25:10 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX7w-0003J3-LE; Thu, 21 Oct 2021 12:24:56 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7V-00030e-QG for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:30 +0000 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id AC3C63FFF6 for ; Thu, 21 Oct 2021 12:24:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819067; bh=BiKVhu7RVaJ9pJAuO7/wYZ3jQZMBH2diOI30hFmAFpg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=pNcvn1p+h5GrWQ/HBRg2oHLXla/+WzvuvWwmGAJk/9GwVaGcfagErX6PUcZ7GekNG LBtgmKayiYCUFqNVR7uduEteuhWHMjNtPBjLw2fP399UM/atGSMAwxi3D3Csj6oCPi 8YsQDf/4g1ewTf8dCv+UXAF6DB7UllF3RCxKDJH2hqGWzYM3bYpS33RAOseaWARv+b E5PPSoRhyaf1LQmTGHXpzgf9MLs04RvMWHyzajddu4HX7dasdlpbRMj6Z7XnUaqcfy tsHAFGNcToaRRPYQDZUeIWHNncpUqwdWO6hi2vn7Q+JviZEXyYKq8UtWjaPqoPemDX HPPZjx2Sw94eg== Received: by mail-pg1-f199.google.com with SMTP id z12-20020a655a4c000000b0029506c80060so50376pgs.20 for ; Thu, 21 Oct 2021 05:24:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BiKVhu7RVaJ9pJAuO7/wYZ3jQZMBH2diOI30hFmAFpg=; b=Y00EHhJKYeZtGQSoueMudBlLDSxTXoVRk1QxPL4mCpnp2bSu+07DFwU13yjGn2NROU qLEXBgYMsGu9Q3zLpfUlQHi0lPd88vlhHBAN7Ydv8NKxofSnTRgJpA/DLRI8OwnRg+dr 5M8GJpe+akQdsFiNZss8a61YlMRcHfIsuHfUMP9kJizZdDZiLECoD0recyoAnkjpsNJx Gf+gDewVERKeHp/tmjh9Wqhu0UZ4DMJxBLwqa3WFTQ7V9yx0EhgAbORwx4DAKLRNY3eQ 9jq5WVlSFr+Q6JNxqUwwN/7J+1vv6PZW5oZSf7DKemRhslwaDUKyZFxZeIzuXsXKl0jZ 6frQ== X-Gm-Message-State: AOAM530m5UVy1a2Oe5KUnkTG5+H61FluzHkpj9ke0OpKzyZwyxyOsqPg yNFuOyw3BAVGG3j/RyOxmCsHHS8IQzBUoEw6d3x8bRC2XAOUyNXiHSHrZChTDlw3mrX2An0hcKo aRm1WkPksYBAIXR2E0vBPXSjooDjJBHDL0sGsHEtIcQ== X-Received: by 2002:a63:3d0f:: with SMTP id k15mr4128063pga.269.1634819065758; Thu, 21 Oct 2021 05:24:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyX1WwUTQsc+7RLHcFrWDAaF95lENgUYK6kCZemmpsDxl0kABnDl31p++asU8M50faRVAwjhg== X-Received: by 2002:a63:3d0f:: with SMTP id k15mr4128028pga.269.1634819065290; Thu, 21 Oct 2021 05:24:25 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:24 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 09/13][Hirsute/linux-azure] net: mana: Move NAPI from EQ to CQ Date: Thu, 21 Oct 2021 06:23:50 -0600 Message-Id: <20211021122400.10390-17-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 The existing code has NAPI threads polling on EQ directly. To prepare for EQ sharing among vPorts, move NAPI from EQ to CQ so that one EQ can serve multiple CQs from different vPorts. The "arm bit" is only set when CQ processing is completed to reduce the number of EQ entries, which in turn reduce the number of interrupts on EQ. Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit e1b5683ff62e7b328317aec08869495992053e9d) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/gdma.h | 9 +- .../net/ethernet/microsoft/mana/gdma_main.c | 55 +--------- .../net/ethernet/microsoft/mana/hw_channel.c | 2 +- drivers/net/ethernet/microsoft/mana/mana.h | 11 +- drivers/net/ethernet/microsoft/mana/mana_en.c | 100 +++++++++++------- 5 files changed, 74 insertions(+), 103 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma.h b/drivers/net/ethernet/microsoft/mana/gdma.h index 33e53d32e891..ddbca64bab07 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma.h +++ b/drivers/net/ethernet/microsoft/mana/gdma.h @@ -239,10 +239,8 @@ struct gdma_event { struct gdma_queue; -#define CQE_POLLING_BUFFER 512 struct mana_eq { struct gdma_queue *eq; - struct gdma_comp cqe_poll[CQE_POLLING_BUFFER]; }; typedef void gdma_eq_callback(void *context, struct gdma_queue *q, @@ -291,11 +289,6 @@ struct gdma_queue { unsigned int msix_index; u32 log2_throttle_limit; - - /* NAPI data */ - struct napi_struct napi; - int work_done; - int budget; } eq; struct { @@ -406,7 +399,7 @@ void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue *queue); int mana_gd_poll_cq(struct gdma_queue *cq, struct gdma_comp *comp, int num_cqe); -void mana_gd_arm_cq(struct gdma_queue *cq); +void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit); struct gdma_wqe { u32 reserved :24; diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 2f87bf90f8ec..560472fa2d00 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -267,7 +267,7 @@ void mana_gd_wq_ring_doorbell(struct gdma_context *gc, struct gdma_queue *queue) queue->id, queue->head * GDMA_WQE_BU_SIZE, 1); } -void mana_gd_arm_cq(struct gdma_queue *cq) +void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit) { struct gdma_context *gc = cq->gdma_dev->gdma_context; @@ -276,7 +276,7 @@ void mana_gd_arm_cq(struct gdma_queue *cq) u32 head = cq->head % (num_cqe << GDMA_CQE_OWNER_BITS); mana_gd_ring_doorbell(gc, cq->gdma_dev->doorbell, cq->type, cq->id, - head, SET_ARM_BIT); + head, arm_bit); } static void mana_gd_process_eqe(struct gdma_queue *eq) @@ -339,7 +339,6 @@ static void mana_gd_process_eq_events(void *arg) struct gdma_queue *eq = arg; struct gdma_context *gc; struct gdma_eqe *eqe; - unsigned int arm_bit; u32 head, num_eqe; int i; @@ -370,48 +369,16 @@ static void mana_gd_process_eq_events(void *arg) eq->head++; } - /* Always rearm the EQ for HWC. For MANA, rearm it when NAPI is done. */ - if (mana_gd_is_hwc(eq->gdma_dev)) { - arm_bit = SET_ARM_BIT; - } else if (eq->eq.work_done < eq->eq.budget && - napi_complete_done(&eq->eq.napi, eq->eq.work_done)) { - arm_bit = SET_ARM_BIT; - } else { - arm_bit = 0; - } - head = eq->head % (num_eqe << GDMA_EQE_OWNER_BITS); mana_gd_ring_doorbell(gc, eq->gdma_dev->doorbell, eq->type, eq->id, - head, arm_bit); -} - -static int mana_poll(struct napi_struct *napi, int budget) -{ - struct gdma_queue *eq = container_of(napi, struct gdma_queue, eq.napi); - - eq->eq.work_done = 0; - eq->eq.budget = budget; - - mana_gd_process_eq_events(eq); - - return min(eq->eq.work_done, budget); -} - -static void mana_gd_schedule_napi(void *arg) -{ - struct gdma_queue *eq = arg; - struct napi_struct *napi; - - napi = &eq->eq.napi; - napi_schedule_irqoff(napi); + head, SET_ARM_BIT); } static int mana_gd_register_irq(struct gdma_queue *queue, const struct gdma_queue_spec *spec) { struct gdma_dev *gd = queue->gdma_dev; - bool is_mana = mana_gd_is_mana(gd); struct gdma_irq_context *gic; struct gdma_context *gc; struct gdma_resource *r; @@ -442,20 +409,11 @@ static int mana_gd_register_irq(struct gdma_queue *queue, gic = &gc->irq_contexts[msi_index]; - if (is_mana) { - netif_napi_add(spec->eq.ndev, &queue->eq.napi, mana_poll, - NAPI_POLL_WEIGHT); - napi_enable(&queue->eq.napi); - } - WARN_ON(gic->handler || gic->arg); gic->arg = queue; - if (is_mana) - gic->handler = mana_gd_schedule_napi; - else - gic->handler = mana_gd_process_eq_events; + gic->handler = mana_gd_process_eq_events; return 0; } @@ -549,11 +507,6 @@ static void mana_gd_destroy_eq(struct gdma_context *gc, bool flush_evenets, mana_gd_deregiser_irq(queue); - if (mana_gd_is_mana(queue->gdma_dev)) { - napi_disable(&queue->eq.napi); - netif_napi_del(&queue->eq.napi); - } - if (queue->eq.disable_needed) mana_gd_disable_queue(queue); } diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net/ethernet/microsoft/mana/hw_channel.c index 1a923fd99990..c1310ea1c216 100644 --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c @@ -304,7 +304,7 @@ static void mana_hwc_comp_event(void *ctx, struct gdma_queue *q_self) &comp_data); } - mana_gd_arm_cq(q_self); + mana_gd_ring_cq(q_self, SET_ARM_BIT); } static void mana_hwc_destroy_cq(struct gdma_context *gc, struct hwc_cq *hwc_cq) diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index a2c3f826f022..5341dbdb726e 100644 --- a/drivers/net/ethernet/microsoft/mana/mana.h +++ b/drivers/net/ethernet/microsoft/mana/mana.h @@ -225,6 +225,8 @@ struct mana_tx_comp_oob { struct mana_rxq; +#define CQE_POLLING_BUFFER 512 + struct mana_cq { struct gdma_queue *gdma_cq; @@ -244,8 +246,13 @@ struct mana_cq { */ struct mana_txq *txq; - /* Pointer to a buffer which the CQ handler can copy the CQE's into. */ - struct gdma_comp *gdma_comp_buf; + /* Buffer which the CQ handler can copy the CQE's into. */ + struct gdma_comp gdma_comp_buf[CQE_POLLING_BUFFER]; + + /* NAPI data */ + struct napi_struct napi; + int work_done; + int budget; }; #define GDMA_MAX_RQE_SGES 15 diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index fff78900fc8a..cdef4d730a0e 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -696,14 +696,6 @@ static void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type, resp.hdr.status); } -static void mana_init_cqe_poll_buf(struct gdma_comp *cqe_poll_buf) -{ - int i; - - for (i = 0; i < CQE_POLLING_BUFFER; i++) - memset(&cqe_poll_buf[i], 0, sizeof(struct gdma_comp)); -} - static void mana_destroy_eq(struct gdma_context *gc, struct mana_port_context *apc) { @@ -746,8 +738,6 @@ static int mana_create_eq(struct mana_port_context *apc) spec.eq.ndev = apc->ndev; for (i = 0; i < apc->num_queues; i++) { - mana_init_cqe_poll_buf(apc->eqs[i].cqe_poll); - err = mana_gd_create_mana_eq(gd, &spec, &apc->eqs[i].eq); if (err) goto out; @@ -790,7 +780,6 @@ static void mana_unmap_skb(struct sk_buff *skb, struct mana_port_context *apc) static void mana_poll_tx_cq(struct mana_cq *cq) { - struct gdma_queue *gdma_eq = cq->gdma_cq->cq.parent; struct gdma_comp *completions = cq->gdma_comp_buf; struct gdma_posted_wqe_info *wqe_info; unsigned int pkt_transmitted = 0; @@ -812,6 +801,9 @@ static void mana_poll_tx_cq(struct mana_cq *cq) comp_read = mana_gd_poll_cq(cq->gdma_cq, completions, CQE_POLLING_BUFFER); + if (comp_read < 1) + return; + for (i = 0; i < comp_read; i++) { struct mana_tx_comp_oob *cqe_oob; @@ -861,7 +853,7 @@ static void mana_poll_tx_cq(struct mana_cq *cq) mana_unmap_skb(skb, apc); - napi_consume_skb(skb, gdma_eq->eq.budget); + napi_consume_skb(skb, cq->budget); pkt_transmitted++; } @@ -890,6 +882,8 @@ static void mana_poll_tx_cq(struct mana_cq *cq) if (atomic_sub_return(pkt_transmitted, &txq->pending_sends) < 0) WARN_ON_ONCE(1); + + cq->work_done = pkt_transmitted; } static void mana_post_pkt_rxq(struct mana_rxq *rxq) @@ -918,17 +912,13 @@ static void mana_rx_skb(void *buf_va, struct mana_rxcomp_oob *cqe, struct mana_stats *rx_stats = &rxq->stats; struct net_device *ndev = rxq->ndev; uint pkt_len = cqe->ppi[0].pkt_len; - struct mana_port_context *apc; u16 rxq_idx = rxq->rxq_idx; struct napi_struct *napi; - struct gdma_queue *eq; struct sk_buff *skb; u32 hash_value; - apc = netdev_priv(ndev); - eq = apc->eqs[rxq_idx].eq; - eq->eq.work_done++; - napi = &eq->eq.napi; + rxq->rx_cq.work_done++; + napi = &rxq->rx_cq.napi; if (!buf_va) { ++ndev->stats.rx_dropped; @@ -1081,6 +1071,7 @@ static void mana_poll_rx_cq(struct mana_cq *cq) static void mana_cq_handler(void *context, struct gdma_queue *gdma_queue) { struct mana_cq *cq = context; + u8 arm_bit; WARN_ON_ONCE(cq->gdma_cq != gdma_queue); @@ -1089,7 +1080,33 @@ static void mana_cq_handler(void *context, struct gdma_queue *gdma_queue) else mana_poll_tx_cq(cq); - mana_gd_arm_cq(gdma_queue); + if (cq->work_done < cq->budget && + napi_complete_done(&cq->napi, cq->work_done)) { + arm_bit = SET_ARM_BIT; + } else { + arm_bit = 0; + } + + mana_gd_ring_cq(gdma_queue, arm_bit); +} + +static int mana_poll(struct napi_struct *napi, int budget) +{ + struct mana_cq *cq = container_of(napi, struct mana_cq, napi); + + cq->work_done = 0; + cq->budget = budget; + + mana_cq_handler(cq, cq->gdma_cq); + + return min(cq->work_done, budget); +} + +static void mana_schedule_napi(void *context, struct gdma_queue *gdma_queue) +{ + struct mana_cq *cq = context; + + napi_schedule_irqoff(&cq->napi); } static void mana_deinit_cq(struct mana_port_context *apc, struct mana_cq *cq) @@ -1114,12 +1131,18 @@ static void mana_deinit_txq(struct mana_port_context *apc, struct mana_txq *txq) static void mana_destroy_txq(struct mana_port_context *apc) { + struct napi_struct *napi; int i; if (!apc->tx_qp) return; for (i = 0; i < apc->num_queues; i++) { + napi = &apc->tx_qp[i].tx_cq.napi; + napi_synchronize(napi); + napi_disable(napi); + netif_napi_del(napi); + mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object); mana_deinit_cq(apc, &apc->tx_qp[i].tx_cq); @@ -1186,7 +1209,6 @@ static int mana_create_txq(struct mana_port_context *apc, /* Create SQ's CQ */ cq = &apc->tx_qp[i].tx_cq; - cq->gdma_comp_buf = apc->eqs[i].cqe_poll; cq->type = MANA_CQ_TYPE_TX; cq->txq = txq; @@ -1195,7 +1217,7 @@ static int mana_create_txq(struct mana_port_context *apc, spec.type = GDMA_CQ; spec.monitor_avl_buf = false; spec.queue_size = cq_size; - spec.cq.callback = mana_cq_handler; + spec.cq.callback = mana_schedule_napi; spec.cq.parent_eq = apc->eqs[i].eq; spec.cq.context = cq; err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq); @@ -1237,7 +1259,10 @@ static int mana_create_txq(struct mana_port_context *apc, gc->cq_table[cq->gdma_id] = cq->gdma_cq; - mana_gd_arm_cq(cq->gdma_cq); + netif_tx_napi_add(net, &cq->napi, mana_poll, NAPI_POLL_WEIGHT); + napi_enable(&cq->napi); + + mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); } return 0; @@ -1246,21 +1271,6 @@ static int mana_create_txq(struct mana_port_context *apc, return err; } -static void mana_napi_sync_for_rx(struct mana_rxq *rxq) -{ - struct net_device *ndev = rxq->ndev; - struct mana_port_context *apc; - u16 rxq_idx = rxq->rxq_idx; - struct napi_struct *napi; - struct gdma_queue *eq; - - apc = netdev_priv(ndev); - eq = apc->eqs[rxq_idx].eq; - napi = &eq->eq.napi; - - napi_synchronize(napi); -} - static void mana_destroy_rxq(struct mana_port_context *apc, struct mana_rxq *rxq, bool validate_state) @@ -1268,13 +1278,19 @@ static void mana_destroy_rxq(struct mana_port_context *apc, struct gdma_context *gc = apc->ac->gdma_dev->gdma_context; struct mana_recv_buf_oob *rx_oob; struct device *dev = gc->dev; + struct napi_struct *napi; int i; if (!rxq) return; + napi = &rxq->rx_cq.napi; + if (validate_state) - mana_napi_sync_for_rx(rxq); + napi_synchronize(napi); + + napi_disable(napi); + netif_napi_del(napi); mana_destroy_wq_obj(apc, GDMA_RQ, rxq->rxobj); @@ -1418,7 +1434,6 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, /* Create RQ's CQ */ cq = &rxq->rx_cq; - cq->gdma_comp_buf = eq->cqe_poll; cq->type = MANA_CQ_TYPE_RX; cq->rxq = rxq; @@ -1426,7 +1441,7 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, spec.type = GDMA_CQ; spec.monitor_avl_buf = false; spec.queue_size = cq_size; - spec.cq.callback = mana_cq_handler; + spec.cq.callback = mana_schedule_napi; spec.cq.parent_eq = eq->eq; spec.cq.context = cq; err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq); @@ -1466,7 +1481,10 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, gc->cq_table[cq->gdma_id] = cq->gdma_cq; - mana_gd_arm_cq(cq->gdma_cq); + netif_napi_add(ndev, &cq->napi, mana_poll, 1); + napi_enable(&cq->napi); + + mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); out: if (!err) return rxq; From patchwork Thu Oct 21 12:23:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544350 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=IS8kA/Ko; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmsR6nl7z9sRR for ; Thu, 21 Oct 2021 23:25:31 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX8O-0003bu-15; Thu, 21 Oct 2021 12:25:24 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7W-00031E-IX for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:30 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 5ABB63FFF3 for ; Thu, 21 Oct 2021 12:24:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819068; bh=xTt9R5meQgT3do0M9jhdfjBQ6aPn0ngH3rTQ191y8a0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=IS8kA/Ko3q+vcfdpKGZ7FsaIpK56CRpztQiOqfvW94K0saOQ8YMt7LJOAWtNRjpGQ mvz4qa5l2estfrKKq0kn4Ro36nBMu4pOT/jeSOq4YyYXQKQtdO8hvKHsV+MBEZ/M12 tQOQB+MpfoH/qyXV32hGslCkr004CiOI9fwQEHmXsYiMyuRWLYDfYQQLMhj6C9PcNW fTcbLXizZWqzYm+HZJO/FmMpo5XUO0aLPO99tnSvozQXGEVaZdeymNJRLiwRviebHo 0M/mDh7bddgOxZQOP55Bt3oLWdHrrVNJEATtEaL/vU30D1FRWN7kDs/mfHiXihEpE0 vRrupCOa1NCNw== Received: by mail-pf1-f200.google.com with SMTP id v13-20020a056a00148d00b0044ccf66dbd1so333756pfu.4 for ; Thu, 21 Oct 2021 05:24:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xTt9R5meQgT3do0M9jhdfjBQ6aPn0ngH3rTQ191y8a0=; b=YwmWl9Yo2vkSXzi3uRrbzpZ3p9nhRrhlajI1O6bsFPjMaxOia8LKxNjuTM/TS6i2es fQ7VYKjGH+VQcZQ4IVl9vWVfX7aGWwkzhHJiW2Mq7ciE4wQcW71PvOJgPgudyrU41uNY e39AnPKH8+XPGC7x1bmHN3k+dXmBb3/ejzuUPKEzIu7vPs2cBOiOCtLBczxNzgPNxCiX dP+EBWON6JeythnSuoEFY5sQw1LXKb9NydhGLpDrfqNRgXXRWYV1T0Y61kSfsv0Jf4dH kGYW7ccnRk9rP8m/YzR06Ypczx+qNfZzT5A6fQQM/pmli95CPH6OCbol+pbPjOqWdnvS v1Fg== X-Gm-Message-State: AOAM530JAiVAr+Q1QqaSW7gJ1H5WUNLf2pxkpT2CosaeamsBDS1lzzCF 8nTy4fTYlfiagibnGsx3NUKjutV3WuuzT98q0yRWNV/Cq//Ga7zydH8JZ50eptowYhbwGg/V69Q milyceILMpVvLHO6X7v1twuFrZXGDti0Q+FVHc+lEqA== X-Received: by 2002:a17:902:e741:b0:13f:f585:53ab with SMTP id p1-20020a170902e74100b0013ff58553abmr3709675plf.48.1634819066651; Thu, 21 Oct 2021 05:24:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzac4JyvNc4gl8qP6DHSTvzkqf6H03wFxjZ4tbBoollkm+WJGpb2nq62oLNgxOeaA0c7gOUeQ== X-Received: by 2002:a17:902:e741:b0:13f:f585:53ab with SMTP id p1-20020a170902e74100b0013ff58553abmr3709644plf.48.1634819066295; Thu, 21 Oct 2021 05:24:26 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:25 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 10/13][Hirsute/linux-azure] net: mana: Add support for EQ sharing Date: Thu, 21 Oct 2021 06:23:51 -0600 Message-Id: <20211021122400.10390-18-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 The existing code uses (1 + #vPorts * #Queues) MSIXs, which may exceed the device limit. Support EQ sharing, so that multiple vPorts (NICs) can share the same set of MSIXs. And, report the EQ-sharing capability bit to the host, which means the host can potentially offer more vPorts and queues to the VM. Also update the resource limit checking and error handling for better robustness. Now, we support up to 256 virtual ports per VF (it was 16/VF), and support up to 64 queues per vPort (it was 16). Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit 1e2d0824a9c3de5371a46601aac0c14af5c0a50a) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/gdma.h | 23 ++++--- .../net/ethernet/microsoft/mana/gdma_main.c | 31 +++++++--- drivers/net/ethernet/microsoft/mana/mana.h | 18 +++--- drivers/net/ethernet/microsoft/mana/mana_en.c | 62 +++++++++---------- 4 files changed, 78 insertions(+), 56 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma.h b/drivers/net/ethernet/microsoft/mana/gdma.h index ddbca64bab07..41ecd156e95f 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma.h +++ b/drivers/net/ethernet/microsoft/mana/gdma.h @@ -312,9 +312,6 @@ struct gdma_queue_spec { void *context; unsigned long log2_throttle_limit; - - /* Only used by the MANA device. */ - struct net_device *ndev; } eq; struct { @@ -489,16 +486,28 @@ enum { GDMA_PROTOCOL_LAST = GDMA_PROTOCOL_V1, }; +#define GDMA_DRV_CAP_FLAG_1_EQ_SHARING_MULTI_VPORT BIT(0) + +#define GDMA_DRV_CAP_FLAGS1 GDMA_DRV_CAP_FLAG_1_EQ_SHARING_MULTI_VPORT + +#define GDMA_DRV_CAP_FLAGS2 0 + +#define GDMA_DRV_CAP_FLAGS3 0 + +#define GDMA_DRV_CAP_FLAGS4 0 + struct gdma_verify_ver_req { struct gdma_req_hdr hdr; /* Mandatory fields required for protocol establishment */ u64 protocol_ver_min; u64 protocol_ver_max; - u64 drv_cap_flags1; - u64 drv_cap_flags2; - u64 drv_cap_flags3; - u64 drv_cap_flags4; + + /* Gdma Driver Capability Flags */ + u64 gd_drv_cap_flags1; + u64 gd_drv_cap_flags2; + u64 gd_drv_cap_flags3; + u64 gd_drv_cap_flags4; /* Advisory fields */ u64 drv_ver; diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 560472fa2d00..798099d64202 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -67,6 +67,10 @@ static int mana_gd_query_max_resources(struct pci_dev *pdev) if (gc->max_num_queues > resp.max_rq) gc->max_num_queues = resp.max_rq; + /* The Hardware Channel (HWC) used 1 MSI-X */ + if (gc->max_num_queues > gc->num_msix_usable - 1) + gc->max_num_queues = gc->num_msix_usable - 1; + return 0; } @@ -384,28 +388,31 @@ static int mana_gd_register_irq(struct gdma_queue *queue, struct gdma_resource *r; unsigned int msi_index; unsigned long flags; - int err; + struct device *dev; + int err = 0; gc = gd->gdma_context; r = &gc->msix_resource; + dev = gc->dev; spin_lock_irqsave(&r->lock, flags); msi_index = find_first_zero_bit(r->map, r->size); - if (msi_index >= r->size) { + if (msi_index >= r->size || msi_index >= gc->num_msix_usable) { err = -ENOSPC; } else { bitmap_set(r->map, msi_index, 1); queue->eq.msix_index = msi_index; - err = 0; } spin_unlock_irqrestore(&r->lock, flags); - if (err) - return err; + if (err) { + dev_err(dev, "Register IRQ err:%d, msi:%u rsize:%u, nMSI:%u", + err, msi_index, r->size, gc->num_msix_usable); - WARN_ON(msi_index >= gc->num_msix_usable); + return err; + } gic = &gc->irq_contexts[msi_index]; @@ -836,6 +843,11 @@ int mana_gd_verify_vf_version(struct pci_dev *pdev) req.protocol_ver_min = GDMA_PROTOCOL_FIRST; req.protocol_ver_max = GDMA_PROTOCOL_LAST; + req.gd_drv_cap_flags1 = GDMA_DRV_CAP_FLAGS1; + req.gd_drv_cap_flags2 = GDMA_DRV_CAP_FLAGS2; + req.gd_drv_cap_flags3 = GDMA_DRV_CAP_FLAGS3; + req.gd_drv_cap_flags4 = GDMA_DRV_CAP_FLAGS4; + err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); if (err || resp.hdr.status) { dev_err(gc->dev, "VfVerifyVersionOutput: %d, status=0x%x\n", @@ -1154,10 +1166,8 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev) if (max_queues_per_port > MANA_MAX_NUM_QUEUES) max_queues_per_port = MANA_MAX_NUM_QUEUES; - max_irqs = max_queues_per_port * MAX_PORTS_IN_MANA_DEV; - /* Need 1 interrupt for the Hardware communication Channel (HWC) */ - max_irqs++; + max_irqs = max_queues_per_port + 1; nvec = pci_alloc_irq_vectors(pdev, 2, max_irqs, PCI_IRQ_MSIX); if (nvec < 0) @@ -1244,6 +1254,9 @@ static int mana_gd_probe(struct pci_dev *pdev, const struct pci_device_id *ent) int bar = 0; int err; + /* Each port has 2 CQs, each CQ has at most 1 EQE at a time */ + BUILD_BUG_ON(2 * MAX_PORTS_IN_MANA_DEV * GDMA_EQE_SIZE > EQ_SIZE); + err = pci_enable_device(pdev); if (err) return -ENXIO; diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index 5341dbdb726e..fc98a5ba5ed0 100644 --- a/drivers/net/ethernet/microsoft/mana/mana.h +++ b/drivers/net/ethernet/microsoft/mana/mana.h @@ -46,7 +46,7 @@ enum TRI_STATE { #define EQ_SIZE (8 * PAGE_SIZE) #define LOG2_EQ_THROTTLE 3 -#define MAX_PORTS_IN_MANA_DEV 16 +#define MAX_PORTS_IN_MANA_DEV 256 struct mana_stats { u64 packets; @@ -322,6 +322,8 @@ struct mana_context { u16 num_ports; + struct mana_eq *eqs; + struct net_device *ports[MAX_PORTS_IN_MANA_DEV]; }; @@ -331,8 +333,6 @@ struct mana_port_context { u8 mac_addr[ETH_ALEN]; - struct mana_eq *eqs; - enum TRI_STATE rss_state; mana_handle_t default_rxobj; @@ -402,11 +402,11 @@ enum mana_command_code { struct mana_query_device_cfg_req { struct gdma_req_hdr hdr; - /* Driver Capability flags */ - u64 drv_cap_flags1; - u64 drv_cap_flags2; - u64 drv_cap_flags3; - u64 drv_cap_flags4; + /* MANA Nic Driver Capability flags */ + u64 mn_drv_cap_flags1; + u64 mn_drv_cap_flags2; + u64 mn_drv_cap_flags3; + u64 mn_drv_cap_flags4; u32 proto_major_ver; u32 proto_minor_ver; @@ -523,7 +523,7 @@ struct mana_cfg_rx_steer_resp { struct gdma_resp_hdr hdr; }; /* HW DATA */ -#define MANA_MAX_NUM_QUEUES 16 +#define MANA_MAX_NUM_QUEUES 64 #define MANA_SHORT_VPORT_OFFSET_MAX ((1U << 8) - 1) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index cdef4d730a0e..1b21030308e5 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -696,56 +696,56 @@ static void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type, resp.hdr.status); } -static void mana_destroy_eq(struct gdma_context *gc, - struct mana_port_context *apc) +static void mana_destroy_eq(struct mana_context *ac) { + struct gdma_context *gc = ac->gdma_dev->gdma_context; struct gdma_queue *eq; int i; - if (!apc->eqs) + if (!ac->eqs) return; - for (i = 0; i < apc->num_queues; i++) { - eq = apc->eqs[i].eq; + for (i = 0; i < gc->max_num_queues; i++) { + eq = ac->eqs[i].eq; if (!eq) continue; mana_gd_destroy_queue(gc, eq); } - kfree(apc->eqs); - apc->eqs = NULL; + kfree(ac->eqs); + ac->eqs = NULL; } -static int mana_create_eq(struct mana_port_context *apc) +static int mana_create_eq(struct mana_context *ac) { - struct gdma_dev *gd = apc->ac->gdma_dev; + struct gdma_dev *gd = ac->gdma_dev; + struct gdma_context *gc = gd->gdma_context; struct gdma_queue_spec spec = {}; int err; int i; - apc->eqs = kcalloc(apc->num_queues, sizeof(struct mana_eq), - GFP_KERNEL); - if (!apc->eqs) + ac->eqs = kcalloc(gc->max_num_queues, sizeof(struct mana_eq), + GFP_KERNEL); + if (!ac->eqs) return -ENOMEM; spec.type = GDMA_EQ; spec.monitor_avl_buf = false; spec.queue_size = EQ_SIZE; spec.eq.callback = NULL; - spec.eq.context = apc->eqs; + spec.eq.context = ac->eqs; spec.eq.log2_throttle_limit = LOG2_EQ_THROTTLE; - spec.eq.ndev = apc->ndev; - for (i = 0; i < apc->num_queues; i++) { - err = mana_gd_create_mana_eq(gd, &spec, &apc->eqs[i].eq); + for (i = 0; i < gc->max_num_queues; i++) { + err = mana_gd_create_mana_eq(gd, &spec, &ac->eqs[i].eq); if (err) goto out; } return 0; out: - mana_destroy_eq(gd->gdma_context, apc); + mana_destroy_eq(ac); return err; } @@ -1157,7 +1157,8 @@ static void mana_destroy_txq(struct mana_port_context *apc) static int mana_create_txq(struct mana_port_context *apc, struct net_device *net) { - struct gdma_dev *gd = apc->ac->gdma_dev; + struct mana_context *ac = apc->ac; + struct gdma_dev *gd = ac->gdma_dev; struct mana_obj_spec wq_spec; struct mana_obj_spec cq_spec; struct gdma_queue_spec spec; @@ -1218,7 +1219,7 @@ static int mana_create_txq(struct mana_port_context *apc, spec.monitor_avl_buf = false; spec.queue_size = cq_size; spec.cq.callback = mana_schedule_napi; - spec.cq.parent_eq = apc->eqs[i].eq; + spec.cq.parent_eq = ac->eqs[i].eq; spec.cq.context = cq; err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq); if (err) @@ -1502,12 +1503,13 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, static int mana_add_rx_queues(struct mana_port_context *apc, struct net_device *ndev) { + struct mana_context *ac = apc->ac; struct mana_rxq *rxq; int err = 0; int i; for (i = 0; i < apc->num_queues; i++) { - rxq = mana_create_rxq(apc, i, &apc->eqs[i], ndev); + rxq = mana_create_rxq(apc, i, &ac->eqs[i], ndev); if (!rxq) { err = -ENOMEM; goto out; @@ -1619,16 +1621,11 @@ static int mana_init_port(struct net_device *ndev) int mana_alloc_queues(struct net_device *ndev) { struct mana_port_context *apc = netdev_priv(ndev); - struct gdma_dev *gd = apc->ac->gdma_dev; int err; - err = mana_create_eq(apc); - if (err) - return err; - err = mana_create_vport(apc, ndev); if (err) - goto destroy_eq; + return err; err = netif_set_real_num_tx_queues(ndev, apc->num_queues); if (err) @@ -1654,8 +1651,6 @@ int mana_alloc_queues(struct net_device *ndev) destroy_vport: mana_destroy_vport(apc); -destroy_eq: - mana_destroy_eq(gd->gdma_context, apc); return err; } @@ -1732,8 +1727,6 @@ static int mana_dealloc_queues(struct net_device *ndev) mana_destroy_vport(apc); - mana_destroy_eq(apc->ac->gdma_dev->gdma_context, apc); - return 0; } @@ -1786,7 +1779,7 @@ static int mana_probe_port(struct mana_context *ac, int port_idx, apc->ac = ac; apc->ndev = ndev; apc->max_queues = gc->max_num_queues; - apc->num_queues = min_t(uint, gc->max_num_queues, MANA_MAX_NUM_QUEUES); + apc->num_queues = gc->max_num_queues; apc->port_handle = INVALID_MANA_HANDLE; apc->port_idx = port_idx; @@ -1857,6 +1850,10 @@ int mana_probe(struct gdma_dev *gd) ac->num_ports = 1; gd->driver_data = ac; + err = mana_create_eq(ac); + if (err) + goto out; + err = mana_query_device_cfg(ac, MANA_MAJOR_VERSION, MANA_MINOR_VERSION, MANA_MICRO_VERSION, &ac->num_ports); if (err) @@ -1906,6 +1903,9 @@ void mana_remove(struct gdma_dev *gd) free_netdev(ndev); } + + mana_destroy_eq(ac); + out: mana_gd_deregister_device(gd); gd->driver_data = NULL; From patchwork Thu Oct 21 12:23:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544353 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=fRY7/FbA; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZmsT2dltz9sWJ for ; Thu, 21 Oct 2021 23:25:33 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX8O-0003cw-SG; Thu, 21 Oct 2021 12:25:24 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7X-00031e-8b for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:31 +0000 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 107FE3FFF4 for ; Thu, 21 Oct 2021 12:24:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819069; bh=EiS0ckLifI2V0ilCMYlLpRvH5bd9a/njON4LfIMqoC0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fRY7/FbAZP28ZvHqHclGsF+WfuE0dONv/i7hOGwts3ANZJdldY2vtB3ceQnJfmPq3 lGB9bChbVnrEGmU1GvDAEW/M1rTp+wJnCCt3m2VDY+HjoRvr4/RBpE+4znV4gMJMQi sgVf64Pa8enDnMRmQ2XOKi+r11UrpNFaq3bkgaTGZXOaXit3POw8xCFHu+Wc2msWUk QFyuunsh+CMvH1HYoQ/FlcJ8iM+X0ZWh2r5WpcGQr7zfVXDCGaNBG34hOu8G57J7oL tMY/ejjKXvEsF8JAxq9B0lfihyL4nnOCmVSGlByBS717stddBqH/0RkHI9fAvw/H2v SvfAspuF9iOTA== Received: by mail-pg1-f198.google.com with SMTP id b6-20020a631b46000000b0029a054d00f3so56715pgm.17 for ; Thu, 21 Oct 2021 05:24:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EiS0ckLifI2V0ilCMYlLpRvH5bd9a/njON4LfIMqoC0=; b=Hj3MjXRllsEvgpEiVDdTXE5T52z6+K1DkYjCHnMnU3J5YLhdhF359W7DCJwGj4zi19 Ar28WJKhEGRX64IJaO16Ku3aGAgtdONMEdg9XI14gOBXq3SW1ev/bO0x/oorWRDPNx8e maC9ja3GMDozJo5r3gRDCjXa3nZAnn2GnPPqeISpjlx3LAz6ubINITxtqOUpieS8K7JX UUN+1P/lTKrXnKSFejJaD7ZERkR7V2NrnX70q1Z9E5YYzaRC1aMHRlZEHZ180wwF0v3H KlZLDyRf56jxBP6DCnv06Qzxh/GlnRU3Be78QGm+K4gcgtk3zxscwBjcZN1Hh0h6Xv8a NZaw== X-Gm-Message-State: AOAM532TGDEzJ7tX3KZtyeR90Z7Xo47NuzN3eoThgw6WynlLUZnee5Wv uJtjVCnrBYp99mvgMnbGDScQgUW5JdrfyWBH9PWH6dcKjlIvGuWIKdNw6M2JQrZoRm0YQMKvyyf BQa9ithl14UPIajSYbk9yViMQSNHCAxaXUyUhl5xwsA== X-Received: by 2002:a17:902:9882:b0:13e:1749:daae with SMTP id s2-20020a170902988200b0013e1749daaemr5003512plp.60.1634819067445; Thu, 21 Oct 2021 05:24:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJynhiiqI4s+d6nvQVWTgaKXE3Y2bgaote8MDvIehTWyc+sQvfFlR2JCEqSL7zRlVIG6HiMJHQ== X-Received: by 2002:a17:902:9882:b0:13e:1749:daae with SMTP id s2-20020a170902988200b0013e1749daaemr5003493plp.60.1634819067218; Thu, 21 Oct 2021 05:24:27 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:26 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 11/13][Hirsute/linux-azure] net: mana: Add WARN_ON_ONCE in case of CQE read overflow Date: Thu, 21 Oct 2021 06:23:52 -0600 Message-Id: <20211021122400.10390-19-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 This is not an expected case normally. Add WARN_ON_ONCE in case of CQE read overflow, instead of failing silently. Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit c1a3e9f98dde4782290d2c4871e42b7e76ad5593) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/gdma_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 798099d64202..cee75b561f59 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -1093,7 +1093,7 @@ static int mana_gd_read_cqe(struct gdma_queue *cq, struct gdma_comp *comp) new_bits = (cq->head / num_cqe) & GDMA_CQE_OWNER_MASK; /* Return -1 if overflow detected. */ - if (owner_bits != new_bits) + if (WARN_ON_ONCE(owner_bits != new_bits)) return -1; comp->wq_num = cqe->cqe_info.wq_num; From patchwork Thu Oct 21 12:23:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544345 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=STNrOF9K; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZms56mjBz9sRR for ; Thu, 21 Oct 2021 23:25:13 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX81-0003Lh-5d; Thu, 21 Oct 2021 12:25:01 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7Y-00032P-5f for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:32 +0000 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 4104540010 for ; Thu, 21 Oct 2021 12:24:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819070; bh=Vnw7kcauV0S5hnuvWcBcYv8oGR3/p9ihJzAPuo1jXHw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=STNrOF9KnFRFJ7EbC6qlGa00ZdRq4sEYPa+H+VN4ZE3wZh0Di7h+hIKxYktK2BtbM ustmPoYbvVRc4yF8XygWsM14hUq4jADE6Hg/7MkFe/xgDvba4QYa4bJsp+ox5w+cRc Rp03amUR/5azT06sDZRCjy2qkS2wCD8xflW57qoSCDKNEURr8R6ggbJgThAp5FnrXD qBgllzsldgEMsSCNfMwsrKgk3CO8oZhFblXkeEop9pAxgNNmqIGE5d690KuAiShk3u +ntyXwVEFeyn3IS+KTzgmyk+zDE28GBYGI5NKhaQF8hBNMUbD+zXhFdz3sa+YoClXw zAg/jz/rL2YWg== Received: by mail-pl1-f200.google.com with SMTP id i3-20020a170902eb4300b0013f5d8f38d8so121582pli.9 for ; Thu, 21 Oct 2021 05:24:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Vnw7kcauV0S5hnuvWcBcYv8oGR3/p9ihJzAPuo1jXHw=; b=VxnHx5EiulRuBsc27GatXoFo9nombfbLbYvF3Ec8L1uErvG98brlk6baApW5bn6abq cLigxZzYhhfae+zlZv5eT0ZJUmttgRGJ41kcml9y/VHudQXHM2eKpXgh3T4bPVBrES+y Mmfi93J2ot3c3DFA/rxYocAGqwR8AVt0hvmrbh+nRjsqf1hsTepRHrZL5bKlhpI6N75W maBxA6AtotXtvjaAEVY7DV7d8x0BSLi61s5hLcibyHweA0GxOiB0oVAVOjGYZcj+huZ9 4zIClh9YEZA6fq8w4MmKmj8t+ylatKe7rZdJ2UVv0aZLnMcjZDaPmxgQT3RqDNtsqJny mpOw== X-Gm-Message-State: AOAM531nXa9h+9s0Hui4bqxSbxY7ft5UkxK9RpEoZQ+9GMBVS3QySwyr wSKmh+0eqq4zopkdE+uQ4ezmu4cJG5FX2U7nas7Q+cfyTvzrziGv4MoG60McKYHV8zHZ+E+bJqv F9OldHysZgqHHSKD2JGCXhe36RbSHPcl8cUsM4bQTuw== X-Received: by 2002:a17:902:9303:b029:12c:29c:43f9 with SMTP id bc3-20020a1709029303b029012c029c43f9mr4913012plb.5.1634819068526; Thu, 21 Oct 2021 05:24:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJytvBw8vuepYUupGL3ckWV1QAoANczt+bYb1bhySJCJ2RfzIWeVrJtDzRA9a9zXwsOI+NWhwA== X-Received: by 2002:a17:902:9303:b029:12c:29c:43f9 with SMTP id bc3-20020a1709029303b029012c029c43f9mr4912983plb.5.1634819068226; Thu, 21 Oct 2021 05:24:28 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:27 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 12/13][Hirsute/linux-azure] net: mana: Prefer struct_size over open coded arithmetic Date: Thu, 21 Oct 2021 06:23:53 -0600 Message-Id: <20211021122400.10390-20-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Len Baker BugLink: https://bugs.launchpad.net/bugs/1947859 As noted in the "Deprecated Interfaces, Language Features, Attributes, and Conventions" documentation [1], size calculations (especially multiplication) should not be performed in memory allocator (or similar) function arguments due to the risk of them overflowing. This could lead to values wrapping around and a smaller allocation being made than the caller was expecting. Using those allocations could lead to linear overflows of heap memory and other misbehaviors. So, use the struct_size() helper to do the arithmetic instead of the argument "size + count * size" in the kzalloc() function. [1] https://www.kernel.org/doc/html/v5.14/process/deprecated.html#open-coded-arithmetic-in-allocator-arguments Signed-off-by: Len Baker Reviewed-by: Haiyang Zhang Signed-off-by: David S. Miller (cherry picked from commit f11ee2ad25b22c2ee587045dd6999434375532f7) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/hw_channel.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net/ethernet/microsoft/mana/hw_channel.c index c1310ea1c216..d5c485a6d284 100644 --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c @@ -398,9 +398,7 @@ static int mana_hwc_alloc_dma_buf(struct hw_channel_context *hwc, u16 q_depth, int err; u16 i; - dma_buf = kzalloc(sizeof(*dma_buf) + - q_depth * sizeof(struct hwc_work_request), - GFP_KERNEL); + dma_buf = kzalloc(struct_size(dma_buf, reqs, q_depth), GFP_KERNEL); if (!dma_buf) return -ENOMEM; From patchwork Thu Oct 21 12:23:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 1544346 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=XbRETI16; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HZms93gD5z9sRR for ; Thu, 21 Oct 2021 23:25:17 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1mdX87-0003Pm-F0; Thu, 21 Oct 2021 12:25:07 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1mdX7Y-00033Z-V3 for kernel-team@lists.ubuntu.com; Thu, 21 Oct 2021 12:24:33 +0000 Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id B8D123FFF3 for ; Thu, 21 Oct 2021 12:24:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1634819071; bh=5Ehx4LQn/2oE81Bk3u8nw7hXVRL2CL8e0hXVe55Xt8Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XbRETI167z20MINMjxNR0C5Ro6Xee90W7mSMqYSZ7ZYz1zyWLlZBCOTEjsWAkjhge oGqyUuO4RRcdN5pJjMxPaD7z0046i2b6gwvrH2S0rxbnzJ7ko9WHXm+EHwFRZV+get O6qQNQ2lhxJFVBb+jNHVIHVSpV62FmTECeUXfSe5XlTdjYze6o1SGJ1ripY5Aqt9Vh pNbNgAIOmXz/DI5lFi947xYBDC4/DIXcL4GQs3rVwTUQIBbw7KSkuBYPYq3sOdfL6S 1Uy+2HL0L4B/aHqgtYBa2JojOFDbY2P7NDch1r61sAbOW6k8yU+aPyjKGsoMzVucO0 klJF+5TxdYyNA== Received: by mail-pj1-f71.google.com with SMTP id n2-20020a17090a2fc200b001a1bafb59bfso305364pjm.1 for ; Thu, 21 Oct 2021 05:24:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5Ehx4LQn/2oE81Bk3u8nw7hXVRL2CL8e0hXVe55Xt8Y=; b=pzQNMFgZleK/Jer+wKe65B04kTY1QFESqNDU9EJ66m2lvki+XgM1qIjzaUrjEiXCeO QYSr8r6+/jROg8bAtG/p1Z/7GuM04jmDfnYdayeGFdn/CvAWhBepwEjNcDVVu0eWtLYy 4pNKkw+GCXHmj+XkNgelASQ1XKKZ7djHmwbfPXMyqu6SUBP7JngGNNNMYs3yu8NnaxRq G5q7HfU2hd9ASn1u0Rn7UQqG6pKcn3tllvN5MvMZJdwRIvu6G9kYCZbe8xqmwCKrlw+l FV/Dshc3R+eeNZ9B1wJaYCol5/VYWQvPWld9hul0jBpY0yvyKNs1TX2BzeGjEVnR4t9E QBfQ== X-Gm-Message-State: AOAM530x9t5Zrz52atqI0668jydyjAjxpiSGcQDau1ZGAk1WCQNwBGJX zi3j6SkYuTqjt/4m/eIaE34ZzUewneX6hdGASpXwpraxfyZfdNIs39bCEbOub5LjOtEqeqmaRxx x9TO+5DfCbJUuRD+kezzG3V+jklhWgwsgeFfSd1jGTw== X-Received: by 2002:a63:b94b:: with SMTP id v11mr4231662pgo.145.1634819069929; Thu, 21 Oct 2021 05:24:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxL9CjFqDFuFkifm+1y+PDJjclWILxS8V2hN4IX1SmIFP0ebV6j8hGr346JUPeRj1luLh5nnA== X-Received: by 2002:a63:b94b:: with SMTP id v11mr4231645pgo.145.1634819069569; Thu, 21 Oct 2021 05:24:29 -0700 (PDT) Received: from localhost.localdomain ([69.163.84.166]) by smtp.gmail.com with ESMTPSA id g25sm5192869pge.12.2021.10.21.05.24.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 05:24:28 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 13/13][Hirsute/linux-azure] net: mana: Fix error handling in mana_create_rxq() Date: Thu, 21 Oct 2021 06:23:54 -0600 Message-Id: <20211021122400.10390-21-tim.gardner@canonical.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211021122400.10390-1-tim.gardner@canonical.com> References: <20211021122400.10390-1-tim.gardner@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Haiyang Zhang BugLink: https://bugs.launchpad.net/bugs/1947859 Fix error handling in mana_create_rxq() when cq->gdma_id >= gc->max_num_cqs. Fixes: ca9c54d2d6a5 ("net: mana: Add a driver for Microsoft Azure Network Adapter (MANA)") Signed-off-by: Haiyang Zhang Link: https://lore.kernel.org/r/1633698691-31721-1-git-send-email-haiyangz@microsoft.com Signed-off-by: Jakub Kicinski (cherry picked from commit be0499369d6376e70b5b80bbced94c0c32d508b1) Signed-off-by: Tim Gardner --- drivers/net/ethernet/microsoft/mana/mana_en.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 1b21030308e5..030ae89f3a33 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1477,8 +1477,10 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc, if (err) goto out; - if (cq->gdma_id >= gc->max_num_cqs) + if (WARN_ON(cq->gdma_id >= gc->max_num_cqs)) { + err = -EINVAL; goto out; + } gc->cq_table[cq->gdma_id] = cq->gdma_cq;