Skip to content

Commit

Permalink
drivers/char/misc.c: use bitmap/bitops functions for dynamic minor nu…
Browse files Browse the repository at this point in the history
…mber allocation

Use DECLARE_BITMAP(), find_first_zero_bit(), set_bit() and clear_bit()
instead of rewriting code to do it with the minor number dynamic
allocation bitmap.

We need to invert the bit position to keep the code behaviour of using the
last minor numbers first, since we don't have a find_last_zero_bit.

Signed-off-by: Thadeu Lima de Souza Cascardo <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: Alan Cox <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Thadeu Lima de Souza Cascardo authored and torvalds committed Dec 15, 2009
1 parent 4ae717d commit 1f2f38d
Showing 1 changed file with 9 additions and 13 deletions.
22 changes: 9 additions & 13 deletions drivers/char/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static DEFINE_MUTEX(misc_mtx);
* Assigned numbers, used for dynamic minors
*/
#define DYNAMIC_MINORS 64 /* like dynamic majors */
static unsigned char misc_minors[DYNAMIC_MINORS / 8];
static DECLARE_BITMAP(misc_minors, DYNAMIC_MINORS);

#ifdef CONFIG_PROC_FS
static void *misc_seq_start(struct seq_file *seq, loff_t *pos)
Expand Down Expand Up @@ -196,27 +196,23 @@ int misc_register(struct miscdevice * misc)
}

if (misc->minor == MISC_DYNAMIC_MINOR) {
int i = DYNAMIC_MINORS;
while (--i >= 0)
if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)
break;
if (i<0) {
int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);
if (i >= DYNAMIC_MINORS) {
mutex_unlock(&misc_mtx);
return -EBUSY;
}
misc->minor = i;
misc->minor = DYNAMIC_MINORS - i - 1;
set_bit(i, misc_minors);
}

if (misc->minor < DYNAMIC_MINORS)
misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
dev = MKDEV(MISC_MAJOR, misc->minor);

misc->this_device = device_create(misc_class, misc->parent, dev,
misc, "%s", misc->name);
if (IS_ERR(misc->this_device)) {
int i = misc->minor;
int i = DYNAMIC_MINORS - misc->minor - 1;
if (i < DYNAMIC_MINORS && i >= 0)
misc_minors[i>>3] &= ~(1 << (i & 7));
clear_bit(i, misc_minors);
err = PTR_ERR(misc->this_device);
goto out;
}
Expand All @@ -243,7 +239,7 @@ int misc_register(struct miscdevice * misc)

int misc_deregister(struct miscdevice *misc)
{
int i = misc->minor;
int i = DYNAMIC_MINORS - misc->minor - 1;

if (list_empty(&misc->list))
return -EINVAL;
Expand All @@ -252,7 +248,7 @@ int misc_deregister(struct miscdevice *misc)
list_del(&misc->list);
device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
if (i < DYNAMIC_MINORS && i >= 0)
misc_minors[i>>3] &= ~(1 << (i & 7));
clear_bit(i, misc_minors);
mutex_unlock(&misc_mtx);
return 0;
}
Expand Down

0 comments on commit 1f2f38d

Please sign in to comment.