Lines Matching refs:ctx
54 __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) in eventfd_signal() argument
58 spin_lock_irqsave(&ctx->wqh.lock, flags); in eventfd_signal()
59 if (ULLONG_MAX - ctx->count < n) in eventfd_signal()
60 n = ULLONG_MAX - ctx->count; in eventfd_signal()
61 ctx->count += n; in eventfd_signal()
62 if (waitqueue_active(&ctx->wqh)) in eventfd_signal()
63 wake_up_locked_poll(&ctx->wqh, POLLIN); in eventfd_signal()
64 spin_unlock_irqrestore(&ctx->wqh.lock, flags); in eventfd_signal()
70 static void eventfd_free_ctx(struct eventfd_ctx *ctx) in eventfd_free_ctx() argument
72 kfree(ctx); in eventfd_free_ctx()
77 struct eventfd_ctx *ctx = container_of(kref, struct eventfd_ctx, kref); in eventfd_free() local
79 eventfd_free_ctx(ctx); in eventfd_free()
88 struct eventfd_ctx *eventfd_ctx_get(struct eventfd_ctx *ctx) in eventfd_ctx_get() argument
90 kref_get(&ctx->kref); in eventfd_ctx_get()
91 return ctx; in eventfd_ctx_get()
102 void eventfd_ctx_put(struct eventfd_ctx *ctx) in eventfd_ctx_put() argument
104 kref_put(&ctx->kref, eventfd_free); in eventfd_ctx_put()
110 struct eventfd_ctx *ctx = file->private_data; in eventfd_release() local
112 wake_up_poll(&ctx->wqh, POLLHUP); in eventfd_release()
113 eventfd_ctx_put(ctx); in eventfd_release()
119 struct eventfd_ctx *ctx = file->private_data; in eventfd_poll() local
123 poll_wait(file, &ctx->wqh, wait); in eventfd_poll()
125 count = ctx->count; in eventfd_poll()
137 static void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt) in eventfd_ctx_do_read() argument
139 *cnt = (ctx->flags & EFD_SEMAPHORE) ? 1 : ctx->count; in eventfd_ctx_do_read()
140 ctx->count -= *cnt; in eventfd_ctx_do_read()
156 int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_t *wait, in eventfd_ctx_remove_wait_queue() argument
161 spin_lock_irqsave(&ctx->wqh.lock, flags); in eventfd_ctx_remove_wait_queue()
162 eventfd_ctx_do_read(ctx, cnt); in eventfd_ctx_remove_wait_queue()
163 __remove_wait_queue(&ctx->wqh, wait); in eventfd_ctx_remove_wait_queue()
164 if (*cnt != 0 && waitqueue_active(&ctx->wqh)) in eventfd_ctx_remove_wait_queue()
165 wake_up_locked_poll(&ctx->wqh, POLLOUT); in eventfd_ctx_remove_wait_queue()
166 spin_unlock_irqrestore(&ctx->wqh.lock, flags); in eventfd_ctx_remove_wait_queue()
186 ssize_t eventfd_ctx_read(struct eventfd_ctx *ctx, int no_wait, __u64 *cnt) in eventfd_ctx_read() argument
191 spin_lock_irq(&ctx->wqh.lock); in eventfd_ctx_read()
194 if (ctx->count > 0) in eventfd_ctx_read()
197 __add_wait_queue(&ctx->wqh, &wait); in eventfd_ctx_read()
200 if (ctx->count > 0) { in eventfd_ctx_read()
208 spin_unlock_irq(&ctx->wqh.lock); in eventfd_ctx_read()
210 spin_lock_irq(&ctx->wqh.lock); in eventfd_ctx_read()
212 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_ctx_read()
216 eventfd_ctx_do_read(ctx, cnt); in eventfd_ctx_read()
217 if (waitqueue_active(&ctx->wqh)) in eventfd_ctx_read()
218 wake_up_locked_poll(&ctx->wqh, POLLOUT); in eventfd_ctx_read()
220 spin_unlock_irq(&ctx->wqh.lock); in eventfd_ctx_read()
229 struct eventfd_ctx *ctx = file->private_data; in eventfd_read() local
235 res = eventfd_ctx_read(ctx, file->f_flags & O_NONBLOCK, &cnt); in eventfd_read()
245 struct eventfd_ctx *ctx = file->private_data; in eventfd_write() local
256 spin_lock_irq(&ctx->wqh.lock); in eventfd_write()
258 if (ULLONG_MAX - ctx->count > ucnt) in eventfd_write()
261 __add_wait_queue(&ctx->wqh, &wait); in eventfd_write()
264 if (ULLONG_MAX - ctx->count > ucnt) { in eventfd_write()
272 spin_unlock_irq(&ctx->wqh.lock); in eventfd_write()
274 spin_lock_irq(&ctx->wqh.lock); in eventfd_write()
276 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_write()
280 ctx->count += ucnt; in eventfd_write()
281 if (waitqueue_active(&ctx->wqh)) in eventfd_write()
282 wake_up_locked_poll(&ctx->wqh, POLLIN); in eventfd_write()
284 spin_unlock_irq(&ctx->wqh.lock); in eventfd_write()
292 struct eventfd_ctx *ctx = f->private_data; in eventfd_show_fdinfo() local
294 spin_lock_irq(&ctx->wqh.lock); in eventfd_show_fdinfo()
296 (unsigned long long)ctx->count); in eventfd_show_fdinfo()
297 spin_unlock_irq(&ctx->wqh.lock); in eventfd_show_fdinfo()
349 struct eventfd_ctx *ctx; in eventfd_ctx_fdget() local
353 ctx = eventfd_ctx_fileget(f.file); in eventfd_ctx_fdget()
355 return ctx; in eventfd_ctx_fdget()
394 struct eventfd_ctx *ctx; in eventfd_file_create() local
403 ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); in eventfd_file_create()
404 if (!ctx) in eventfd_file_create()
407 kref_init(&ctx->kref); in eventfd_file_create()
408 init_waitqueue_head(&ctx->wqh); in eventfd_file_create()
409 ctx->count = count; in eventfd_file_create()
410 ctx->flags = flags; in eventfd_file_create()
412 file = anon_inode_getfile("[eventfd]", &eventfd_fops, ctx, in eventfd_file_create()
415 eventfd_free_ctx(ctx); in eventfd_file_create()