struct eventfd_ctx *eventfd_ctx_fdget(int fd) { struct eventfd_ctx *ctx; struct fd f = fdget(fd); if (!f.file) return ERR_PTR(-EBADF); ctx = eventfd_ctx_fileget(f.file); fdput(f); return ctx; } eventfd_signal的实现 struct eventfd_ctx { struct kref kref; wait_queue_head_t...
vq->call_ctx = eventfp ?eventfd_ctx_fileget(eventfp) : NULL; }elsefilep=eventfp;break;if(pollstop && vq->handle_kick) vhost_poll_stop(&vq->poll);if(ctx) eventfd_ctx_put(ctx);/*pollstop之后,释放之前占用的ctx*/if(filep) fput(filep);/*pollstop之后,释放之前占用的filep*/if(poll...
eventfd_ctx_put(ev_fd_ctx); return -ENOMEM; } entry->syncobj = syncobj; entry->ev_fd_ctx = ev_fd_ctx; entry->point = args->point; entry->flags = args->flags; drm_syncobj_add_eventfd(syncobj, entry); drm_syncobj_put(syncobj); return 0; } int drm_syncobj_reset_ioctl(struct drm...
以及绑定eventfd的文件操作函数 file = anon_inode_getfile("[eventfd]", &eventfd_fops, ctx, flags); if (IS_ERR(file)) { put_unused_fd(fd); fd = PTR_ERR(file); goto err; } file->f_mode |= FMODE_NOWAIT; fd_install(fd, file); return fd; err: eventfd_free_ctx(ctx); return ...
eventfd_ctx_put(eventfd);if (!IS_ERR(file)) fput(file);kfree(irqfd); return ret; } #endifvoid kvm_eventfd_init(struct kvm *kvm) { #ifdef __KVM_HAVE_IOAPIC spin_lock_init(&kvm->irqfds.lock); INIT_LIST_HEAD(&kvm->irqfds.items); ...
if (res > 0 && put_user(ucnt, (__u64 __user *) buf)) return -EFAULT; return res; } read操作目的是要将count值返回用户空间并清零。ctx中的count值是共享数据,通过加irq自旋锁实现对其的独占安全访问,spin_lock_irq函数可以禁止本地中断和抢占,在SMP体系中也是安全的。从源码可以看出,如果是对于...
struct eventfd_ctx { struct kref kref; /* 这个就不多说了,file计数用的,用于get/put */ wait_queue_head_t wqh; /* 这个用来存放用户态的进程wait项,有了它通知机制才成为可能 */ /* * Everytime that a write(2) is performed on an eventfd, the ...
res= eventfd_ctx_read(ctx, file->f_flags & O_NONBLOCK, &cnt);if(res <0)returnres;returnput_user(cnt, (__u64 __user *) buf) ? -EFAULT :sizeof(cnt); } 首先从private_data获取eventfd_ctx,然后判断请求读取的大小是否满足条件,这里count是64位即8个字节,所以最小读取8个字节,如果不足则...
作为一个file(linux里有不是file的东西么~~),它的private_data结构体 eventfd_ctx只有可怜的四个变量。 struct eventfd_ctx { struct kref kref; /* 这个就不多说了,file计数用的,用于get/put */ wait_queue_head_t wqh; /* 这个用来存放用户态的进程wait项,有了它通知机制才成为可能 */ ...
@@ -458,6 +460,8 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req) { assert_spin_locked(&ctx->ctx_lock); + if (!IS_ERR(req->ki_eventfd)) + fput(req->ki_eventfd); if (req->ki_dtor) req->ki_dtor(req); ...