mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Rasmus Villemoes <linux@rasmusvillemoes.dk>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	Neil Brown <neilb@suse.com>
Subject: Re: [PATCHSET v2] ->follow_link() without dropping from RCU mode
Date: Sun, 13 Dec 2015 19:43:21 +0100	[thread overview]
Message-ID: <87si36kx4m.fsf@rasmusvillemoes.dk> (raw)
In-Reply-To: <20151212020027.GN20997@ZenIV.linux.org.uk> (Al Viro's message of "Sat, 12 Dec 2015 02:00:27 +0000")

On Sat, Dec 12 2015, Al Viro <viro@ZenIV.linux.org.uk> wrote:

> On Fri, Dec 11, 2015 at 11:16:24PM +0000, Al Viro wrote:
>
>> #define set_delayed_type(call, f, arg) \
>> 	sizeof(f(arg),0), \
>> 	__set_delayed_type(call, __closure_##f, (void *)arg)
>> 
>> That could be reused for timers with typechecking - we have a lot of timer
>> callbacks that start with casting the argument (unsigned long, not void *,
>> but that's not a big deal) to whatever it is that callback really wants,
>> with setup_timer() callers explicitly casting that whatever the callback
>> really wants to unsigned long.  Which, of course, defeats the typechecking
>> by both cc(1) and sparse(1)...
>> 
>> I still hope for better solution, though...  Comments?
>
> Hmm...
>
> #define set_delayed_type(call, f, arg)					\
>  	(sizeof(f(arg),0),						\
> 	__set_delayed_type(call, ({					\
> 		void _(void *__) {f((typeof(arg))(unsigned long)__);}	\
> 		_;}), (void *)arg))
>
> woult do nicely, but it's a gccism, and the one clang doesn't support
> ;-/

Careful. While this may appear to work, I'm pretty sure it would break
horribly when f is not the actual name of a function but a function
pointer. Not that it won't compile, but it would presumably make gcc
emit what they call a 'trampoline', a small piece of executable code
located on the stack, allowing the stub to access the containing
function's local variables (namely, f). I don't know if kernel stacks
are even executable, but even then it's a bad idea, once the stack frame
containing the trampoline is gone. All of this could easily happen down
the line when someone sees a bunch of similar code and decides to factor
that into a helper(), and then it works whenever gcc decides to inline
the helper to both call sites and otherwise, as the gcc docs put it,
"all hell breaks loose". IOWs, an accident waiting to happen.

One could probably ensure that the macro is always used with a
compile/link-time constant by putting in some trick like

static void *link_time_constant_please = f;

but even then I wouldn't be completely sure that gcc would always emit a
stub as simple as the one you showed.

Rasmus

  reply	other threads:[~2015-12-13 18:43 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-17 22:57 [PATCHSET] " Al Viro
2015-11-17 23:00 ` [PATCH 01/10] switch befs long symlinks to page_symlink_operations Al Viro
2015-11-17 23:00 ` [PATCH 02/10] logfs: don't duplicate page_symlink_inode_operations Al Viro
2015-11-17 23:00 ` [PATCH 03/10] udf: " Al Viro
2015-11-17 23:00 ` [PATCH 04/10] ufs: get rid of ->setattr() for symlinks Al Viro
2015-11-17 23:00 ` [PATCH 05/10] namei: page_getlink() and page_follow_link_light() are the same thing Al Viro
2015-11-17 23:00 ` [PATCH 06/10] [vfs] don't put symlink bodies in pagecache into highmem Al Viro
2015-11-19 23:02   ` Dave Chinner
2015-11-17 23:00 ` [PATCH 07/10] [vfs] replace ->follow_link() with new method that could stay in RCU mode Al Viro
2015-11-17 23:00 ` [PATCH 08/10] teach page_get_link() to work " Al Viro
2015-11-17 23:00 ` [PATCH 09/10] teach shmem_get_link() " Al Viro
2015-11-17 23:00 ` [PATCH 10/10] teach proc_self_get_link()/proc_thread_self_get_link() " Al Viro
2015-12-09  5:32 ` [PATCHSET v2] ->follow_link() without dropping from " Al Viro
2015-12-09  5:34   ` [PATCH v2 01/11] switch befs long symlinks to page_symlink_operations Al Viro
2015-12-09  5:34   ` [PATCH v2 02/11] logfs: don't duplicate page_symlink_inode_operations Al Viro
2015-12-09  5:34   ` [PATCH v2 03/11] udf: " Al Viro
2015-12-09  5:34   ` [PATCH v2 04/11] ufs: get rid of ->setattr() for symlinks Al Viro
2015-12-09  5:34   ` [PATCH v2 05/11] namei: page_getlink() and page_follow_link_light() are the same thing Al Viro
2015-12-09  5:34   ` [PATCH v2 06/11] don't put symlink bodies in pagecache into highmem Al Viro
2016-01-14 13:22     ` Tomeu Vizoso
2016-01-14 15:25       ` Al Viro
2016-01-14 15:58         ` Tomeu Vizoso
2016-01-14 16:23           ` Al Viro
2016-01-14 16:57             ` Tomeu Vizoso
2016-01-14 17:13               ` Al Viro
2016-01-14 19:15                 ` Tomeu Vizoso
2016-01-14 21:02                   ` Al Viro
2016-01-14 21:40                     ` Linus Torvalds
2016-01-14 22:25                       ` Al Viro
2016-01-14 23:33                         ` Al Viro
2016-01-14 23:58                         ` Linus Torvalds
2016-01-15  0:05                           ` Al Viro
2015-12-09  5:34   ` [PATCH v2 07/11] replace ->follow_link() with new method that could stay in RCU mode Al Viro
2015-12-09  5:34   ` [PATCH v2 08/11] teach page_get_link() to work " Al Viro
2015-12-09  5:34   ` [PATCH v2 09/11] teach shmem_get_link() " Al Viro
2015-12-09  5:34   ` [PATCH v2 10/11] teach proc_self_get_link()/proc_thread_self_get_link() " Al Viro
2015-12-09  5:34   ` [PATCH v2 11/11] teach nfs_get_link() " Al Viro
2015-12-09 17:24   ` [PATCHSET v2] ->follow_link() without dropping from " Linus Torvalds
2015-12-09 18:23     ` Al Viro
2015-12-10  0:10       ` Al Viro
2015-12-10  2:40         ` Al Viro
2015-12-11  1:54           ` Al Viro
2015-12-11  7:49             ` Rasmus Villemoes
2015-12-11 23:16               ` Al Viro
2015-12-12  2:00                 ` Al Viro
2015-12-13 18:43                   ` Rasmus Villemoes [this message]
2015-12-13  3:47             ` Al Viro
2015-12-09 21:57   ` NeilBrown

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=87si36kx4m.fsf@rasmusvillemoes.dk \
    --to=linux@rasmusvillemoes.dk \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=neilb@suse.com \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@ZenIV.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®