Lines Matching full:client

75 static bool __evdev_is_filtered(struct evdev_client *client,  in __evdev_is_filtered()  argument
87 mask = client->evmasks[0]; in __evdev_is_filtered()
96 mask = client->evmasks[type]; in __evdev_is_filtered()
100 /* flush queued events of type @type, caller must hold client->buffer_lock */
101 static void __evdev_flush_queue(struct evdev_client *client, unsigned int type) in __evdev_flush_queue() argument
104 unsigned int mask = client->bufsize - 1; in __evdev_flush_queue()
110 head = client->tail; in __evdev_flush_queue()
111 client->packet_head = client->tail; in __evdev_flush_queue()
116 for (i = client->tail; i != client->head; i = (i + 1) & mask) { in __evdev_flush_queue()
117 ev = &client->buffer[i]; in __evdev_flush_queue()
128 client->buffer[head] = *ev; in __evdev_flush_queue()
136 client->packet_head = head; in __evdev_flush_queue()
140 client->head = head; in __evdev_flush_queue()
143 static void __evdev_queue_syn_dropped(struct evdev_client *client) in __evdev_queue_syn_dropped() argument
145 ktime_t *ev_time = input_get_timestamp(client->evdev->handle.dev); in __evdev_queue_syn_dropped()
146 struct timespec64 ts = ktime_to_timespec64(ev_time[client->clk_type]); in __evdev_queue_syn_dropped()
155 client->buffer[client->head++] = ev; in __evdev_queue_syn_dropped()
156 client->head &= client->bufsize - 1; in __evdev_queue_syn_dropped()
158 if (unlikely(client->head == client->tail)) { in __evdev_queue_syn_dropped()
160 client->tail = (client->head - 1) & (client->bufsize - 1); in __evdev_queue_syn_dropped()
161 client->packet_head = client->tail; in __evdev_queue_syn_dropped()
165 static void evdev_queue_syn_dropped(struct evdev_client *client) in evdev_queue_syn_dropped() argument
169 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_queue_syn_dropped()
170 __evdev_queue_syn_dropped(client); in evdev_queue_syn_dropped()
171 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_queue_syn_dropped()
174 static int evdev_set_clk_type(struct evdev_client *client, unsigned int clkid) in evdev_set_clk_type() argument
194 if (client->clk_type != clk_type) { in evdev_set_clk_type()
195 client->clk_type = clk_type; in evdev_set_clk_type()
201 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_set_clk_type()
203 if (client->head != client->tail) { in evdev_set_clk_type()
204 client->packet_head = client->head = client->tail; in evdev_set_clk_type()
205 __evdev_queue_syn_dropped(client); in evdev_set_clk_type()
208 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_set_clk_type()
214 static void __pass_event(struct evdev_client *client, in __pass_event() argument
217 client->buffer[client->head++] = *event; in __pass_event()
218 client->head &= client->bufsize - 1; in __pass_event()
220 if (unlikely(client->head == client->tail)) { in __pass_event()
225 client->tail = (client->head - 2) & (client->bufsize - 1); in __pass_event()
227 client->buffer[client->tail] = (struct input_event) { in __pass_event()
235 client->packet_head = client->tail; in __pass_event()
239 client->packet_head = client->head; in __pass_event()
240 kill_fasync(&client->fasync, SIGIO, POLL_IN); in __pass_event()
244 static void evdev_pass_values(struct evdev_client *client, in evdev_pass_values() argument
253 if (client->revoked) in evdev_pass_values()
256 ts = ktime_to_timespec64(ev_time[client->clk_type]); in evdev_pass_values()
261 spin_lock(&client->buffer_lock); in evdev_pass_values()
264 if (__evdev_is_filtered(client, v->type, v->code)) in evdev_pass_values()
269 if (client->packet_head == client->head) in evdev_pass_values()
278 __pass_event(client, &event); in evdev_pass_values()
281 spin_unlock(&client->buffer_lock); in evdev_pass_values()
284 wake_up_interruptible_poll(&client->wait, in evdev_pass_values()
295 struct evdev_client *client; in evdev_events() local
300 client = rcu_dereference(evdev->grab); in evdev_events()
302 if (client) in evdev_events()
303 evdev_pass_values(client, vals, count, ev_time); in evdev_events()
305 list_for_each_entry_rcu(client, &evdev->client_list, node) in evdev_events()
306 evdev_pass_values(client, vals, count, ev_time); in evdev_events()
324 struct evdev_client *client = file->private_data; in evdev_fasync() local
326 return fasync_helper(fd, file, on, &client->fasync); in evdev_fasync()
341 static int evdev_grab(struct evdev *evdev, struct evdev_client *client) in evdev_grab() argument
352 rcu_assign_pointer(evdev->grab, client); in evdev_grab()
357 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) in evdev_ungrab() argument
362 if (grab != client) in evdev_ungrab()
373 struct evdev_client *client) in evdev_attach_client() argument
376 list_add_tail_rcu(&client->node, &evdev->client_list); in evdev_attach_client()
381 struct evdev_client *client) in evdev_detach_client() argument
384 list_del_rcu(&client->node); in evdev_detach_client()
425 struct evdev_client *client; in evdev_hangup() local
428 list_for_each_entry(client, &evdev->client_list, node) { in evdev_hangup()
429 kill_fasync(&client->fasync, SIGIO, POLL_HUP); in evdev_hangup()
430 wake_up_interruptible_poll(&client->wait, EPOLLHUP | EPOLLERR); in evdev_hangup()
437 struct evdev_client *client = file->private_data; in evdev_release() local
438 struct evdev *evdev = client->evdev; in evdev_release()
443 if (evdev->exist && !client->revoked) in evdev_release()
446 evdev_ungrab(evdev, client); in evdev_release()
449 evdev_detach_client(evdev, client); in evdev_release()
452 bitmap_free(client->evmasks[i]); in evdev_release()
454 kvfree(client); in evdev_release()
474 struct evdev_client *client; in evdev_open() local
477 client = kvzalloc(struct_size(client, buffer, bufsize), GFP_KERNEL); in evdev_open()
478 if (!client) in evdev_open()
481 init_waitqueue_head(&client->wait); in evdev_open()
482 client->bufsize = bufsize; in evdev_open()
483 spin_lock_init(&client->buffer_lock); in evdev_open()
484 client->evdev = evdev; in evdev_open()
485 evdev_attach_client(evdev, client); in evdev_open()
491 file->private_data = client; in evdev_open()
497 evdev_detach_client(evdev, client); in evdev_open()
498 kvfree(client); in evdev_open()
505 struct evdev_client *client = file->private_data; in evdev_write() local
506 struct evdev *evdev = client->evdev; in evdev_write()
517 if (!evdev->exist || client->revoked) { in evdev_write()
540 static int evdev_fetch_next_event(struct evdev_client *client, in evdev_fetch_next_event() argument
545 spin_lock_irq(&client->buffer_lock); in evdev_fetch_next_event()
547 have_event = client->packet_head != client->tail; in evdev_fetch_next_event()
549 *event = client->buffer[client->tail++]; in evdev_fetch_next_event()
550 client->tail &= client->bufsize - 1; in evdev_fetch_next_event()
553 spin_unlock_irq(&client->buffer_lock); in evdev_fetch_next_event()
561 struct evdev_client *client = file->private_data; in evdev_read() local
562 struct evdev *evdev = client->evdev; in evdev_read()
571 if (!evdev->exist || client->revoked) in evdev_read()
574 if (client->packet_head == client->tail && in evdev_read()
586 evdev_fetch_next_event(client, &event)) { in evdev_read()
598 error = wait_event_interruptible(client->wait, in evdev_read()
599 client->packet_head != client->tail || in evdev_read()
600 !evdev->exist || client->revoked); in evdev_read()
612 struct evdev_client *client = file->private_data; in evdev_poll() local
613 struct evdev *evdev = client->evdev; in evdev_poll()
616 poll_wait(file, &client->wait, wait); in evdev_poll()
618 if (evdev->exist && !client->revoked) in evdev_poll()
623 if (client->packet_head != client->tail) in evdev_poll()
875 * of the same type from the client's queue. Otherwise, they might end up
876 * with duplicate events, which can screw up client's state tracking.
886 static int evdev_handle_get_val(struct evdev_client *client, in evdev_handle_get_val() argument
900 spin_lock(&client->buffer_lock); in evdev_handle_get_val()
906 __evdev_flush_queue(client, type); in evdev_handle_get_val()
908 spin_unlock_irq(&client->buffer_lock); in evdev_handle_get_val()
912 evdev_queue_syn_dropped(client); in evdev_handle_get_val()
943 static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, in evdev_revoke() argument
946 client->revoked = true; in evdev_revoke()
947 evdev_ungrab(evdev, client); in evdev_revoke()
949 wake_up_interruptible_poll(&client->wait, EPOLLHUP | EPOLLERR); in evdev_revoke()
955 static int evdev_set_mask(struct evdev_client *client, in evdev_set_mask() argument
980 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_set_mask()
981 oldmask = client->evmasks[type]; in evdev_set_mask()
982 client->evmasks[type] = mask; in evdev_set_mask()
983 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_set_mask()
991 static int evdev_get_mask(struct evdev_client *client, in evdev_get_mask() argument
1008 mask = client->evmasks[type]; in evdev_get_mask()
1032 struct evdev_client *client = file->private_data; in evdev_do_ioctl() local
1033 struct evdev *evdev = client->evdev; in evdev_do_ioctl()
1088 return evdev_grab(evdev, client); in evdev_do_ioctl()
1090 return evdev_ungrab(evdev, client); in evdev_do_ioctl()
1096 return evdev_revoke(evdev, client, file); in evdev_do_ioctl()
1105 return evdev_get_mask(client, in evdev_do_ioctl()
1117 return evdev_set_mask(client, in evdev_do_ioctl()
1126 return evdev_set_clk_type(client, i); in evdev_do_ioctl()
1155 return evdev_handle_get_val(client, dev, EV_KEY, dev->key, in evdev_do_ioctl()
1159 return evdev_handle_get_val(client, dev, EV_LED, dev->led, in evdev_do_ioctl()
1163 return evdev_handle_get_val(client, dev, EV_SND, dev->snd, in evdev_do_ioctl()
1167 return evdev_handle_get_val(client, dev, EV_SW, dev->sw, in evdev_do_ioctl()
1259 struct evdev_client *client = file->private_data; in evdev_ioctl_handler() local
1260 struct evdev *evdev = client->evdev; in evdev_ioctl_handler()
1267 if (!evdev->exist || client->revoked) { in evdev_ioctl_handler()