linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stephen Boyd <sboyd@kernel.org>
To: Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org,
	patches@lists.linux.dev, kunit-dev@googlegroups.com,
	linux-kselftest@vger.kernel.org, devicetree@vger.kernel.org,
	Brendan Higgins <brendan.higgins@linux.dev>,
	David Gow <davidgow@google.com>, Rae Moar <rmoar@google.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Rafael J . Wysocki <rafael@kernel.org>,
	Rob Herring <robh@kernel.org>,
	Saravana Kannan <saravanak@google.com>,
	Daniel Latypov <dlatypov@google.com>,
	Christian Marangi <ansuelsmth@gmail.com>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Maxime Ripard <maxime@cerno.tech>
Subject: Re: [PATCH v4 05/10] platform: Add test managed platform_device/driver APIs
Date: Mon, 13 May 2024 20:35:49 -0700	[thread overview]
Message-ID: <31d4dfdf8bc4b866a2b6d45fc4de0c2d.sboyd@kernel.org> (raw)
In-Reply-To: <20240422232404.213174-6-sboyd@kernel.org>

Quoting Stephen Boyd (2024-04-22 16:23:58)
> diff --git a/drivers/base/test/platform_kunit.c b/drivers/base/test/platform_kunit.c
> new file mode 100644
> index 000000000000..54af6db2a6d8
> --- /dev/null
> +++ b/drivers/base/test/platform_kunit.c
> @@ -0,0 +1,174 @@
[...]
> +struct platform_device *
> +platform_device_alloc_kunit(struct kunit *test, const char *name, int id)
> +{
> +       struct platform_device *pdev;
> +
> +       pdev = platform_device_alloc(name, id);
> +       if (!pdev)
> +               return NULL;
> +
> +       if (kunit_add_action_or_reset(test, (kunit_action_t *)&platform_device_put, pdev))
> +               return NULL;
> +
> +       return pdev;
> +}
> +EXPORT_SYMBOL_GPL(platform_device_alloc_kunit);
> +
> +static void platform_device_add_kunit_exit(struct kunit_resource *res)
> +{
> +       struct platform_device *pdev = res->data;
> +
> +       platform_device_unregister(pdev);
> +}
> +
> +static bool
> +platform_device_alloc_kunit_match(struct kunit *test,
> +                                 struct kunit_resource *res, void *match_data)
> +{
> +       struct platform_device *pdev = match_data;
> +
> +       return res->data == pdev;
> +}
> +
> +/**
> + * platform_device_add_kunit() - Register a KUnit test managed platform device
> + * @test: test context
> + * @pdev: platform device to add
> + *
> + * Register a test managed platform device. The device is unregistered when the
> + * test completes.
> + *
> + * Return: 0 on success, negative errno on failure.
> + */
> +int platform_device_add_kunit(struct kunit *test, struct platform_device *pdev)
> +{
> +       struct kunit_resource *res;
> +       int ret;
> +
> +       ret = platform_device_add(pdev);
> +       if (ret)
> +               return ret;
> +
> +       res = kunit_find_resource(test, platform_device_alloc_kunit_match, pdev);

This doesn't work because platform_device_alloc_kunit() used
kunit_add_action_or_reset() which has a chained free routine and data
pointer. I've added a test to make sure the platform device is removed
from the bus. It's not super great though because when this code fails
to find a match it will still remove the device by calling
platform_device_unregister() when the test ends. It will follow that up
with a call to platform_device_put(), which is the problem as that
causes an underflow and operates on an already freed device.

I couldn't come up with anything better than searching the platform bus.
Maybe if there was a way to allocate the memory or redirect where
platform_device_alloc_kunit() got memory from we could hold the device
memory around after it should have been freed and make sure the kref for
the device kobject is 0. That seems pretty invasive to do though so I'm
just going to leave it for now and add this test to make sure it cleans
up.

  parent reply	other threads:[~2024-05-14  3:35 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-22 23:23 [PATCH v4 00/10] clk: Add kunit tests for fixed rate and parent data Stephen Boyd
2024-04-22 23:23 ` [PATCH v4 01/10] of: Add test managed wrappers for of_overlay_apply()/of_node_put() Stephen Boyd
2024-04-23 15:05   ` Rob Herring
2024-05-01  7:55   ` David Gow
2024-05-03  0:36     ` Stephen Boyd
2024-05-04  8:30       ` David Gow
2024-04-22 23:23 ` [PATCH v4 02/10] dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends Stephen Boyd
2024-05-01  7:55   ` David Gow
2024-04-22 23:23 ` [PATCH v4 03/10] dt-bindings: test: Add KUnit empty node binding Stephen Boyd
2024-05-01  7:55   ` David Gow
2024-05-02 21:23     ` Brendan Higgins
2024-04-22 23:23 ` [PATCH v4 04/10] of: Add a KUnit test for overlays and test managed APIs Stephen Boyd
2024-04-23 15:07   ` Rob Herring
2024-04-22 23:23 ` [PATCH v4 05/10] platform: Add test managed platform_device/driver APIs Stephen Boyd
2024-04-24 18:11   ` Stephen Boyd
2024-04-30 21:32     ` Stephen Boyd
2024-05-01  7:55   ` David Gow
2024-05-03  1:03     ` Stephen Boyd
2024-05-04  8:30       ` David Gow
2024-05-10 20:12         ` Stephen Boyd
2024-05-14  3:35   ` Stephen Boyd [this message]
2024-04-22 23:23 ` [PATCH v4 06/10] dt-bindings: kunit: Add fixed rate clk consumer test Stephen Boyd
2024-06-03 22:02   ` Stephen Boyd
2024-04-22 23:24 ` [PATCH v4 07/10] clk: Add test managed clk provider/consumer APIs Stephen Boyd
2024-04-22 23:24 ` [PATCH v4 08/10] clk: Add KUnit tests for clk fixed rate basic type Stephen Boyd
2024-04-22 23:24 ` [PATCH v4 09/10] dt-bindings: clk: Add KUnit clk_parent_data test Stephen Boyd
2024-04-22 23:24 ` [PATCH v4 10/10] clk: Add KUnit tests for clks registered with struct clk_parent_data Stephen Boyd
2024-05-01  8:08 ` [PATCH v4 00/10] clk: Add kunit tests for fixed rate and parent data David Gow
2024-05-03  1:27   ` Stephen Boyd
2024-05-14 21:29     ` Stephen Boyd
2024-05-15 13:06       ` Rob Herring
2024-05-15 21:15         ` Stephen Boyd
2024-05-15 22:08           ` Rob Herring
2024-05-17  0:33             ` Stephen Boyd

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=31d4dfdf8bc4b866a2b6d45fc4de0c2d.sboyd@kernel.org \
    --to=sboyd@kernel.org \
    --cc=ansuelsmth@gmail.com \
    --cc=brendan.higgins@linux.dev \
    --cc=conor+dt@kernel.org \
    --cc=davidgow@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dlatypov@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=kunit-dev@googlegroups.com \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=maxime@cerno.tech \
    --cc=mturquette@baylibre.com \
    --cc=patches@lists.linux.dev \
    --cc=rafael@kernel.org \
    --cc=rmoar@google.com \
    --cc=robh@kernel.org \
    --cc=saravanak@google.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;
as well as URLs for NNTP newsgroup(s).