From mboxrd@z Thu Jan 1 00:00:00 1970 From: linas@austin.ibm.com (Linas Vepstas) Date: Mon, 27 Nov 2006 18:56:51 +0000 Subject: [RFC/PATCH] Uncap max number of evdev devices [was: Re: need more Message-Id: <20061127185651.GC10879@austin.ibm.com> List-Id: References: <7c50a14e8ca157b0abe20a.20061124170952.whnafynlgba@www.dslextreme.com> In-Reply-To: <7c50a14e8ca157b0abe20a.20061124170952.whnafynlgba@www.dslextreme.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: juanslayton@dslextreme.com Cc: linux-hotplug-devel@lists.sourceforge.net, Vojtech Pavlik , linux-kernel@vger.kernel.org, Alan Cox On Fri, Nov 24, 2006 at 05:09:52PM -0800, juanslayton@dslextreme.com wrote: >=20 > 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=20 if (input_table[handler->minor >> 5]) and=20 input_table[handler->minor >> 5] =3D handler; which implicitly makes 32 the max.=20 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=20 the number of evdev drivers. Not clear to me if this this is the best solution.=20 Not-even-compile-tested. Signed-off-by: Linas Vepstas ---- drivers/input/input.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) Index: linux-2.6.19-rc4-git3/drivers/input/input.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D--- 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.0000000= 00 -0600 @@ -28,12 +28,16 @@ MODULE_AUTHOR("Vojtech Pavlik >MINOR_RANGE_BITS) =20 static LIST_HEAD(input_dev_list); static LIST_HEAD(input_handler_list); =20 -static struct input_handler *input_table[8]; +static struct input_handler *input_table[MINOR_RANGES]; =20 /** * input_event() - report new input event @@ -1046,10 +1050,10 @@ int input_register_handler(struct input_ INIT_LIST_HEAD(&handler->h_list); =20 if (handler->fops !=3D NULL) { - if (input_table[handler->minor >> 5]) + if (input_table[TABLE_OFFSET(handler->minor)]) return -EBUSY; =20 - input_table[handler->minor >> 5] =3D handler; + input_table[TABLE_OFFSET(handler->minor)] =3D handler; } =20 list_add_tail(&handler->node, &input_handler_list); @@ -1082,7 +1086,7 @@ void input_unregister_handler(struct inp list_del_init(&handler->node); =20 if (handler->fops !=3D NULL) - input_table[handler->minor >> 5] =3D NULL; + input_table[TABLE_OFFSET(handler->minor)] =3D NULL; =20 input_wakeup_procfs_readers(); } @@ -1090,7 +1094,7 @@ EXPORT_SYMBOL(input_unregister_handler); =20 static int input_open_file(struct inode *inode, struct file *file) { - struct input_handler *handler =3D input_table[iminor(inode) >> 5]; + struct input_handler *handler =3D input_table[TABLE_OFFSET(iminor(inode))= ]; const struct file_operations *old_fops, *new_fops =3D NULL; int err; =20 ------------------------------------------------------------------------- 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=3Djoin.php&p=3Dsourceforge&CID=DEVD= EV _______________________________________________ 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