From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Zijun Hu <zijun_hu@icloud.com>
Cc: Arnd Bergmann <arnd@arndb.de>,
"James E.J. Bottomley" <James.Bottomley@hansenpartnership.com>,
Helge Deller <deller@gmx.de>,
"David S. Miller" <davem@davemloft.net>,
Andreas Larsson <andreas@gaisler.com>,
Thadeu Lima de Souza Cascardo <cascardo@igalia.com>,
linux-kernel@vger.kernel.org, linux-parisc@vger.kernel.org,
sparclinux@vger.kernel.org, Zijun Hu <zijun.hu@oss.qualcomm.com>
Subject: Re: [PATCH v4 5/8] char: misc: Make registering miscdevice reentry who wants dynamic minor
Date: Wed, 9 Jul 2025 15:10:26 +0200 [thread overview]
Message-ID: <2025070948-habitable-figment-d1aa@gregkh> (raw)
In-Reply-To: <961b53a1-9c30-48ad-becf-81590b27464b@icloud.com>
On Wed, Jul 09, 2025 at 08:41:36PM +0800, Zijun Hu wrote:
> On 2025/7/6 16:55, Greg Kroah-Hartman wrote:
> >> | Invalid fixed minor 257 for miscdevice 'miscdyn_a'
> >> | #miscdev_test_dynamic_reentry: ASSERTION FAILED at misc_minor_kunit.c:639
> >> | Expected ret == 0, but
> >> | ret == -22 (0xffffffffffffffea)
> >> | [FAILED] miscdev_test_dynamic_reentry
> >>
> >> misc_register()/misc_deregister() are sometimes invoked by driver's
> >> probe()/remove() separately, which has reentry requirement.
> > What do you mean? Why is it required that this is reentrant? What
> > in-kernel drivers require this?
> >
>
> miscdevice APIs are sometimes used by the following way, "drv_probe()->
> drv_remove()->drv_probe()" is possible, so "misc_register()->
> misc_deregister()->misc_register()" is possible and considered by
> previous patch's test case, which needs to register misc_dev again
> without any reinitialization, namely, reentry.
>
> actually, several in-kernel codes have such usages.
>
> static struct miscdevice misc_dev = {
> ...
> .minor = MISC_DYNAMIC_MINOR,
> ...
> };
>
> int drv_probe() {
> ...
> // static misc_dev is not initialized before registering.
> misc_register(&misc_dev);
> ...
> }
>
> void drv_remove() {
> ...
> misc_deregister(&misc_dev);
> ...
> }
>
> struct device_driver driver = {
> .probe = drv_probe,
> .remove = drv_remove,
> };
>
> >> Fix by resetting @misc->minor to MISC_DYNAMIC_MINOR in misc_deregister()
> >> as error handling of misc_register() does.
> >>
> >> Signed-off-by: Zijun Hu <zijun.hu@oss.qualcomm.com>
> >> ---
> >> drivers/char/misc.c | 2 ++
> >> 1 file changed, 2 insertions(+)
> >>
> >> diff --git a/drivers/char/misc.c b/drivers/char/misc.c
> >> index b8e66466184fa21fb66d968db7950e0b5669ac43..96ed343cf5c8509a09855020049a9af82a3ede95 100644
> >> --- a/drivers/char/misc.c
> >> +++ b/drivers/char/misc.c
> >> @@ -288,6 +288,8 @@ void misc_deregister(struct miscdevice *misc)
> >> list_del(&misc->list);
> >> device_destroy(&misc_class, MKDEV(MISC_MAJOR, misc->minor));
> >> misc_minor_free(misc->minor);
> >> + if (misc->minor > MISC_DYNAMIC_MINOR)
> >> + misc->minor = MISC_DYNAMIC_MINOR;
> >> mutex_unlock(&misc_mtx);
> > misc is being unregistered here, so why are you changing the minor
> > field? It's now invalid as it is not registered, so this value should
> > never be relied on at all, neither is anything else in this structure.
>
> reset its minor code is to register it again without re-initialization
> successfully
>
> the other members are handed by misc_deregister() properly and don't
> effect re-registering.
Then we are getting lucky, let's clear out all the fields we modified
and later rely on as this feels very fragile.
thanks,
greg k-h
next prev parent reply other threads:[~2025-07-09 13:10 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-04 13:25 [PATCH v4 0/8] char: misc: Various cleanup for miscdevice Zijun Hu
2025-07-04 13:25 ` [PATCH v4 1/8] char: misc: Move drivers/misc/misc_minor_kunit.c to drivers/char/ Zijun Hu
2025-07-06 8:51 ` Greg Kroah-Hartman
2025-07-04 13:26 ` [PATCH v4 2/8] char: misc: Adapt and add test cases for simple minor space division Zijun Hu
2025-07-06 8:52 ` Greg Kroah-Hartman
2025-07-04 13:26 ` [PATCH v4 3/8] char: misc: Disallow registering miscdevice whose minor > MISC_DYNAMIC_MINOR Zijun Hu
2025-07-04 13:26 ` [PATCH v4 4/8] char: misc: Add a reentry test case about dynamic minor request Zijun Hu
2025-07-04 13:26 ` [PATCH v4 5/8] char: misc: Make registering miscdevice reentry who wants dynamic minor Zijun Hu
2025-07-06 8:55 ` Greg Kroah-Hartman
2025-07-09 12:41 ` Zijun Hu
2025-07-09 13:10 ` Greg Kroah-Hartman [this message]
2025-07-04 13:26 ` [PATCH v4 6/8] char: misc: Does not request module for miscdevice with " Zijun Hu
2025-07-06 8:55 ` Greg Kroah-Hartman
2025-07-09 12:46 ` Zijun Hu
2025-07-04 13:26 ` [PATCH v4 7/8] char: misc: Register fixed minor EISA_EEPROM_MINOR in linux/miscdevice.h Zijun Hu
2025-07-04 13:26 ` [PATCH v4 8/8] sparc: kernel: apc: Remove macro APC_MINOR definition 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=2025070948-habitable-figment-d1aa@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=andreas@gaisler.com \
--cc=arnd@arndb.de \
--cc=cascardo@igalia.com \
--cc=davem@davemloft.net \
--cc=deller@gmx.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-parisc@vger.kernel.org \
--cc=sparclinux@vger.kernel.org \
--cc=zijun.hu@oss.qualcomm.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 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.