From: Simon Horman <simon.horman@corigine.com>
To: Vladimir Oltean <vladimir.oltean@nxp.com>
Cc: Jiri Pirko <jiri@resnulli.us>,
Pedro Tammela <pctammela@mojatatu.com>,
netdev@vger.kernel.org,
Richard Cochran <richardcochran@gmail.com>,
Jamal Hadi Salim <jhs@mojatatu.com>,
linux-kernel@vger.kernel.org, Eric Dumazet <edumazet@google.com>,
intel-wired-lan@lists.osuosl.org,
Maxim Georgiev <glipus@gmail.com>,
Cong Wang <xiyou.wangcong@gmail.com>,
Peilin Ye <yepeilin.cs@gmail.com>,
Jakub Kicinski <kuba@kernel.org>,
Zhengchao Shao <shaozhengchao@huawei.com>,
Paolo Abeni <pabeni@redhat.com>,
"David S. Miller" <davem@davemloft.net>
Subject: Re: [Intel-wired-lan] [PATCH v2 net-next 6/9] net: netdevsim: create a mock-up PTP Hardware Clock driver
Date: Wed, 14 Jun 2023 15:11:44 +0200 [thread overview]
Message-ID: <ZIm8kK7plae8CLvV@corigine.com> (raw)
In-Reply-To: <20230613215440.2465708-7-vladimir.oltean@nxp.com>
On Wed, Jun 14, 2023 at 12:54:37AM +0300, Vladimir Oltean wrote:
Hi Vladimir,
some minor feedback from my side.
...
> diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
> index 35fa1ca98671..58cd51de5b79 100644
> --- a/drivers/net/netdevsim/netdev.c
> +++ b/drivers/net/netdevsim/netdev.c
> @@ -291,13 +291,19 @@ static void nsim_setup(struct net_device *dev)
>
> static int nsim_init_netdevsim(struct netdevsim *ns)
> {
> + struct mock_phc *phc;
> int err;
>
> + phc = mock_phc_create(&ns->nsim_bus_dev->dev);
> + if (IS_ERR(phc))
> + return PTR_ERR(phc);
> +
> + ns->phc = phc;
> ns->netdev->netdev_ops = &nsim_netdev_ops;
>
> err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev);
> if (err)
> - return err;
> + goto err_phc_destroy;
>
> rtnl_lock();
> err = nsim_bpf_init(ns);
...
> diff --git a/drivers/ptp/ptp_mock.c b/drivers/ptp/ptp_mock.c
> new file mode 100644
> index 000000000000..e09e6009c4f7
> --- /dev/null
> +++ b/drivers/ptp/ptp_mock.c
> @@ -0,0 +1,175 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright 2023 NXP
> + *
> + * Mock-up PTP Hardware Clock driver for virtual network devices
> + *
> + * Create a PTP clock which offers PTP time manipulation operations
> + * using a timecounter/cyclecounter on top of CLOCK_MONOTONIC_RAW.
> + */
> +
> +#include <linux/ptp_clock_kernel.h>
> +#include <linux/ptp_mock.h>
> +#include <linux/timecounter.h>
> +
> +/* Clamp scaled_ppm between -2,097,152,000 and 2,097,152,000,
> + * and thus "adj" between -68,719,476 and 68,719,476
> + */
> +#define MOCK_PHC_MAX_ADJ_PPB 32000000
> +/* Timestamps from ktime_get_raw() have 1 ns resolution, so the scale factor
> + * (MULT >> SHIFT) needs to be 1. Pick SHIFT as 31 bits, which translates
> + * MULT(freq 0) into 0x80000000.
> + */
> +#define MOCK_PHC_CC_SHIFT 31
> +#define MOCK_PHC_CC_MULT (1 << MOCK_PHC_CC_SHIFT)
Maybe BIT()?
...
> +struct mock_phc *mock_phc_create(struct device *dev)
> +{
> + struct mock_phc *phc;
> + int err;
> +
> + phc = kzalloc(sizeof(*phc), GFP_KERNEL);
> + if (!phc) {
> + err = -ENOMEM;
> + goto out;
> + }
> +
> + phc->info = (struct ptp_clock_info) {
> + .owner = THIS_MODULE,
> + .name = "Mock-up PTP clock",
> + .max_adj = MOCK_PHC_MAX_ADJ_PPB,
> + .adjfine = mock_phc_adjfine,
> + .adjtime = mock_phc_adjtime,
> + .gettime64 = mock_phc_gettime64,
> + .settime64 = mock_phc_settime64,
> + .do_aux_work = mock_phc_refresh,
> + };
> +
> + phc->cc = (struct cyclecounter) {
> + .read = mock_phc_cc_read,
> + .mask = CYCLECOUNTER_MASK(64),
> + .mult = MOCK_PHC_CC_MULT,
> + .shift = MOCK_PHC_CC_SHIFT,
> + };
> +
> + spin_lock_init(&phc->lock);
> + timecounter_init(&phc->tc, &phc->cc, 0);
> +
> + phc->clock = ptp_clock_register(&phc->info, dev);
> + if (IS_ERR_OR_NULL(phc->clock)) {
> + err = PTR_ERR_OR_ZERO(phc->clock);
> + goto out_free_phc;
> + }
> +
> + ptp_schedule_worker(phc->clock, MOCK_PHC_REFRESH_INTERVAL);
> +
> + return phc;
> +
> +out_free_phc:
> + kfree(phc);
> +out:
> + return ERR_PTR(err);
> +}
Smatch complains that ERR_PTR may be passed zero.
Looking at the IS_ERR_OR_NULL block above, this does indeed seem to be the
case.
Keeping Smatch happy is one thing - your call - but I do wonder if the
caller of mock_phc_create() handles the NULL case correctly.
...
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
WARNING: multiple messages have this Message-ID (diff)
From: Simon Horman <simon.horman@corigine.com>
To: Vladimir Oltean <vladimir.oltean@nxp.com>
Cc: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Jamal Hadi Salim <jhs@mojatatu.com>,
Cong Wang <xiyou.wangcong@gmail.com>,
Jiri Pirko <jiri@resnulli.us>,
Vinicius Costa Gomes <vinicius.gomes@intel.com>,
linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org,
Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>,
Peilin Ye <yepeilin.cs@gmail.com>,
Pedro Tammela <pctammela@mojatatu.com>,
Richard Cochran <richardcochran@gmail.com>,
Zhengchao Shao <shaozhengchao@huawei.com>,
Maxim Georgiev <glipus@gmail.com>
Subject: Re: [PATCH v2 net-next 6/9] net: netdevsim: create a mock-up PTP Hardware Clock driver
Date: Wed, 14 Jun 2023 15:11:44 +0200 [thread overview]
Message-ID: <ZIm8kK7plae8CLvV@corigine.com> (raw)
In-Reply-To: <20230613215440.2465708-7-vladimir.oltean@nxp.com>
On Wed, Jun 14, 2023 at 12:54:37AM +0300, Vladimir Oltean wrote:
Hi Vladimir,
some minor feedback from my side.
...
> diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
> index 35fa1ca98671..58cd51de5b79 100644
> --- a/drivers/net/netdevsim/netdev.c
> +++ b/drivers/net/netdevsim/netdev.c
> @@ -291,13 +291,19 @@ static void nsim_setup(struct net_device *dev)
>
> static int nsim_init_netdevsim(struct netdevsim *ns)
> {
> + struct mock_phc *phc;
> int err;
>
> + phc = mock_phc_create(&ns->nsim_bus_dev->dev);
> + if (IS_ERR(phc))
> + return PTR_ERR(phc);
> +
> + ns->phc = phc;
> ns->netdev->netdev_ops = &nsim_netdev_ops;
>
> err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev);
> if (err)
> - return err;
> + goto err_phc_destroy;
>
> rtnl_lock();
> err = nsim_bpf_init(ns);
...
> diff --git a/drivers/ptp/ptp_mock.c b/drivers/ptp/ptp_mock.c
> new file mode 100644
> index 000000000000..e09e6009c4f7
> --- /dev/null
> +++ b/drivers/ptp/ptp_mock.c
> @@ -0,0 +1,175 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright 2023 NXP
> + *
> + * Mock-up PTP Hardware Clock driver for virtual network devices
> + *
> + * Create a PTP clock which offers PTP time manipulation operations
> + * using a timecounter/cyclecounter on top of CLOCK_MONOTONIC_RAW.
> + */
> +
> +#include <linux/ptp_clock_kernel.h>
> +#include <linux/ptp_mock.h>
> +#include <linux/timecounter.h>
> +
> +/* Clamp scaled_ppm between -2,097,152,000 and 2,097,152,000,
> + * and thus "adj" between -68,719,476 and 68,719,476
> + */
> +#define MOCK_PHC_MAX_ADJ_PPB 32000000
> +/* Timestamps from ktime_get_raw() have 1 ns resolution, so the scale factor
> + * (MULT >> SHIFT) needs to be 1. Pick SHIFT as 31 bits, which translates
> + * MULT(freq 0) into 0x80000000.
> + */
> +#define MOCK_PHC_CC_SHIFT 31
> +#define MOCK_PHC_CC_MULT (1 << MOCK_PHC_CC_SHIFT)
Maybe BIT()?
...
> +struct mock_phc *mock_phc_create(struct device *dev)
> +{
> + struct mock_phc *phc;
> + int err;
> +
> + phc = kzalloc(sizeof(*phc), GFP_KERNEL);
> + if (!phc) {
> + err = -ENOMEM;
> + goto out;
> + }
> +
> + phc->info = (struct ptp_clock_info) {
> + .owner = THIS_MODULE,
> + .name = "Mock-up PTP clock",
> + .max_adj = MOCK_PHC_MAX_ADJ_PPB,
> + .adjfine = mock_phc_adjfine,
> + .adjtime = mock_phc_adjtime,
> + .gettime64 = mock_phc_gettime64,
> + .settime64 = mock_phc_settime64,
> + .do_aux_work = mock_phc_refresh,
> + };
> +
> + phc->cc = (struct cyclecounter) {
> + .read = mock_phc_cc_read,
> + .mask = CYCLECOUNTER_MASK(64),
> + .mult = MOCK_PHC_CC_MULT,
> + .shift = MOCK_PHC_CC_SHIFT,
> + };
> +
> + spin_lock_init(&phc->lock);
> + timecounter_init(&phc->tc, &phc->cc, 0);
> +
> + phc->clock = ptp_clock_register(&phc->info, dev);
> + if (IS_ERR_OR_NULL(phc->clock)) {
> + err = PTR_ERR_OR_ZERO(phc->clock);
> + goto out_free_phc;
> + }
> +
> + ptp_schedule_worker(phc->clock, MOCK_PHC_REFRESH_INTERVAL);
> +
> + return phc;
> +
> +out_free_phc:
> + kfree(phc);
> +out:
> + return ERR_PTR(err);
> +}
Smatch complains that ERR_PTR may be passed zero.
Looking at the IS_ERR_OR_NULL block above, this does indeed seem to be the
case.
Keeping Smatch happy is one thing - your call - but I do wonder if the
caller of mock_phc_create() handles the NULL case correctly.
...
next prev parent reply other threads:[~2023-06-14 13:12 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-13 21:54 [Intel-wired-lan] [PATCH v2 net-next 0/9] Improve the taprio qdisc's relationship with its children Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 1/9] net/sched: taprio: don't access q->qdiscs[] in unoffloaded mode during attach() Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 2/9] net/sched: taprio: keep child Qdisc refcount elevated at 2 in offload mode Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 3/9] net/sched: taprio: try again to report q->qdiscs[] to qdisc_leaf() Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 4/9] net/sched: taprio: delete misleading comment about preallocating child qdiscs Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 5/9] net/sched: taprio: dump class stats for the actual q->qdiscs[] Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 6/9] net: netdevsim: create a mock-up PTP Hardware Clock driver Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-14 13:11 ` Simon Horman [this message]
2023-06-14 13:11 ` Simon Horman
2023-06-14 22:17 ` [Intel-wired-lan] " Vladimir Oltean
2023-06-14 22:17 ` Vladimir Oltean
2023-06-15 7:58 ` [Intel-wired-lan] " Simon Horman
2023-06-15 7:58 ` Simon Horman
2023-06-15 14:02 ` [Intel-wired-lan] " Dan Carpenter
2023-06-15 14:02 ` Dan Carpenter
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 7/9] net: netdevsim: mimic tc-taprio offload Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-15 0:06 ` [Intel-wired-lan] " Vinicius Costa Gomes
2023-06-15 0:06 ` Vinicius Costa Gomes
2023-08-01 16:45 ` [Intel-wired-lan] " Vladimir Oltean
2023-08-01 16:45 ` Vladimir Oltean
2023-08-01 17:39 ` [Intel-wired-lan] " Vinicius Costa Gomes
2023-08-01 17:39 ` Vinicius Costa Gomes
2023-08-01 17:43 ` [Intel-wired-lan] " Vladimir Oltean
2023-08-01 17:43 ` Vladimir Oltean
2023-08-01 18:06 ` [Intel-wired-lan] " Vinicius Costa Gomes
2023-08-01 18:06 ` Vinicius Costa Gomes
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 8/9] selftests/tc-testing: test that taprio can only be attached as root Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-14 16:44 ` [Intel-wired-lan] " Pedro Tammela
2023-06-14 16:44 ` Pedro Tammela
2023-06-13 21:54 ` [Intel-wired-lan] [PATCH v2 net-next 9/9] selftests/tc-testing: verify that a qdisc can be grafted onto a taprio class Vladimir Oltean
2023-06-13 21:54 ` Vladimir Oltean
2023-06-14 16:45 ` [Intel-wired-lan] " Pedro Tammela
2023-06-14 16:45 ` Pedro Tammela
2023-08-01 16:53 ` [Intel-wired-lan] " Vladimir Oltean
2023-08-01 16:53 ` Vladimir Oltean
2023-06-14 16:47 ` [Intel-wired-lan] [PATCH v2 net-next 0/9] Improve the taprio qdisc's relationship with its children Pedro Tammela
2023-06-14 16:47 ` Pedro Tammela
2023-08-01 16:06 ` [Intel-wired-lan] " Vladimir Oltean
2023-08-01 16:06 ` Vladimir Oltean
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZIm8kK7plae8CLvV@corigine.com \
--to=simon.horman@corigine.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=glipus@gmail.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pctammela@mojatatu.com \
--cc=richardcochran@gmail.com \
--cc=shaozhengchao@huawei.com \
--cc=vladimir.oltean@nxp.com \
--cc=xiyou.wangcong@gmail.com \
--cc=yepeilin.cs@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.