From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Zijun Hu <zijun_hu@icloud.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Davidlohr Bueso <dave@stgolabs.net>,
Dave Jiang <dave.jiang@intel.com>,
Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Ira Weiny <ira.weiny@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Takashi Sakamoto <o-takashi@sakamocchi.jp>,
Timur Tabi <timur@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
<linux-kernel@vger.kernel.org>, <linux-cxl@vger.kernel.org>,
<netdev@vger.kernel.org>, Zijun Hu <quic_zijuhu@quicinc.com>
Subject: Re: [PATCH v3 2/3] cxl/region: Find free cxl decoder by device_for_each_child()
Date: Tue, 27 Aug 2024 12:30:06 +0100 [thread overview]
Message-ID: <20240827123006.00004527@Huawei.com> (raw)
In-Reply-To: <20240824-const_dfc_prepare-v3-2-32127ea32bba@quicinc.com>
On Sat, 24 Aug 2024 17:07:44 +0800
Zijun Hu <zijun_hu@icloud.com> wrote:
> From: Zijun Hu <quic_zijuhu@quicinc.com>
>
> To prepare for constifying the following old driver core API:
>
> struct device *device_find_child(struct device *dev, void *data,
> int (*match)(struct device *dev, void *data));
> to new:
> struct device *device_find_child(struct device *dev, const void *data,
> int (*match)(struct device *dev, const void *data));
>
> The new API does not allow its match function (*match)() to modify
> caller's match data @*data, but match_free_decoder() as the old API's
> match function indeed modifies relevant match data, so it is not suitable
> for the new API any more, solved by using device_for_each_child() to
> implement relevant finding free cxl decoder function.
>
> Suggested-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com>
This seems to functionally do the same as before.
I'm not sure I like the original code though so a comment inline.
> ---
> drivers/cxl/core/region.c | 30 ++++++++++++++++++++++++------
> 1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index 21ad5f242875..c2068e90bf2f 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -794,10 +794,15 @@ static size_t show_targetN(struct cxl_region *cxlr, char *buf, int pos)
> return rc;
> }
>
> +struct cxld_match_data {
> + int id;
> + struct device *target_device;
> +};
> +
> static int match_free_decoder(struct device *dev, void *data)
> {
> + struct cxld_match_data *match_data = data;
> struct cxl_decoder *cxld;
> - int *id = data;
>
> if (!is_switch_decoder(dev))
> return 0;
> @@ -805,17 +810,31 @@ static int match_free_decoder(struct device *dev, void *data)
> cxld = to_cxl_decoder(dev);
>
> /* enforce ordered allocation */
> - if (cxld->id != *id)
> + if (cxld->id != match_data->id)
Why do we carry on in this case?
Conditions are:
1. Start match_data->id == 0
2. First pass cxld->id == 0 (all good) or
cxld->id == 1 say (and we skip until we match
on cxld->id == 0 (perhaps on the second child if they are
ordered (1, 0, 2) etc.
If we skipped and then matched on second child but it was
already in use (so region set), we will increment match_data->id to 1
but never find that as it was the one we skipped.
So this can only work if the children are ordered.
So if that's the case and the line above is just a sanity check
on that, it should be noisier (so an error print) and might
as well fail as if it doesn't match all bets are off.
Jonathan
> return 0;
>
> - if (!cxld->region)
> + if (!cxld->region) {
> + match_data->target_device = get_device(dev);
> return 1;
> + }
>
> - (*id)++;
> + match_data->id++;
>
> return 0;
> }
>
> +/* NOTE: need to drop the reference with put_device() after use. */
> +static struct device *find_free_decoder(struct device *parent)
> +{
> + struct cxld_match_data match_data = {
> + .id = 0,
> + .target_device = NULL,
> + };
> +
> + device_for_each_child(parent, &match_data, match_free_decoder);
> + return match_data.target_device;
> +}
> +
> static int match_auto_decoder(struct device *dev, void *data)
> {
> struct cxl_region_params *p = data;
> @@ -840,7 +859,6 @@ cxl_region_find_decoder(struct cxl_port *port,
> struct cxl_region *cxlr)
> {
> struct device *dev;
> - int id = 0;
>
> if (port == cxled_to_port(cxled))
> return &cxled->cxld;
> @@ -849,7 +867,7 @@ cxl_region_find_decoder(struct cxl_port *port,
> dev = device_find_child(&port->dev, &cxlr->params,
> match_auto_decoder);
> else
> - dev = device_find_child(&port->dev, &id, match_free_decoder);
> + dev = find_free_decoder(&port->dev);
> if (!dev)
> return NULL;
> /*
>
next prev parent reply other threads:[~2024-08-27 11:30 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-24 9:07 [PATCH v3 0/3] driver core: Prevent device_find_child() from modifying caller's match data Zijun Hu
2024-08-24 9:07 ` [PATCH v3 1/3] driver core: Make parameter check consistent for API cluster device_(for_each|find)_child() Zijun Hu
2024-08-24 9:07 ` [PATCH v3 2/3] cxl/region: Find free cxl decoder by device_for_each_child() Zijun Hu
2024-08-27 0:31 ` Zijun Hu
2024-08-27 11:30 ` Jonathan Cameron [this message]
2024-08-27 11:53 ` Zijun Hu
2024-08-28 10:48 ` Zijun Hu
2024-09-09 21:19 ` Ira Weiny
2024-08-24 9:07 ` [PATCH v3 3/3] net: qcom/emac: Prevent device_find_child() from modifying caller's match data Zijun Hu
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=20240827123006.00004527@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=ira.weiny@intel.com \
--cc=kuba@kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=o-takashi@sakamocchi.jp \
--cc=pabeni@redhat.com \
--cc=quic_zijuhu@quicinc.com \
--cc=rafael@kernel.org \
--cc=timur@kernel.org \
--cc=vishal.l.verma@intel.com \
--cc=zijun_hu@icloud.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox