• Home
  • Raw
  • Download

Lines Matching refs:ctx

48 __u64 eventfd_signal_mask(struct eventfd_ctx *ctx, __u64 n, unsigned mask)  in eventfd_signal_mask()  argument
63 spin_lock_irqsave(&ctx->wqh.lock, flags); in eventfd_signal_mask()
65 if (ULLONG_MAX - ctx->count < n) in eventfd_signal_mask()
66 n = ULLONG_MAX - ctx->count; in eventfd_signal_mask()
67 ctx->count += n; in eventfd_signal_mask()
68 if (waitqueue_active(&ctx->wqh)) in eventfd_signal_mask()
69 wake_up_locked_poll(&ctx->wqh, EPOLLIN | mask); in eventfd_signal_mask()
71 spin_unlock_irqrestore(&ctx->wqh.lock, flags); in eventfd_signal_mask()
90 __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) in eventfd_signal() argument
92 return eventfd_signal_mask(ctx, n, 0); in eventfd_signal()
96 static void eventfd_free_ctx(struct eventfd_ctx *ctx) in eventfd_free_ctx() argument
98 if (ctx->id >= 0) in eventfd_free_ctx()
99 ida_simple_remove(&eventfd_ida, ctx->id); in eventfd_free_ctx()
100 kfree(ctx); in eventfd_free_ctx()
105 struct eventfd_ctx *ctx = container_of(kref, struct eventfd_ctx, kref); in eventfd_free() local
107 eventfd_free_ctx(ctx); in eventfd_free()
117 void eventfd_ctx_put(struct eventfd_ctx *ctx) in eventfd_ctx_put() argument
119 kref_put(&ctx->kref, eventfd_free); in eventfd_ctx_put()
125 struct eventfd_ctx *ctx = file->private_data; in eventfd_release() local
127 wake_up_poll(&ctx->wqh, EPOLLHUP); in eventfd_release()
128 eventfd_ctx_put(ctx); in eventfd_release()
134 struct eventfd_ctx *ctx = file->private_data; in eventfd_poll() local
138 poll_wait(file, &ctx->wqh, wait); in eventfd_poll()
178 count = READ_ONCE(ctx->count); in eventfd_poll()
190 void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt) in eventfd_ctx_do_read() argument
192 lockdep_assert_held(&ctx->wqh.lock); in eventfd_ctx_do_read()
194 *cnt = ((ctx->flags & EFD_SEMAPHORE) && ctx->count) ? 1 : ctx->count; in eventfd_ctx_do_read()
195 ctx->count -= *cnt; in eventfd_ctx_do_read()
212 int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait, in eventfd_ctx_remove_wait_queue() argument
217 spin_lock_irqsave(&ctx->wqh.lock, flags); in eventfd_ctx_remove_wait_queue()
218 eventfd_ctx_do_read(ctx, cnt); in eventfd_ctx_remove_wait_queue()
219 __remove_wait_queue(&ctx->wqh, wait); in eventfd_ctx_remove_wait_queue()
220 if (*cnt != 0 && waitqueue_active(&ctx->wqh)) in eventfd_ctx_remove_wait_queue()
221 wake_up_locked_poll(&ctx->wqh, EPOLLOUT); in eventfd_ctx_remove_wait_queue()
222 spin_unlock_irqrestore(&ctx->wqh.lock, flags); in eventfd_ctx_remove_wait_queue()
231 struct eventfd_ctx *ctx = file->private_data; in eventfd_read() local
237 spin_lock_irq(&ctx->wqh.lock); in eventfd_read()
238 if (!ctx->count) { in eventfd_read()
241 spin_unlock_irq(&ctx->wqh.lock); in eventfd_read()
244 __add_wait_queue(&ctx->wqh, &wait); in eventfd_read()
247 if (ctx->count) in eventfd_read()
250 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_read()
252 spin_unlock_irq(&ctx->wqh.lock); in eventfd_read()
255 spin_unlock_irq(&ctx->wqh.lock); in eventfd_read()
257 spin_lock_irq(&ctx->wqh.lock); in eventfd_read()
259 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_read()
262 eventfd_ctx_do_read(ctx, &ucnt); in eventfd_read()
263 if (waitqueue_active(&ctx->wqh)) in eventfd_read()
264 wake_up_locked_poll(&ctx->wqh, EPOLLOUT); in eventfd_read()
265 spin_unlock_irq(&ctx->wqh.lock); in eventfd_read()
275 struct eventfd_ctx *ctx = file->private_data; in eventfd_write() local
286 spin_lock_irq(&ctx->wqh.lock); in eventfd_write()
288 if (ULLONG_MAX - ctx->count > ucnt) in eventfd_write()
291 __add_wait_queue(&ctx->wqh, &wait); in eventfd_write()
294 if (ULLONG_MAX - ctx->count > ucnt) { in eventfd_write()
302 spin_unlock_irq(&ctx->wqh.lock); in eventfd_write()
304 spin_lock_irq(&ctx->wqh.lock); in eventfd_write()
306 __remove_wait_queue(&ctx->wqh, &wait); in eventfd_write()
310 ctx->count += ucnt; in eventfd_write()
311 if (waitqueue_active(&ctx->wqh)) in eventfd_write()
312 wake_up_locked_poll(&ctx->wqh, EPOLLIN); in eventfd_write()
314 spin_unlock_irq(&ctx->wqh.lock); in eventfd_write()
322 struct eventfd_ctx *ctx = f->private_data; in eventfd_show_fdinfo() local
324 spin_lock_irq(&ctx->wqh.lock); in eventfd_show_fdinfo()
326 (unsigned long long)ctx->count); in eventfd_show_fdinfo()
327 spin_unlock_irq(&ctx->wqh.lock); in eventfd_show_fdinfo()
328 seq_printf(m, "eventfd-id: %d\n", ctx->id); in eventfd_show_fdinfo()
380 struct eventfd_ctx *ctx; in eventfd_ctx_fdget() local
384 ctx = eventfd_ctx_fileget(f.file); in eventfd_ctx_fdget()
386 return ctx; in eventfd_ctx_fdget()
401 struct eventfd_ctx *ctx; in eventfd_ctx_fileget() local
406 ctx = file->private_data; in eventfd_ctx_fileget()
407 kref_get(&ctx->kref); in eventfd_ctx_fileget()
408 return ctx; in eventfd_ctx_fileget()
414 struct eventfd_ctx *ctx; in do_eventfd() local
425 ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); in do_eventfd()
426 if (!ctx) in do_eventfd()
429 kref_init(&ctx->kref); in do_eventfd()
430 init_waitqueue_head(&ctx->wqh); in do_eventfd()
431 ctx->count = count; in do_eventfd()
432 ctx->flags = flags; in do_eventfd()
433 ctx->id = ida_simple_get(&eventfd_ida, 0, 0, GFP_KERNEL); in do_eventfd()
441 file = anon_inode_getfile("[eventfd]", &eventfd_fops, ctx, flags); in do_eventfd()
452 eventfd_free_ctx(ctx); in do_eventfd()