pr_err_once("UHID_CREATE from different security context by process %d (%s), this is not allowed.\n",
#include <linux/atomic.h>
#include <linux/compat.h>
#include <linux/device.h>
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/spinlock.h>
struct uhid_event input_buf;
struct uhid_event *outq[UHID_BUFSIZE];
struct mutex report_lock;
wait_queue_head_t report_wait;
struct uhid_event report_buf;
struct work_struct worker;
static struct miscdevice uhid_misc;
static void uhid_device_add_worker(struct work_struct *work)
struct uhid_device *uhid = container_of(work, struct uhid_device, worker);
ret = hid_add_device(uhid->hid);
hid_err(uhid->hid, "Cannot register HID device: error %d\n", ret);
hid_destroy_device(uhid->hid);
static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev)
newhead = (uhid->head + 1) % UHID_BUFSIZE;
if (newhead != uhid->tail) {
uhid->outq[uhid->head] = ev;
wake_up_interruptible(&uhid->waitq);
hid_warn(uhid->hid, "Output queue is full\n");
static int uhid_queue_event(struct uhid_device *uhid, __u32 event)