linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: linas@austin.ibm.com (Linas Vepstas)
To: juanslayton@dslextreme.com
Cc: linux-hotplug-devel@lists.sourceforge.net,
	Vojtech Pavlik <vojtech@suse.cz>,
	linux-kernel@vger.kernel.org, Alan Cox <alan@lxorguk.ukuu.org.uk>
Subject: [RFC/PATCH] Uncap max number of evdev devices [was: Re: need more
Date: Mon, 27 Nov 2006 18:56:51 +0000	[thread overview]
Message-ID: <20061127185651.GC10879@austin.ibm.com> (raw)
In-Reply-To: <7c50a14e8ca157b0abe20a.20061124170952.whnafynlgba@www.dslextreme.com>

On Fri, Nov 24, 2006 at 05:09:52PM -0800, juanslayton@dslextreme.com wrote:
> 
>      The object is to poll 20 usb keyboards in an elementary school
> classroom, each of which generates 2
> events (one keyboard and one mouse).  The stock kernel maxes out at event
> 31, leaving me 4
> keyboards short.
>      I thought to fix this by changing the definition of EVDEV_MINORS
> (line 12, evdev.c) from 32 to 64.  It almost worked.  The extra
> events showed up in /dev/input/* and /proc/bus/input/devices.
> However, attempting to access the new events in the application
> program only yields a segmentation fault.  Obviously I've got to change
> something else.

The problem is in input_register_handler() in drivers/input/input.c
which does things like 
if (input_table[handler->minor >> 5])
 and 
input_table[handler->minor >> 5] = handler;

which implicitly makes 32 the max. 

The kernel path below removes this limitation. Does it fix your problem?

--linas


The evdev code is limited to 32 input devices max, because
the generic input layer puts a 32-device cap on the number
of minor device numbers that a device driver can register.

This patch hacks around the 32-device limitation for 
the number of evdev drivers. Not clear to me if this
this is the best solution. 

Not-even-compile-tested.

Signed-off-by: Linas Vepstas <linas@austin.ibm.com>

----
 drivers/input/input.c |   16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

Index: linux-2.6.19-rc4-git3/drivers/input/input.c
=================================--- linux-2.6.19-rc4-git3.orig/drivers/input/input.c	2006-11-01 16:15:19.000000000 -0600
+++ linux-2.6.19-rc4-git3/drivers/input/input.c	2006-11-27 12:50:12.000000000 -0600
@@ -28,12 +28,16 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@s
 MODULE_DESCRIPTION("Input core");
 MODULE_LICENSE("GPL");
 
-#define INPUT_DEVICES	256
+#define INPUT_MINOR_BITS   8
+#define INPUT_DEVICES      (1<<INPUT_MINOR_BITS)
+#define MINOR_RANGE_BITS   6
+#define MINOR_RANGES       (1<<(INPUT_MINOR_BITS-MINOR_RANGE_BITS))
+#define TABLE_OFFSET(minor) ((minor)>>MINOR_RANGE_BITS)
 
 static LIST_HEAD(input_dev_list);
 static LIST_HEAD(input_handler_list);
 
-static struct input_handler *input_table[8];
+static struct input_handler *input_table[MINOR_RANGES];
 
 /**
  * input_event() - report new input event
@@ -1046,10 +1050,10 @@ int input_register_handler(struct input_
 	INIT_LIST_HEAD(&handler->h_list);
 
 	if (handler->fops != NULL) {
-		if (input_table[handler->minor >> 5])
+		if (input_table[TABLE_OFFSET(handler->minor)])
 			return -EBUSY;
 
-		input_table[handler->minor >> 5] = handler;
+		input_table[TABLE_OFFSET(handler->minor)] = handler;
 	}
 
 	list_add_tail(&handler->node, &input_handler_list);
@@ -1082,7 +1086,7 @@ void input_unregister_handler(struct inp
 	list_del_init(&handler->node);
 
 	if (handler->fops != NULL)
-		input_table[handler->minor >> 5] = NULL;
+		input_table[TABLE_OFFSET(handler->minor)] = NULL;
 
 	input_wakeup_procfs_readers();
 }
@@ -1090,7 +1094,7 @@ EXPORT_SYMBOL(input_unregister_handler);
 
 static int input_open_file(struct inode *inode, struct file *file)
 {
-	struct input_handler *handler = input_table[iminor(inode) >> 5];
+	struct input_handler *handler = input_table[TABLE_OFFSET(iminor(inode))];
 	const struct file_operations *old_fops, *new_fops = NULL;
 	int err;
 

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CIDÞVDEV
_______________________________________________
Linux-hotplug-devel mailing list  http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

  reply	other threads:[~2006-11-27 18:56 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-25  1:09 need more events juanslayton
2006-11-27 18:56 ` Linas Vepstas [this message]
2006-11-28  3:45   ` [RFC/PATCH] Uncap max number of evdev devices [was: Re: need more Dmitry Torokhov
2006-11-30 13:25   ` [RFC/PATCH] Uncap max number of evdev devices juanslayton

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=20061127185651.GC10879@austin.ibm.com \
    --to=linas@austin.ibm.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=juanslayton@dslextreme.com \
    --cc=linux-hotplug-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=vojtech@suse.cz \
    /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).