• Adam Kropelin's avatar
    [PATCH] USB: hiddev HIDIOCGREPORT not blocking in 2.6 · f3c64148
    Adam Kropelin authored
    I've noticed in 2.6 kernels that HIDIOCGREPORT does not wait for io
    completion before returning to the caller. This creates a few unpleasant
    issues for userspace:
    
    First, code sequences such as...
    
            ioctl(fd, HIDIOCGREPORT, &rinfo);
            ioctl(fd, HIDIOCGUSAGE, &uinfo);
            ioctl(fd, HIDIOCGSTRING, &sdesc);
    
    ...that used to work in 2.4 now fail in 2.6 if the device takes more
    than a few milliseconds to respond to HIDIOCGREPORT. (I'm seeing this
    issue on APC UPSes, FWIW.)
    
    Second, userspace code can easily flood the kernel with control messages
    since the kernel provides no "backpressure". The result is a lot of
    "hid-core.c: control queue full" errors and lost reports.
    
    2.6 hid-core.c appears to submit the request and return immediately.
    Although the 2.4 code differs significantly, I traced the call path to
    usb-core.c, which seems to block with a timeout, so the code supports my
    userspace observation. (Assuming I didn't misread it.)
    f3c64148
hiddev.c 19.6 KB