Lines Matching refs:u

83 static int add_evtchn(struct per_user_data *u, struct user_evtchn *evtchn)  in add_evtchn()  argument
85 struct rb_node **new = &(u->evtchns.rb_node), *parent = NULL; in add_evtchn()
103 rb_insert_color(&evtchn->node, &u->evtchns); in add_evtchn()
108 static void del_evtchn(struct per_user_data *u, struct user_evtchn *evtchn) in del_evtchn() argument
110 rb_erase(&evtchn->node, &u->evtchns); in del_evtchn()
114 static struct user_evtchn *find_evtchn(struct per_user_data *u, unsigned port) in find_evtchn() argument
116 struct rb_node *node = u->evtchns.rb_node; in find_evtchn()
136 struct per_user_data *u = evtchn->user; in evtchn_interrupt() local
140 evtchn->port, u); in evtchn_interrupt()
145 spin_lock(&u->ring_prod_lock); in evtchn_interrupt()
147 if ((u->ring_prod - u->ring_cons) < EVTCHN_RING_SIZE) { in evtchn_interrupt()
148 u->ring[EVTCHN_RING_MASK(u->ring_prod)] = evtchn->port; in evtchn_interrupt()
150 if (u->ring_cons == u->ring_prod++) { in evtchn_interrupt()
151 wake_up_interruptible(&u->evtchn_wait); in evtchn_interrupt()
152 kill_fasync(&u->evtchn_async_queue, in evtchn_interrupt()
156 u->ring_overflow = 1; in evtchn_interrupt()
158 spin_unlock(&u->ring_prod_lock); in evtchn_interrupt()
168 struct per_user_data *u = file->private_data; in evtchn_read() local
180 mutex_lock(&u->ring_cons_mutex); in evtchn_read()
183 if (u->ring_overflow) in evtchn_read()
186 c = u->ring_cons; in evtchn_read()
187 p = u->ring_prod; in evtchn_read()
191 mutex_unlock(&u->ring_cons_mutex); in evtchn_read()
196 rc = wait_event_interruptible(u->evtchn_wait, in evtchn_read()
197 u->ring_cons != u->ring_prod); in evtchn_read()
222 if (copy_to_user(buf, &u->ring[EVTCHN_RING_MASK(c)], bytes1) || in evtchn_read()
224 copy_to_user(&buf[bytes1], &u->ring[0], bytes2))) in evtchn_read()
227 u->ring_cons += (bytes1 + bytes2) / sizeof(evtchn_port_t); in evtchn_read()
231 mutex_unlock(&u->ring_cons_mutex); in evtchn_read()
240 struct per_user_data *u = file->private_data; in evtchn_write() local
259 mutex_lock(&u->bind_mutex); in evtchn_write()
265 evtchn = find_evtchn(u, port); in evtchn_write()
272 mutex_unlock(&u->bind_mutex); in evtchn_write()
281 static int evtchn_bind_to_user(struct per_user_data *u, int port) in evtchn_bind_to_user() argument
300 evtchn->user = u; in evtchn_bind_to_user()
304 rc = add_evtchn(u, evtchn); in evtchn_bind_to_user()
309 u->name, evtchn); in evtchn_bind_to_user()
321 del_evtchn(u, evtchn); in evtchn_bind_to_user()
325 static void evtchn_unbind_from_user(struct per_user_data *u, in evtchn_unbind_from_user() argument
334 del_evtchn(u, evtchn); in evtchn_unbind_from_user()
341 struct per_user_data *u = file->private_data; in evtchn_ioctl() local
345 mutex_lock(&u->bind_mutex); in evtchn_ioctl()
363 rc = evtchn_bind_to_user(u, bind_virq.port); in evtchn_ioctl()
384 rc = evtchn_bind_to_user(u, bind_interdomain.local_port); in evtchn_ioctl()
405 rc = evtchn_bind_to_user(u, alloc_unbound.port); in evtchn_ioctl()
424 evtchn = find_evtchn(u, unbind.port); in evtchn_ioctl()
429 evtchn_unbind_from_user(u, evtchn); in evtchn_ioctl()
443 evtchn = find_evtchn(u, notify.port); in evtchn_ioctl()
453 mutex_lock(&u->ring_cons_mutex); in evtchn_ioctl()
454 spin_lock_irq(&u->ring_prod_lock); in evtchn_ioctl()
455 u->ring_cons = u->ring_prod = u->ring_overflow = 0; in evtchn_ioctl()
456 spin_unlock_irq(&u->ring_prod_lock); in evtchn_ioctl()
457 mutex_unlock(&u->ring_cons_mutex); in evtchn_ioctl()
466 mutex_unlock(&u->bind_mutex); in evtchn_ioctl()
474 struct per_user_data *u = file->private_data; in evtchn_poll() local
476 poll_wait(file, &u->evtchn_wait, wait); in evtchn_poll()
477 if (u->ring_cons != u->ring_prod) in evtchn_poll()
479 if (u->ring_overflow) in evtchn_poll()
486 struct per_user_data *u = filp->private_data; in evtchn_fasync() local
487 return fasync_helper(fd, filp, on, &u->evtchn_async_queue); in evtchn_fasync()
492 struct per_user_data *u; in evtchn_open() local
494 u = kzalloc(sizeof(*u), GFP_KERNEL); in evtchn_open()
495 if (u == NULL) in evtchn_open()
498 u->name = kasprintf(GFP_KERNEL, "evtchn:%s", current->comm); in evtchn_open()
499 if (u->name == NULL) { in evtchn_open()
500 kfree(u); in evtchn_open()
504 init_waitqueue_head(&u->evtchn_wait); in evtchn_open()
506 u->ring = (evtchn_port_t *)__get_free_page(GFP_KERNEL); in evtchn_open()
507 if (u->ring == NULL) { in evtchn_open()
508 kfree(u->name); in evtchn_open()
509 kfree(u); in evtchn_open()
513 mutex_init(&u->bind_mutex); in evtchn_open()
514 mutex_init(&u->ring_cons_mutex); in evtchn_open()
515 spin_lock_init(&u->ring_prod_lock); in evtchn_open()
517 filp->private_data = u; in evtchn_open()
524 struct per_user_data *u = filp->private_data; in evtchn_release() local
527 while ((node = u->evtchns.rb_node)) { in evtchn_release()
532 evtchn_unbind_from_user(u, evtchn); in evtchn_release()
535 free_page((unsigned long)u->ring); in evtchn_release()
536 kfree(u->name); in evtchn_release()
537 kfree(u); in evtchn_release()