Received: by 2002:a05:7208:b08c:b0:82:bbfa:f723 with SMTP id c12csp409633rbb; Fri, 26 Apr 2024 07:44:48 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUx/4FWDYSIFuPuJ50O3TTdkt20unfg5dhYaPTO/bXRl/t5YR8/89oEDOC5LJCPb6uHZ0lxYSdebTRAbNO8TLTOcjYFMtnly/2NI7BHJQ== X-Google-Smtp-Source: AGHT+IF6g5wnBlThWRIoXzZd5FlzrhXHJDXXAln7glszFIacOs87twz93xNMa617Asw5M7nROFWI X-Received: by 2002:a05:6122:480e:b0:4da:c46e:1be6 with SMTP id ef14-20020a056122480e00b004dac46e1be6mr5318559vkb.6.1714142688111; Fri, 26 Apr 2024 07:44:48 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1714142688; cv=pass; d=google.com; s=arc-20160816; b=kkNWhcHjhuzpFRDgS12QcJc18QlD40Nzsl3vlUaVJfLNsjVoM31erpk6PQCR4R96ev kB7GRV8hFXYmTGmQRmR1ZUYPubbHFe3tjOiXYVVmY/axCScl4FozyxfQjpUAFXluZBXS wocWeo/vayZDkJyfhY5QTqqCeqdLL8VV2+yqfASGqhreBBOGlkLqlYVoPsYTSOgzN7r+ D0zEUCQFMrXXZF6tXF7baDuzFRQVnF0xLnKGAgp+zv2jfD6JB+q17oOu1+KRfXsu1Jau trGvBfnn+nqLp9xQUNGP3kgSBhU8wo2ve16JUL6OuC8JeXLDwZs2iSwfxUSQAt/3/qGl ha3Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=xuq3eFnW4wuBkZ3mDODNgP4BiQjcXktdda7scHooKGY=; fh=+3MeNUxO4mCegJiC67e7CWBm1RFm77nYTahGOuhpZ4M=; b=JMHkect9oGnRimxdAxDLVtfRtAZcz0tg5J9wru8CIQ1a8+F67Dd2505VH7IlBi55HM NFbuvfutzlOiMd9unb3PE3QT2lsz70Ky6tfos3qEJlvRiVdpw9t+Yj7jkVVn/ruouMvr G6sGM3Uy49CYgQjuFAPJqpi9bgrlkHBR0C28+UPguNxBNtV/M/wPp7YC/uaBb3YlE2qN 5hD11Y6M8Yp0qssyenoVucZs7zL5ZZ5BqURVWBXmFIEzHevSg4LpEkHVC5A7z3tQ6afv QtOVXphnN4dZI5M5FeSL6+3Z1Nnbd7KbK/ygSCQiYpTW2TigMCzgm5igxgbh2bKB3+TN 21xw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=QxHf3Tve; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-160177-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-160177-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id ba33-20020a056130042100b007efb09205d0si251222uab.137.2024.04.26.07.44.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Apr 2024 07:44:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-160177-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=QxHf3Tve; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-160177-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-160177-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id B75761C214C8 for ; Fri, 26 Apr 2024 14:44:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 93FA4148832; Fri, 26 Apr 2024 14:44:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="QxHf3Tve" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78FC634CD8; Fri, 26 Apr 2024 14:44:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714142678; cv=none; b=R71xR2lrSCCxFVfqsVFLIz/EYyx9sfrcKLdbWVJB5/D7R/46U6OrgmUyCpUORIxvLQBg+Gk2uMJtdG3PIflKvw/MydKPaiJWKiHqRpyHhMcUnepGjTwEBH8ujtpWsCUDtZIQlO7SwC/ZEH/FA2acc0IUlN2ZiT+YGbPfB3ZTPrM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714142678; c=relaxed/simple; bh=c0dO8Re1PPSOl6/PX/WShnH30RI1DTXQ2uGy1lx3ZGY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=sj9SO98A11SLfDxndMicwYessahSdIcak3aZ5+8csxlLEqN9Q8yBcEkW1Noh8dWoiAEsKNHIoTku9S7Fp9/H1xCujWHVA3ws6jNkmcOHSBuFUUpKJS7NrbVttHtwWllFUdLjugsu8nA5tWthcKT7esv+1oyxdVUYDf2AHbuuLE8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=QxHf3Tve; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1714142677; x=1745678677; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=c0dO8Re1PPSOl6/PX/WShnH30RI1DTXQ2uGy1lx3ZGY=; b=QxHf3TveYWXhXkZs6VpVLsMZ8hCHVNxNzGmRuJ5SDkv5NciWWk45Xut0 US/KD4LApuDQ8VbilrbLhbvyx90hJVP/3oOByjv7yEYMouKaBQPT5TBBa vvOE4CS6cIrkxawuG02Lab7kQwHeNIsrXEcOgncH+sowT8eyQgIF0fEWG rPP7XGDToKC0mBblX7WyAxnglr1ePH6KsQ6LPNr9OlapAUHwkPVWb4kgG ZTzGcp40dhhaFENcFdFrO4r35g5vTDrWkxv4Cgue8YcEooaTSwsuo6OCT NoRiNHUGvjm4MrRnNnjb4ktGAg2oh+5IetB1d8jMTdwEhxUiVYGCOkxaq w==; X-CSE-ConnectionGUID: XwGv4Kq3Q5CZcv5SOntvgw== X-CSE-MsgGUID: RLTt0K/iQze6EvHxFRUytw== X-IronPort-AV: E=McAfee;i="6600,9927,11056"; a="21027171" X-IronPort-AV: E=Sophos;i="6.07,232,1708416000"; d="scan'208";a="21027171" Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Apr 2024 07:44:36 -0700 X-CSE-ConnectionGUID: TSpeNl3CRVa+TG14ajS9gA== X-CSE-MsgGUID: lRRvpSkZQn6dyH8QEoaxqg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,232,1708416000"; d="scan'208";a="25441219" Received: from newjersey.igk.intel.com ([10.102.20.203]) by fmviesa007.fm.intel.com with ESMTP; 26 Apr 2024 07:44:33 -0700 From: Alexander Lobakin To: intel-wired-lan@lists.osuosl.org Cc: Alexander Lobakin , Michal Kubiak , Wojciech Drewek , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , nex.sw.ncis.osdt.itp.upstreaming@intel.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH iwl] idpf: don't enable NAPI and interrupts prior to allocating Rx buffers Date: Fri, 26 Apr 2024 16:44:08 +0200 Message-ID: <20240426144408.1353962-1-aleksander.lobakin@intel.com> X-Mailer: git-send-email 2.44.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Currently, idpf enables NAPI and interrupts prior to allocating Rx buffers. This may lead to frame loss (there are no buffers to place incoming frames) and even crashes on quick ifup-ifdown. Interrupts must be enabled only after all the resources are here and available. Split interrupt init into two phases: initialization and enabling, and perform the second only after the queues are fully initialized. Note that we can't just move interrupt initialization down the init process, as the queues must have correct a ::q_vector pointer set and NAPI already added in order to allocate buffers correctly. Also, during the deinit process, disable HW interrupts first and only then disable NAPI. Otherwise, there can be a HW event leading to napi_schedule(), but the NAPI will already be unavailable. Fixes: d4d558718266 ("idpf: initialize interrupts and enable vport") Reported-by: Michal Kubiak Reviewed-by: Wojciech Drewek Signed-off-by: Alexander Lobakin --- drivers/net/ethernet/intel/idpf/idpf_txrx.h | 1 + drivers/net/ethernet/intel/idpf/idpf_lib.c | 1 + drivers/net/ethernet/intel/idpf/idpf_txrx.c | 12 +++++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h index 3d046b81e507..551391e20464 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h @@ -990,6 +990,7 @@ int idpf_vport_intr_alloc(struct idpf_vport *vport); void idpf_vport_intr_update_itr_ena_irq(struct idpf_q_vector *q_vector); void idpf_vport_intr_deinit(struct idpf_vport *vport); int idpf_vport_intr_init(struct idpf_vport *vport); +void idpf_vport_intr_ena(struct idpf_vport *vport); enum pkt_hash_types idpf_ptype_to_htype(const struct idpf_rx_ptype_decoded *decoded); int idpf_config_rss(struct idpf_vport *vport); int idpf_init_rss(struct idpf_vport *vport); diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c b/drivers/net/ethernet/intel/idpf/idpf_lib.c index 5d3532c27d57..ae8a48c48070 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_lib.c +++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c @@ -1394,6 +1394,7 @@ static int idpf_vport_open(struct idpf_vport *vport, bool alloc_res) } idpf_rx_init_buf_tail(vport); + idpf_vport_intr_ena(vport); err = idpf_send_config_queues_msg(vport); if (err) { diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c index 285da2177ee4..b023704bbbda 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c @@ -3746,9 +3746,9 @@ static void idpf_vport_intr_ena_irq_all(struct idpf_vport *vport) */ void idpf_vport_intr_deinit(struct idpf_vport *vport) { + idpf_vport_intr_dis_irq_all(vport); idpf_vport_intr_napi_dis_all(vport); idpf_vport_intr_napi_del_all(vport); - idpf_vport_intr_dis_irq_all(vport); idpf_vport_intr_rel_irq(vport); } @@ -4179,7 +4179,6 @@ int idpf_vport_intr_init(struct idpf_vport *vport) idpf_vport_intr_map_vector_to_qs(vport); idpf_vport_intr_napi_add_all(vport); - idpf_vport_intr_napi_ena_all(vport); err = vport->adapter->dev_ops.reg_ops.intr_reg_init(vport); if (err) @@ -4193,17 +4192,20 @@ int idpf_vport_intr_init(struct idpf_vport *vport) if (err) goto unroll_vectors_alloc; - idpf_vport_intr_ena_irq_all(vport); - return 0; unroll_vectors_alloc: - idpf_vport_intr_napi_dis_all(vport); idpf_vport_intr_napi_del_all(vport); return err; } +void idpf_vport_intr_ena(struct idpf_vport *vport) +{ + idpf_vport_intr_napi_ena_all(vport); + idpf_vport_intr_ena_irq_all(vport); +} + /** * idpf_config_rss - Send virtchnl messages to configure RSS * @vport: virtual port -- 2.44.0