Lines Matching refs:u

102 static unsigned int evtchn_ring_offset(struct per_user_data *u,  in evtchn_ring_offset()  argument
105 return idx & (u->ring_size - 1); in evtchn_ring_offset()
108 static evtchn_port_t *evtchn_ring_entry(struct per_user_data *u, in evtchn_ring_entry() argument
111 return u->ring + evtchn_ring_offset(u, idx); in evtchn_ring_entry()
114 static int add_evtchn(struct per_user_data *u, struct user_evtchn *evtchn) in add_evtchn() argument
116 struct rb_node **new = &(u->evtchns.rb_node), *parent = NULL; in add_evtchn()
118 u->nr_evtchns++; in add_evtchn()
136 rb_insert_color(&evtchn->node, &u->evtchns); in add_evtchn()
141 static void del_evtchn(struct per_user_data *u, struct user_evtchn *evtchn) in del_evtchn() argument
143 u->nr_evtchns--; in del_evtchn()
144 rb_erase(&evtchn->node, &u->evtchns); in del_evtchn()
148 static struct user_evtchn *find_evtchn(struct per_user_data *u, unsigned port) in find_evtchn() argument
150 struct rb_node *node = u->evtchns.rb_node; in find_evtchn()
170 struct per_user_data *u = evtchn->user; in evtchn_interrupt() local
174 evtchn->port, u); in evtchn_interrupt()
179 spin_lock(&u->ring_prod_lock); in evtchn_interrupt()
181 if ((u->ring_prod - u->ring_cons) < u->ring_size) { in evtchn_interrupt()
182 *evtchn_ring_entry(u, u->ring_prod) = evtchn->port; in evtchn_interrupt()
184 if (u->ring_cons == u->ring_prod++) { in evtchn_interrupt()
185 wake_up_interruptible(&u->evtchn_wait); in evtchn_interrupt()
186 kill_fasync(&u->evtchn_async_queue, in evtchn_interrupt()
190 u->ring_overflow = 1; in evtchn_interrupt()
192 spin_unlock(&u->ring_prod_lock); in evtchn_interrupt()
202 struct per_user_data *u = file->private_data; in evtchn_read() local
214 mutex_lock(&u->ring_cons_mutex); in evtchn_read()
217 if (u->ring_overflow) in evtchn_read()
220 c = u->ring_cons; in evtchn_read()
221 p = u->ring_prod; in evtchn_read()
225 mutex_unlock(&u->ring_cons_mutex); in evtchn_read()
230 rc = wait_event_interruptible(u->evtchn_wait, in evtchn_read()
231 u->ring_cons != u->ring_prod); in evtchn_read()
237 if (((c ^ p) & u->ring_size) != 0) { in evtchn_read()
238 bytes1 = (u->ring_size - evtchn_ring_offset(u, c)) * in evtchn_read()
240 bytes2 = evtchn_ring_offset(u, p) * sizeof(evtchn_port_t); in evtchn_read()
256 if (copy_to_user(buf, evtchn_ring_entry(u, c), bytes1) || in evtchn_read()
258 copy_to_user(&buf[bytes1], &u->ring[0], bytes2))) in evtchn_read()
261 u->ring_cons += (bytes1 + bytes2) / sizeof(evtchn_port_t); in evtchn_read()
265 mutex_unlock(&u->ring_cons_mutex); in evtchn_read()
274 struct per_user_data *u = file->private_data; in evtchn_write() local
293 mutex_lock(&u->bind_mutex); in evtchn_write()
299 evtchn = find_evtchn(u, port); in evtchn_write()
306 mutex_unlock(&u->bind_mutex); in evtchn_write()
315 static int evtchn_resize_ring(struct per_user_data *u) in evtchn_resize_ring() argument
324 if (u->nr_evtchns <= u->ring_size) in evtchn_resize_ring()
327 if (u->ring_size == 0) in evtchn_resize_ring()
330 new_size = 2 * u->ring_size; in evtchn_resize_ring()
336 old_ring = u->ring; in evtchn_resize_ring()
342 mutex_lock(&u->ring_cons_mutex); in evtchn_resize_ring()
343 spin_lock_irq(&u->ring_prod_lock); in evtchn_resize_ring()
356 memcpy(new_ring, old_ring, u->ring_size * sizeof(*u->ring)); in evtchn_resize_ring()
357 memcpy(new_ring + u->ring_size, old_ring, in evtchn_resize_ring()
358 u->ring_size * sizeof(*u->ring)); in evtchn_resize_ring()
360 u->ring = new_ring; in evtchn_resize_ring()
361 u->ring_size = new_size; in evtchn_resize_ring()
363 spin_unlock_irq(&u->ring_prod_lock); in evtchn_resize_ring()
364 mutex_unlock(&u->ring_cons_mutex); in evtchn_resize_ring()
371 static int evtchn_bind_to_user(struct per_user_data *u, int port) in evtchn_bind_to_user() argument
390 evtchn->user = u; in evtchn_bind_to_user()
394 rc = add_evtchn(u, evtchn); in evtchn_bind_to_user()
398 rc = evtchn_resize_ring(u); in evtchn_bind_to_user()
403 u->name, evtchn); in evtchn_bind_to_user()
415 del_evtchn(u, evtchn); in evtchn_bind_to_user()
419 static void evtchn_unbind_from_user(struct per_user_data *u, in evtchn_unbind_from_user() argument
428 del_evtchn(u, evtchn); in evtchn_unbind_from_user()
435 struct per_user_data *u = file->private_data; in evtchn_ioctl() local
439 mutex_lock(&u->bind_mutex); in evtchn_ioctl()
457 rc = evtchn_bind_to_user(u, bind_virq.port); in evtchn_ioctl()
478 rc = evtchn_bind_to_user(u, bind_interdomain.local_port); in evtchn_ioctl()
499 rc = evtchn_bind_to_user(u, alloc_unbound.port); in evtchn_ioctl()
518 evtchn = find_evtchn(u, unbind.port); in evtchn_ioctl()
523 evtchn_unbind_from_user(u, evtchn); in evtchn_ioctl()
537 evtchn = find_evtchn(u, notify.port); in evtchn_ioctl()
547 mutex_lock(&u->ring_cons_mutex); in evtchn_ioctl()
548 spin_lock_irq(&u->ring_prod_lock); in evtchn_ioctl()
549 u->ring_cons = u->ring_prod = u->ring_overflow = 0; in evtchn_ioctl()
550 spin_unlock_irq(&u->ring_prod_lock); in evtchn_ioctl()
551 mutex_unlock(&u->ring_cons_mutex); in evtchn_ioctl()
560 mutex_unlock(&u->bind_mutex); in evtchn_ioctl()
568 struct per_user_data *u = file->private_data; in evtchn_poll() local
570 poll_wait(file, &u->evtchn_wait, wait); in evtchn_poll()
571 if (u->ring_cons != u->ring_prod) in evtchn_poll()
573 if (u->ring_overflow) in evtchn_poll()
580 struct per_user_data *u = filp->private_data; in evtchn_fasync() local
581 return fasync_helper(fd, filp, on, &u->evtchn_async_queue); in evtchn_fasync()
586 struct per_user_data *u; in evtchn_open() local
588 u = kzalloc(sizeof(*u), GFP_KERNEL); in evtchn_open()
589 if (u == NULL) in evtchn_open()
592 u->name = kasprintf(GFP_KERNEL, "evtchn:%s", current->comm); in evtchn_open()
593 if (u->name == NULL) { in evtchn_open()
594 kfree(u); in evtchn_open()
598 init_waitqueue_head(&u->evtchn_wait); in evtchn_open()
600 mutex_init(&u->bind_mutex); in evtchn_open()
601 mutex_init(&u->ring_cons_mutex); in evtchn_open()
602 spin_lock_init(&u->ring_prod_lock); in evtchn_open()
604 filp->private_data = u; in evtchn_open()
611 struct per_user_data *u = filp->private_data; in evtchn_release() local
614 while ((node = u->evtchns.rb_node)) { in evtchn_release()
619 evtchn_unbind_from_user(u, evtchn); in evtchn_release()
622 evtchn_free_ring(u->ring); in evtchn_release()
623 kfree(u->name); in evtchn_release()
624 kfree(u); in evtchn_release()