Message ID | 20230609115806.2625564-1-saikrishnag@marvell.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp897626vqr; Fri, 9 Jun 2023 05:10:27 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7q77NDDlnsmWyZ+YqVwIn3/VhWZRMhkUoe8Iea0gvHCc9SqjivhyK7SK7v63sySJiGmLDd X-Received: by 2002:a17:902:7c95:b0:1b0:61b9:bd7a with SMTP id y21-20020a1709027c9500b001b061b9bd7amr763843pll.62.1686312626850; Fri, 09 Jun 2023 05:10:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686312626; cv=none; d=google.com; s=arc-20160816; b=HTY4cqI817J1WVuRLKWXJ0fU7PklRkxJ1YyFuS9Tsl5KvTWhAfKiOFKvy3QxGvs/DH jMj5smmbQeSJ3/eOaxZMNa8L1e00S90wnckPK08JX8u3Y3SMtzIoAiWf+HA2Vq/x960o N1yS17R1+F8PLPiwQvpW6+yWhLBtmiooirCd6fR2yWtaZUr6gHKFTAl8e+H4DeQirExH 4ESFeXNfmOP+iAW8lfsrejeZQyldEFHTCYJFAIOZw6BAGixa/ela0UG91Gc1olTrdPVN f47Uy6NqB0zOPaKYAZ9xaACnqr0GWUR9+Iv3M1NP6bUiv1lG2UeA1lHT2rNqD1zW3aHd B9rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=KYGy8FJirVbuRnOVRPtreeZfJtNYkKc3HOJaujzKkpo=; b=ILw5gpiLxCJXZDZqXnmZ1E0RABnA/feJw0t+4ksLTUXMI2lG2KhCPi1EgwtRyvICRE /MtST49t9lCQyLSV4k2Pbuc6sPMxZ+FBU/fu/31VtDMUOTZFISKcpb42M/cPqnN7XK0H vIiPhHtHk9cqdt9tISufb2vzII7TUOev7HfGKPtchVSmonJ9ALrqLaHqsv0vy0CThwaW L0xBEXZYI/G2figUuTbzveRVQXXIlYWkQc0FxJo56MiJPycZiVegCdEtQvp6SrvzUN6v UVj1AYIx71TJB9EQ+SQuFoePZb+33waVD4LQqQWtKNAMgDXIuLJ/Fj6AZeHisxSMbij8 /+8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@marvell.com header.s=pfpt0220 header.b="FU/7oJwe"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=REJECT dis=NONE) header.from=marvell.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a16-20020a170902b59000b0019ca7a76d68si2594188pls.67.2023.06.09.05.10.11; Fri, 09 Jun 2023 05:10:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@marvell.com header.s=pfpt0220 header.b="FU/7oJwe"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=REJECT dis=NONE) header.from=marvell.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239661AbjFIL6s (ORCPT <rfc822;liningstudo@gmail.com> + 99 others); Fri, 9 Jun 2023 07:58:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239670AbjFIL6n (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 9 Jun 2023 07:58:43 -0400 Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A854235A7; Fri, 9 Jun 2023 04:58:37 -0700 (PDT) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 358NXwkk009064; Fri, 9 Jun 2023 04:58:21 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=KYGy8FJirVbuRnOVRPtreeZfJtNYkKc3HOJaujzKkpo=; b=FU/7oJwebanhVsP8Sab5iEBNJb38AR6TzsKJgEvPBxzdl3FfEy9LsI8NCzLlRTucUjNn LxV2l2G7K62w0hKPtpYcYstPz2AJsSAO2ReGNVSpQqGv6pbjkGF3WNifUDyb5sB6q3hq 5lTIcQXEhsUnRBrNVNY91vCYbT4E6mmF4e/NgjXC95Der5H3y1swD/S0TW4jJ4Gj4xSn ls/Tb1G8KBCmJtzYPhcPUbK+OstLLgZEyTMczVyMpP0JMjNQ4r6S0c9q/FxeeKO/dt45 0H1xz1HKVVF52luj3svdmeSWa2QbBwC4IOMMiiy/6mauB9FU9MT5mrgGq32XZ0rjRM52 Ew== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3r329c78cc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Fri, 09 Jun 2023 04:58:21 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Fri, 9 Jun 2023 04:58:19 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Fri, 9 Jun 2023 04:58:19 -0700 Received: from hyd1425.marvell.com (unknown [10.29.37.83]) by maili.marvell.com (Postfix) with ESMTP id 590313F7057; Fri, 9 Jun 2023 04:58:14 -0700 (PDT) From: Sai Krishna <saikrishnag@marvell.com> To: <davem@davemloft.net>, <edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>, <netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <sgoutham@marvell.com>, <dan.carpenter@linaro.org>, <maciej.fijalkowski@intel.com> CC: Sai Krishna <saikrishnag@marvell.com>, Naveen Mamindlapalli <naveenm@marvell.com> Subject: [net PATCH v2] octeontx2-af: Move validation of ptp pointer before its usage Date: Fri, 9 Jun 2023 17:28:06 +0530 Message-ID: <20230609115806.2625564-1-saikrishnag@marvell.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-GUID: sTtX79zfJY4Vc5BymOZw9Udj_QeotfA2 X-Proofpoint-ORIG-GUID: sTtX79zfJY4Vc5BymOZw9Udj_QeotfA2 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.573,FMLib:17.11.176.26 definitions=2023-06-09_08,2023-06-09_01,2023-05-22_02 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768226948921235173?= X-GMAIL-MSGID: =?utf-8?q?1768226948921235173?= |
Series |
[net,v2] octeontx2-af: Move validation of ptp pointer before its usage
|
|
Commit Message
Sai Krishna Gajula
June 9, 2023, 11:58 a.m. UTC
Moved PTP pointer validation before its use to avoid smatch warning. Also used kzalloc/kfree instead of devm_kzalloc/devm_kfree. Fixes: 2ef4e45d99b1 ("octeontx2-af: Add PTP PPS Errata workaround on CN10K silicon") Signed-off-by: Sai Krishna <saikrishnag@marvell.com> Signed-off-by: Naveen Mamindlapalli <naveenm@marvell.com> --- v2: - Addressed review comments given by Maciej Fijalkowski 1. Modified patch title, commit message 2. Used kzalloc/kfree instead of devm_kzalloc/devm_kfree drivers/net/ethernet/marvell/octeontx2/af/ptp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
Comments
On Fri, Jun 09, 2023 at 05:28:06PM +0530, Sai Krishna wrote: > @@ -428,7 +427,7 @@ static int ptp_probe(struct pci_dev *pdev, > return 0; > > error_free: > - devm_kfree(dev, ptp); > + kfree(ptp); Yeah. It's strange any time we call devm_kfree()... So there is something here which I have not understood. > > error: > /* For `ptp_get()` we need to differentiate between the case This probe function is super weird how it returns success on the failure path. One concern, I had initially was that if anything returns -EPROBE_DEFER then we cannot recover. That's not possible in the current code, but it makes me itch... But here is a different crash. drivers/net/ethernet/marvell/octeontx2/af/ptp.c 432 error: 433 /* For `ptp_get()` we need to differentiate between the case 434 * when the core has not tried to probe this device and the case when 435 * the probe failed. In the later case we pretend that the 436 * initialization was successful and keep the error in 437 * `dev->driver_data`. 438 */ 439 pci_set_drvdata(pdev, ERR_PTR(err)); 440 if (!first_ptp_block) 441 first_ptp_block = ERR_PTR(err); first_ptp_block is NULL for unprobed, an error pointer for probe failure, or valid pointer. 442 443 return 0; 444 } drivers/net/ethernet/marvell/octeontx2/af/ptp.c 201 struct ptp *ptp_get(void) 202 { 203 struct ptp *ptp = first_ptp_block; ^^^^^^^^^^^^^^^^^^^^^^ 204 205 /* Check PTP block is present in hardware */ 206 if (!pci_dev_present(ptp_id_table)) 207 return ERR_PTR(-ENODEV); 208 /* Check driver is bound to PTP block */ 209 if (!ptp) 210 ptp = ERR_PTR(-EPROBE_DEFER); 211 else 212 pci_dev_get(ptp->pdev); ^^^^^^^^^ if first_ptp_block is an error pointer this will Oops. 213 214 return ptp; 215 } regards, dan carpenter
> -----Original Message----- > From: Dan Carpenter <dan.carpenter@linaro.org> > Sent: Friday, June 9, 2023 6:48 PM > To: Sai Krishna Gajula <saikrishnag@marvell.com> > Cc: davem@davemloft.net; edumazet@google.com; kuba@kernel.org; > pabeni@redhat.com; netdev@vger.kernel.org; linux-kernel@vger.kernel.org; > Sunil Kovvuri Goutham <sgoutham@marvell.com>; > maciej.fijalkowski@intel.com; Naveen Mamindlapalli > <naveenm@marvell.com> > Subject: Re: [net PATCH v2] octeontx2-af: Move validation of ptp > pointer before its usage > > On Fri, Jun 09, 2023 at 05:28:06PM +0530, Sai Krishna wrote: > > @@ -428,7 +427,7 @@ static int ptp_probe(struct pci_dev *pdev, > > return 0; > > > > error_free: > > - devm_kfree(dev, ptp); > > + kfree(ptp); > > Yeah. It's strange any time we call devm_kfree()... So there is something > here which I have not understood. We moved from devm_kzalloc/devm_kfree to kzalloc/kfree as per review comments from Maciej. > > > > > error: > > /* For `ptp_get()` we need to differentiate between the case > > This probe function is super weird how it returns success on the failure path. > One concern, I had initially was that if anything returns -EPROBE_DEFER then > we cannot recover. That's not possible in the current code, but it makes me > itch... But here is a different crash. > In few circumstances, the PTP device is probed before the AF device in the driver. In such instance, -EPROBE_DEFER is used. -- EDEFER_PROBE is useful when probe order changes. Ex: AF driver probes before PTP. > drivers/net/ethernet/marvell/octeontx2/af/ptp.c > 432 error: > 433 /* For `ptp_get()` we need to differentiate between the case > 434 * when the core has not tried to probe this device and the case > when > 435 * the probe failed. In the later case we pretend that the > 436 * initialization was successful and keep the error in > 437 * `dev->driver_data`. > 438 */ > 439 pci_set_drvdata(pdev, ERR_PTR(err)); > 440 if (!first_ptp_block) > 441 first_ptp_block = ERR_PTR(err); > > first_ptp_block is NULL for unprobed, an error pointer for probe failure, or > valid pointer. This is correct. > > 442 > 443 return 0; > 444 } > > drivers/net/ethernet/marvell/octeontx2/af/ptp.c > 201 struct ptp *ptp_get(void) > 202 { > 203 struct ptp *ptp = first_ptp_block; > ^^^^^^^^^^^^^^^^^^^^^^ > > 204 > 205 /* Check PTP block is present in hardware */ > 206 if (!pci_dev_present(ptp_id_table)) > 207 return ERR_PTR(-ENODEV); > 208 /* Check driver is bound to PTP block */ > 209 if (!ptp) > 210 ptp = ERR_PTR(-EPROBE_DEFER); > 211 else > 212 pci_dev_get(ptp->pdev); > ^^^^^^^^^ if first_ptp_block is an error pointer this will > Oops. Will fix this in v3 patch. Thanks, Sai > > 213 > 214 return ptp; > 215 } > > regards, > dan carpenter
On Fri, Jun 23, 2023 at 11:28:19AM +0000, Sai Krishna Gajula wrote: > > This probe function is super weird how it returns success on the failure path. > > One concern, I had initially was that if anything returns -EPROBE_DEFER then > > we cannot recover. That's not possible in the current code, but it makes me > > itch... But here is a different crash. > > > > In few circumstances, the PTP device is probed before the AF device in > the driver. In such instance, -EPROBE_DEFER is used. > -- EDEFER_PROBE is useful when probe order changes. Ex: AF driver probes before PTP. > You're describing how -EPROBE_DEFER is *supposed* to work. But that's not what this driver does. If the AF driver is probed before the PTP driver then ptp_probe() should return -EPROBE_DEFER and that would allow the kernel to automatically retry ptp_probe() later. But instead of that, ptp_probe() returns success. So I guess the user would have to manually rmmod it and insmod it again? So, what I'm saying I don't understand why we can't do this in the normal way. The other thing I'm saying is that the weird return success on error stuff hasn't been tested or we would have discovered the crash through testing. regards, dan carpenter
> -----Original Message----- > From: Dan Carpenter <dan.carpenter@linaro.org> > Sent: Friday, June 23, 2023 5:14 PM > To: Sai Krishna Gajula <saikrishnag@marvell.com> > Cc: davem@davemloft.net; edumazet@google.com; kuba@kernel.org; > pabeni@redhat.com; netdev@vger.kernel.org; linux- > kernel@vger.kernel.org; Sunil Kovvuri Goutham <sgoutham@marvell.com>; > maciej.fijalkowski@intel.com; Naveen Mamindlapalli > <naveenm@marvell.com> > Subject: Re: [net PATCH v2] octeontx2-af: Move validation of ptp > pointer before its usage > > On Fri, Jun 23, 2023 at 11:28:19AM +0000, Sai Krishna Gajula wrote: > > > This probe function is super weird how it returns success on the failure > path. > > > One concern, I had initially was that if anything returns > > > -EPROBE_DEFER then we cannot recover. That's not possible in the > > > current code, but it makes me itch... But here is a different crash. > > > > > > > In few circumstances, the PTP device is probed before the AF device in > > the driver. In such instance, -EPROBE_DEFER is used. > > -- EDEFER_PROBE is useful when probe order changes. Ex: AF driver probes > before PTP. > > > > You're describing how -EPROBE_DEFER is *supposed* to work. But that's not > what this driver does. > > If the AF driver is probed before the PTP driver then ptp_probe() should > return -EPROBE_DEFER and that would allow the kernel to automatically retry > ptp_probe() later. But instead of that, ptp_probe() returns success. So I > guess the user would have to manually rmmod it and insmod it again? So, > what I'm saying I don't understand why we can't do this in the normal way. > > The other thing I'm saying is that the weird return success on error stuff > hasn't been tested or we would have discovered the crash through testing. > > regards, > dan carpenter As suggested, we will return error in ptp_probe in case of any failure conditions. In this case AF driver continues without PTP support. When the AF driver is probed before PTP driver , we will defer the AF probe. Hope these changes are inline with your view. I will send a v3 patch with these changes. Regards, Sai
On Fri, Jun 30, 2023 at 05:19:27AM +0000, Sai Krishna Gajula wrote: > > > -----Original Message----- > > From: Dan Carpenter <dan.carpenter@linaro.org> > > Sent: Friday, June 23, 2023 5:14 PM > > To: Sai Krishna Gajula <saikrishnag@marvell.com> > > Cc: davem@davemloft.net; edumazet@google.com; kuba@kernel.org; > > pabeni@redhat.com; netdev@vger.kernel.org; linux- > > kernel@vger.kernel.org; Sunil Kovvuri Goutham <sgoutham@marvell.com>; > > maciej.fijalkowski@intel.com; Naveen Mamindlapalli > > <naveenm@marvell.com> > > Subject: Re: [net PATCH v2] octeontx2-af: Move validation of ptp > > pointer before its usage > > > > On Fri, Jun 23, 2023 at 11:28:19AM +0000, Sai Krishna Gajula wrote: > > > > This probe function is super weird how it returns success on the failure > > path. > > > > One concern, I had initially was that if anything returns > > > > -EPROBE_DEFER then we cannot recover. That's not possible in the > > > > current code, but it makes me itch... But here is a different crash. > > > > > > > > > > In few circumstances, the PTP device is probed before the AF device in > > > the driver. In such instance, -EPROBE_DEFER is used. > > > -- EDEFER_PROBE is useful when probe order changes. Ex: AF driver probes > > before PTP. > > > > > > > You're describing how -EPROBE_DEFER is *supposed* to work. But that's not > > what this driver does. > > > > If the AF driver is probed before the PTP driver then ptp_probe() should > > return -EPROBE_DEFER and that would allow the kernel to automatically retry > > ptp_probe() later. But instead of that, ptp_probe() returns success. So I > > guess the user would have to manually rmmod it and insmod it again? So, > > what I'm saying I don't understand why we can't do this in the normal way. > > > > The other thing I'm saying is that the weird return success on error stuff > > hasn't been tested or we would have discovered the crash through testing. > > > > regards, > > dan carpenter > > As suggested, we will return error in ptp_probe in case of any > failure conditions. In this case AF driver continues without PTP support. I'm concerned about the "AF driver continues without PTP support". > When the AF driver is probed before PTP driver , we will defer the AF > probe. Hope these changes are inline with your view. > I will send a v3 patch with these changes. > I don't really understand the situation. You have two drivers. Normally, the relationship is very simple where you have to load one before you can load the other. But here it sounds like the relationships are very complicated and you are loading one in a degraded state for some reason... When drivers are loaded that happens in drivers/base/dd.c. We start with a list of drivers to probe. Then if any of them return -EPROBE_DEFER, we put them on deferred_probe_pending_list. Then as soon as we manage to probe another driver successfully we put the drivers on deferred_probe_pending_list onto another list and start trying to probe them again. That process continues until we've gone through the list of drivers and nothing succeeds. regards, dan carpenter
On Fri, Jun 30, 2023 at 11:16 AM Dan Carpenter <dan.carpenter@linaro.org> wrote: > > On Fri, Jun 30, 2023 at 05:19:27AM +0000, Sai Krishna Gajula wrote: > > > > > -----Original Message----- > > > > As suggested, we will return error in ptp_probe in case of any > > failure conditions. In this case AF driver continues without PTP support. > > I'm concerned about the "AF driver continues without PTP support". > Yes, it doesn't make sense to proceed with AF driver if PTP driver probe has failed. PTP driver probe will fail upon memory alloc or ioremap failures, such failures will most likely be encountered by AF driver as well. So better not continue with AF driver probe. > > When the AF driver is probed before PTP driver , we will defer the AF > > probe. Hope these changes are inline with your view. > > I will send a v3 patch with these changes. > > > > I don't really understand the situation. You have two drivers. > Normally, the relationship is very simple where you have to load one > before you can load the other. But here it sounds like the relationships > are very complicated and you are loading one in a degraded state for > some reason... > No, the relationship is simple. Idea is to defer AF driver probe until PTP driver is loaded. Once the above is fixed there won't be any degraded state. Thanks, Sunil.
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/ptp.c b/drivers/net/ethernet/marvell/octeontx2/af/ptp.c index 3411e2e47d46..248316c4a53f 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/ptp.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/ptp.c @@ -388,11 +388,10 @@ static int ptp_extts_on(struct ptp *ptp, int on) static int ptp_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { - struct device *dev = &pdev->dev; struct ptp *ptp; int err; - ptp = devm_kzalloc(dev, sizeof(*ptp), GFP_KERNEL); + ptp = kzalloc(sizeof(struct ptp), GFP_KERNEL); if (!ptp) { err = -ENOMEM; goto error; @@ -428,7 +427,7 @@ static int ptp_probe(struct pci_dev *pdev, return 0; error_free: - devm_kfree(dev, ptp); + kfree(ptp); error: /* For `ptp_get()` we need to differentiate between the case @@ -449,16 +448,17 @@ static void ptp_remove(struct pci_dev *pdev) struct ptp *ptp = pci_get_drvdata(pdev); u64 clock_cfg; - if (cn10k_ptp_errata(ptp) && hrtimer_active(&ptp->hrtimer)) - hrtimer_cancel(&ptp->hrtimer); - if (IS_ERR_OR_NULL(ptp)) return; + if (cn10k_ptp_errata(ptp) && hrtimer_active(&ptp->hrtimer)) + hrtimer_cancel(&ptp->hrtimer); + /* Disable PTP clock */ clock_cfg = readq(ptp->reg_base + PTP_CLOCK_CFG); clock_cfg &= ~PTP_CLOCK_CFG_PTP_EN; writeq(clock_cfg, ptp->reg_base + PTP_CLOCK_CFG); + kfree(ptp); } static const struct pci_device_id ptp_id_table[] = {