yes please. I see all kinds of overruns when resuming currently.
On Tue, Nov 30, 2010 at 07:37:06PM -0500, Ted Unangst wrote:
> there are a lot of usb devices that attach more than 16 things at once,
> notably the "endless stream of nonsense uhid" type gadgetry. increase the
> limit.
>
> this will use more kernel memory of course (only a tiny bit really, but
> whatever) so it's allocated at first open. if you don't use hotplug, you
> don't waste memory on it. we could in theory make the buffer quite a bit
> larger even now.
>
> Index: hotplug.c
> ===================================================================
> RCS file: /home/tedu/cvs/src/sys/dev/hotplug.c,v
> retrieving revision 1.9
> diff -u -r1.9 hotplug.c
> --- hotplug.c 9 Nov 2009 17:53:39 -0000 1.9
> +++ hotplug.c 30 Nov 2010 21:44:43 -0000
> @@ -26,13 +26,14 @@
> #include <sys/fcntl.h>
> #include <sys/hotplug.h>
> #include <sys/ioctl.h>
> +#include <sys/malloc.h>
> #include <sys/poll.h>
> #include <sys/vnode.h>
>
> -#define HOTPLUG_MAXEVENTS 16
> +#define HOTPLUG_MAXEVENTS 64
>
> static int opened;
> -static struct hotplug_event evqueue[HOTPLUG_MAXEVENTS];
> +static struct hotplug_event *evqueue;
> static int evqueue_head, evqueue_tail, evqueue_count;
> static struct selinfo hotplug_sel;
>
> @@ -88,6 +89,8 @@
> printf("hotplug: event lost, queue full\n");
> return (1);
> }
> + if (!evqueue)
> + return (1);
>
> evqueue[evqueue_head] = *he;
> evqueue_head = EVQUEUE_NEXT(evqueue_head);
> @@ -119,12 +122,22 @@
> int
> hotplugopen(dev_t dev, int flag, int mode, struct proc *p)
> {
> + struct hotplug_event *q;
> +
> if (minor(dev) != 0)
> return (ENXIO);
> if ((flag & FWRITE))
> return (EPERM);
> if (opened)
> return (EBUSY);
> + if (!evqueue) {
> + q = malloc(sizeof(*q) * HOTPLUG_MAXEVENTS, M_DEVBUF, M_WAITOK);
> + if (opened) {
> + free(q, M_DEVBUF);
> + return (EBUSY);
> + }
> + evqueue = q;
> + }
> opened = 1;
> return (0);
> }
> @@ -155,7 +168,7 @@
> if (flags & IO_NDELAY)
> return (EAGAIN);
>
> - error = tsleep(evqueue, PRIBIO | PCATCH, "htplev", 0);
> + error = tsleep(&evqueue, PRIBIO | PCATCH, "htplev", 0);
> if (error)
> return (error);
> goto again;