From: Randy Dunlap <randy.dunlap@oracle.com>
To: Davide Libenzi <davidel@xmailserver.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
avi@redhat.com, kvm@vger.kernel.org,
Gregory Haskins <ghaskins@novell.com>,
Rusty Russell <rusty@rustcorp.com.au>,
Benjamin LaHaise <bcrl@kvack.org>
Subject: Re: [patch] eventfd - revised interface and cleanups
Date: Tue, 23 Jun 2009 09:59:46 -0700 [thread overview]
Message-ID: <4A410A02.5060008@oracle.com> (raw)
In-Reply-To: <alpine.DEB.1.10.0906230936280.17001@makko.or.mcafeemobile.com>
Davide Libenzi wrote:
> The following patch changes the eventfd interface to de-couple the eventfd
> memory context, from the file pointer instance.
> Without such change, there is no clean way to racely free handle the
> POLLHUP event sent when the last instance of the file* goes away.
> Also, now the internal eventfd APIs are using the eventfd context instead
> of the file*.
> Another cleanup this patch does, is making AIO select EVENTFD, instead of
> adding a bunch of empty function stubs inside eventfd.h.
>
> Andrew, this better go via Avi and the KVM tree, since they have patches
> that will be based on the new interface.
>
>
>
> Signed-off-by: Davide Libenzi <davidel@xmailserver.org>
>
>
> - Davide
>
>
> ---
> drivers/lguest/lg.h | 2
> drivers/lguest/lguest_user.c | 4 -
> fs/aio.c | 24 ++--------
> fs/eventfd.c | 101 ++++++++++++++++++++++++++++++++++++++-----
> include/linux/aio.h | 4 -
> include/linux/eventfd.h | 17 ++-----
> init/Kconfig | 1
> 7 files changed, 108 insertions(+), 45 deletions(-)
>
> Index: linux-2.6.mod/fs/eventfd.c
> ===================================================================
> --- linux-2.6.mod.orig/fs/eventfd.c 2009-06-21 16:54:15.000000000 -0700
> +++ linux-2.6.mod/fs/eventfd.c 2009-06-23 09:34:42.000000000 -0700
> @@ -17,32 +17,38 @@
> -/*
> - * Adds "n" to the eventfd counter "count". Returns "n" in case of
> - * success, or a value lower then "n" in case of coutner overflow.
> - * This function is supposed to be called by the kernel in paths
> - * that do not allow sleeping. In this function we allow the counter
> - * to reach the ULLONG_MAX value, and we signal this as overflow
> - * condition by returining a POLLERR to poll(2).
> +/**
> + * eventfd_signal - Adds @n to the eventfd counter. This function is
> + * supposed to be called by the kernel in paths that do not
> + * allow sleeping. In this function we allow the counter
> + * to reach the ULLONG_MAX value, and we signal this as
> + * overflow condition by returining a POLLERR to poll(2).
> + *
kernel-doc syntax requires the function name + short description on one line,
followed by parameters. Any longer function description then comes after
the parameters.
See Documentation/kernel-doc-nano-HOWTO.txt for more info,
or ask me.
> + * @ctx: [in] Pointer to the eventfd context.
> + * @n: [in] Value of the counter to be added to the eventfd internal counter.
> + *
> + * Returns: In case of success, it returns @n, otherwise (in case of overflow
> + * of the eventfd 64bit internal counter) a value lower than @n.
> */
> -int eventfd_signal(struct file *file, int n)
> +int eventfd_signal(struct eventfd_ctx *ctx, int n)
> {
> - struct eventfd_ctx *ctx = file->private_data;
> unsigned long flags;
>
> if (n < 0)
> +/**
> + * eventfd_ctx_put - Releases a reference to the internal eventfd context
> + * (previously acquired either with eventfd_ctx_get() or
> + * eventfd_ctx_fdget()).
> + *
> + * @ctx: [in] Pointer to eventfd context.
> + *
> + * Returns: Nothing.
> + */
> +void eventfd_ctx_put(struct eventfd_ctx *ctx)
> +{
> + kref_put(&ctx->kref, eventfd_free);
> +}
> +EXPORT_SYMBOL_GPL(eventfd_ctx_put);
> +
> static int eventfd_release(struct inode *inode, struct file *file)
> {
> - kfree(file->private_data);
> + struct eventfd_ctx *ctx = file->private_data;
> +
> + wake_up_poll(&ctx->wqh, POLLHUP);
> + eventfd_ctx_put(ctx);
> return 0;
> }
>
> +/**
> + * eventfd_ctx_fdget - Acquires a reference to the internal eventfd context
> + * given an eventfd file descriptor.
> + *
> + * @fd: [in] Eventfd file descriptor.
> + *
> + * Returns: In case of success, it returns a pointer to the internal eventfd
> + * context, otherwise a proper error code.
> + */
> +struct eventfd_ctx *eventfd_ctx_fdget(int fd)
> +{
> + struct file *file;
> + struct eventfd_ctx *ctx;
> +
> + file = eventfd_fget(fd);
> + if (IS_ERR(file))
> + return (struct eventfd_ctx *) file;
> + ctx = eventfd_ctx_get(file->private_data);
> + fput(file);
> +
> + return ctx;
> +}
> +EXPORT_SYMBOL_GPL(eventfd_ctx_fdget);
--
~Randy
LPC 2009, Sept. 23-25, Portland, Oregon
http://linuxplumbersconf.org/2009/
next prev parent reply other threads:[~2009-06-23 17:01 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-23 16:47 [patch] eventfd - revised interface and cleanups Davide Libenzi
2009-06-23 16:59 ` Randy Dunlap [this message]
2009-06-23 17:04 ` Davide Libenzi
2009-06-23 17:03 ` Avi Kivity
2009-06-23 17:04 ` Davide Libenzi
2009-06-23 17:51 ` Gregory Haskins
2009-06-23 17:51 ` Davide Libenzi
2009-06-23 19:25 ` [patch] eventfd - revised interface and cleanups (2nd rev) Davide Libenzi
2009-06-23 19:48 ` Andrew Morton
2009-06-23 19:49 ` Davide Libenzi
2009-06-23 20:12 ` Andrew Morton
2009-06-23 20:59 ` Davide Libenzi
2009-06-23 21:25 ` Andrew Morton
2009-06-23 21:25 ` Davide Libenzi
2009-06-23 21:44 ` Andrew Morton
2009-06-23 22:49 ` Davide Libenzi
2009-06-23 23:18 ` Andrew Morton
2009-06-24 22:47 ` Davide Libenzi
2009-06-24 23:12 ` Andrew Morton
2009-06-24 23:52 ` Davide Libenzi
2009-06-25 0:33 ` Andrew Morton
2009-06-23 20:18 ` Andrew Morton
2009-06-23 21:03 ` Davide Libenzi
2009-06-23 21:29 ` Andrew Morton
2009-06-23 21:28 ` Davide Libenzi
2009-06-23 21:34 ` Davide Libenzi
2009-06-23 21:46 ` Andrew Morton
2009-06-23 21:48 ` Davide Libenzi
2009-06-23 22:07 ` Andrew Morton
2009-06-23 22:46 ` [patch] eventfd - revised interface and cleanups (3rd rev) Davide Libenzi
2009-06-24 23:57 ` [patch] eventfd - revised interface and cleanups (4th rev) Davide Libenzi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A410A02.5060008@oracle.com \
--to=randy.dunlap@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=avi@redhat.com \
--cc=bcrl@kvack.org \
--cc=davidel@xmailserver.org \
--cc=ghaskins@novell.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.