• Home
  • Raw
  • Download

Lines Matching refs:ctx

59 __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n)  in eventfd_signal()  argument
63 spin_lock_irqsave(&ctx->wqh.lock, flags); in eventfd_signal()
64 if (ULLONG_MAX - ctx->count < n) in eventfd_signal()
65 n = ULLONG_MAX - ctx->count; in eventfd_signal()
66 ctx->count += n; in eventfd_signal()
67 if (waitqueue_active(&ctx->wqh)) in eventfd_signal()
68 wake_up_locked_poll(&ctx->wqh, EPOLLIN); in eventfd_signal()
69 spin_unlock_irqrestore(&ctx->wqh.lock, flags); in eventfd_signal()
75 static void eventfd_free_ctx(struct eventfd_ctx *ctx) in eventfd_free_ctx() argument
77 if (ctx->id >= 0) in eventfd_free_ctx()
78 ida_simple_remove(&eventfd_ida, ctx->id); in eventfd_free_ctx()
79 kfree(ctx); in eventfd_free_ctx()
84 struct eventfd_ctx *ctx = container_of(kref, struct eventfd_ctx, kref); in eventfd_free() local
86 eventfd_free_ctx(ctx); in eventfd_free()
96 void eventfd_ctx_put(struct eventfd_ctx *ctx) in eventfd_ctx_put() argument
98 kref_put(&ctx->kref, eventfd_free); in eventfd_ctx_put()
104 struct eventfd_ctx *ctx = file->private_data; in eventfd_release() local
106 wake_up_poll(&ctx->wqh, EPOLLHUP); in eventfd_release()
107 eventfd_ctx_put(ctx); in eventfd_release()
113 struct eventfd_ctx *ctx = file->private_data; in eventfd_poll() local
117 poll_wait(file, &ctx->wqh, wait); in eventfd_poll()
157 count = READ_ONCE(ctx->count); in eventfd_poll()
169 static void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt) in eventfd_ctx_do_read() argument
171 *cnt = (ctx->flags & EFD_SEMAPHORE) ? 1 : ctx->count; in eventfd_ctx_do_read()
172 ctx->count -= *cnt; in eventfd_ctx_do_read()
188 int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait, in eventfd_ctx_remove_wait_queue() argument
193 spin_lock_irqsave(&ctx->wqh.lock, flags); in eventfd_ctx_remove_wait_queue()
194 eventfd_ctx_do_read(ctx, cnt); in eventfd_ctx_remove_wait_queue()
195 __remove_wait_queue(&ctx->wqh, wait); in eventfd_ctx_remove_wait_queue()
196 if (*cnt != 0 && waitqueue_active(&ctx->wqh)) in eventfd_ctx_remove_wait_queue()
197 wake_up_locked_poll(&ctx->wqh, EPOLLOUT); in eventfd_ctx_remove_wait_queue()
198 spin_unlock_irqrestore(&ctx->wqh.lock, flags); in eventfd_ctx_remove_wait_queue()
207 struct eventfd_ctx *ctx = file->private_data; in eventfd_read() local
215 spin_lock_irq(&ctx->wqh.lock); in eventfd_read()
217 if (ctx->count > 0) in eventfd_read()
220 __add_wait_queue(&ctx->wqh, &wait); in eventfd_read()
223 if (ctx->count > 0) { in eventfd_read()
231 spin_unlock_irq(&ctx->wqh.lock); in eventfd_read()
233 spin_lock_irq(&ctx->wqh.lock); in eventfd_read()
235 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_read()
239 eventfd_ctx_do_read(ctx, &ucnt); in eventfd_read()
240 if (waitqueue_active(&ctx->wqh)) in eventfd_read()
241 wake_up_locked_poll(&ctx->wqh, EPOLLOUT); in eventfd_read()
243 spin_unlock_irq(&ctx->wqh.lock); in eventfd_read()
254 struct eventfd_ctx *ctx = file->private_data; in eventfd_write() local
265 spin_lock_irq(&ctx->wqh.lock); in eventfd_write()
267 if (ULLONG_MAX - ctx->count > ucnt) in eventfd_write()
270 __add_wait_queue(&ctx->wqh, &wait); in eventfd_write()
273 if (ULLONG_MAX - ctx->count > ucnt) { in eventfd_write()
281 spin_unlock_irq(&ctx->wqh.lock); in eventfd_write()
283 spin_lock_irq(&ctx->wqh.lock); in eventfd_write()
285 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_write()
289 ctx->count += ucnt; in eventfd_write()
290 if (waitqueue_active(&ctx->wqh)) in eventfd_write()
291 wake_up_locked_poll(&ctx->wqh, EPOLLIN); in eventfd_write()
293 spin_unlock_irq(&ctx->wqh.lock); in eventfd_write()
301 struct eventfd_ctx *ctx = f->private_data; in eventfd_show_fdinfo() local
303 spin_lock_irq(&ctx->wqh.lock); in eventfd_show_fdinfo()
305 (unsigned long long)ctx->count); in eventfd_show_fdinfo()
306 spin_unlock_irq(&ctx->wqh.lock); in eventfd_show_fdinfo()
307 seq_printf(m, "eventfd-id: %d\n", ctx->id); in eventfd_show_fdinfo()
359 struct eventfd_ctx *ctx; in eventfd_ctx_fdget() local
363 ctx = eventfd_ctx_fileget(f.file); in eventfd_ctx_fdget()
365 return ctx; in eventfd_ctx_fdget()
380 struct eventfd_ctx *ctx; in eventfd_ctx_fileget() local
385 ctx = file->private_data; in eventfd_ctx_fileget()
386 kref_get(&ctx->kref); in eventfd_ctx_fileget()
387 return ctx; in eventfd_ctx_fileget()
393 struct eventfd_ctx *ctx; in do_eventfd() local
403 ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); in do_eventfd()
404 if (!ctx) in do_eventfd()
407 kref_init(&ctx->kref); in do_eventfd()
408 init_waitqueue_head(&ctx->wqh); in do_eventfd()
409 ctx->count = count; in do_eventfd()
410 ctx->flags = flags; in do_eventfd()
411 ctx->id = ida_simple_get(&eventfd_ida, 0, 0, GFP_KERNEL); in do_eventfd()
413 fd = anon_inode_getfd("[eventfd]", &eventfd_fops, ctx, in do_eventfd()
416 eventfd_free_ctx(ctx); in do_eventfd()