public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] misc: misc_minor_alloc to allocate ids for all dynamic/misc dynamic minors
@ 2024-10-14 13:14 Vimal Agrawal
  2024-10-14 13:19 ` Greg KH
  2024-10-16 14:22 ` [PATCH] misc: misc_minor_alloc to allocate ids for all dynamic/misc dynamic minors Dan Carpenter
  0 siblings, 2 replies; 20+ messages in thread
From: Vimal Agrawal @ 2024-10-14 13:14 UTC (permalink / raw)
  To: linux-kernel, gregkh, arnd; +Cc: avimalin, vimal.agrawal

misc_minor_alloc was allocating id for minor only in case of
MISC_DYNAMIC_MINOR but misc_minor_free was always freeing ids
using ida_free causing a mismatch and following
warn:
> > WARNING: CPU: 0 PID: 159 at lib/idr.c:525 ida_free+0x3e0/0x41f
> > ida_free called for id=127 which is not allocated.
> > <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
...
> > [<60941eb4>] ida_free+0x3e0/0x41f
> > [<605ac993>] misc_minor_free+0x3e/0xbc
> > [<605acb82>] misc_deregister+0x171/0x1b3

misc_minor_alloc is changed to allocate id from ida for all dynamic/
misc dynamic minors

Signed-off-by: Vimal Agrawal <vimal.agrawal@sophos.com>
---
 drivers/char/misc.c | 33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/drivers/char/misc.c b/drivers/char/misc.c
index 541edc26ec89..fbe51e776c15 100644
--- a/drivers/char/misc.c
+++ b/drivers/char/misc.c
@@ -63,16 +63,28 @@ static DEFINE_MUTEX(misc_mtx);
 #define DYNAMIC_MINORS 128 /* like dynamic majors */
 static DEFINE_IDA(misc_minors_ida);
 
-static int misc_minor_alloc(void)
+static int misc_minor_alloc(int minor)
 {
 	int ret;
 
-	ret = ida_alloc_max(&misc_minors_ida, DYNAMIC_MINORS - 1, GFP_KERNEL);
-	if (ret >= 0) {
-		ret = DYNAMIC_MINORS - ret - 1;
-	} else {
-		ret = ida_alloc_range(&misc_minors_ida, MISC_DYNAMIC_MINOR + 1,
+	if (minor == MISC_DYNAMIC_MINOR) {
+		/* allocate free id */
+		ret = ida_alloc_max(&misc_minors_ida, DYNAMIC_MINORS - 1, GFP_KERNEL);
+		if (ret >= 0) {
+			ret = DYNAMIC_MINORS - ret - 1;
+		} else {
+			ret = ida_alloc_range(&misc_minors_ida, MISC_DYNAMIC_MINOR + 1,
 				      MINORMASK, GFP_KERNEL);
+		}
+	} else {
+		/* specific minor, check if it is in dynamic or misc dynamic range  */
+		if (minor < DYNAMIC_MINORS) {
+			minor = DYNAMIC_MINORS - minor - 1;
+			ret = ida_alloc_range(&misc_minors_ida, minor, minor, GFP_KERNEL);
+		}
+
+		if (minor > MISC_DYNAMIC_MINOR)
+			ret = ida_alloc_range(&misc_minors_ida, minor, minor, GFP_KERNEL);
 	}
 	return ret;
 }
@@ -219,7 +231,7 @@ int misc_register(struct miscdevice *misc)
 	mutex_lock(&misc_mtx);
 
 	if (is_dynamic) {
-		int i = misc_minor_alloc();
+		int i = misc_minor_alloc(misc->minor);
 
 		if (i < 0) {
 			err = -EBUSY;
@@ -228,6 +240,7 @@ int misc_register(struct miscdevice *misc)
 		misc->minor = i;
 	} else {
 		struct miscdevice *c;
+		int i;
 
 		list_for_each_entry(c, &misc_list, list) {
 			if (c->minor == misc->minor) {
@@ -235,6 +248,12 @@ int misc_register(struct miscdevice *misc)
 				goto out;
 			}
 		}
+
+		i = misc_minor_alloc(misc->minor);
+		if (i < 0) {
+			err = -EBUSY;
+			goto out;
+		}
 	}
 
 	dev = MKDEV(MISC_MAJOR, misc->minor);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2024-10-21 13:39 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-14 13:14 [PATCH] misc: misc_minor_alloc to allocate ids for all dynamic/misc dynamic minors Vimal Agrawal
2024-10-14 13:19 ` Greg KH
2024-10-15  7:02   ` [PATCH v2] misc: misc_minor_alloc to use ida " Vimal Agrawal
2024-10-15  7:52     ` Greg KH
2024-10-15  7:53     ` Greg KH
2024-10-15  7:57     ` Vimal Agrawal
2024-10-15 22:18     ` Jeff Johnson
2024-10-17 11:12       ` Vimal Agrawal
2024-10-17 11:43         ` [PATCH v1 2/2] misc:minor basic kunit tests Vimal Agrawal
2024-10-17 11:43           ` [PATCH v3 1/2] misc: misc_minor_alloc to use ida for all dynamic/misc dynamic minors Vimal Agrawal
2024-10-17 11:55           ` [PATCH v1 2/2] misc:minor basic kunit tests Greg KH
2024-10-17 11:56           ` Greg KH
2024-10-17 13:35             ` [PATCH v4 1/2] misc: misc_minor_alloc to use ida for all dynamic/misc dynamic minors Vimal Agrawal
2024-10-17 13:39               ` Greg KH
2024-10-17 14:06                 ` Greg KH
2024-10-17 14:13             ` [PATCH v4 2/2] misc:minor basic kunit tests Vimal Agrawal
2024-10-21 13:38               ` [PATCH v5 1/2] misc: misc_minor_alloc to use ida for all dynamic/misc dynamic minors avimalin
2024-10-21 13:39               ` [PATCH v5 2/2] misc:minor basic kunit tests avimalin
2024-10-16 14:22 ` [PATCH] misc: misc_minor_alloc to allocate ids for all dynamic/misc dynamic minors Dan Carpenter
2024-10-17 11:08   ` Vimal Agrawal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox