All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: 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 03:47:02 +0000	[thread overview]
Message-ID: <20151213034702.GA29845@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20151211015425.GH20997@ZenIV.linux.org.uk>

On Fri, Dec 11, 2015 at 01:54:25AM +0000, Al Viro wrote:

> 	BTW, why are we passing unsigned long to free_page()?  We have
> a bit under 700 callers; excluding the ones that have an explicit cast
> to unsigned long right in the argument of call leaves ~150, and the rest
> tend to contain a lot of pointer casts of unsigned long thing they are feeding
> to free_page() (IOW, they would be just as happy if they kept it as a pointer
> all along).  Sure, that would mean __get_free_page() et.al. returning void *,
> but I don't see any problems with that either...  Is that just for historical
> reasons, or is there anything more subtle I'm missing here?

The situation with free_pages() is even funnier - we have 313 call sites,
and after converting it to void(void *, unsigned) 31 of them need casts
to void *.  Right now the mainline has 249 of those call sites with
cast to unsigned long (or ulong, in several places).  Then there's a bunch
of places where we do __get_free_pages(), then use it a lot (all with
casts to pointers), then pass to free_pages() - those would be just fine
with storing it as void *, but even leaving those aside...

The current signature is contrary to actual use - nearly 80% of call
sites are forced to cast a pointer to unsigned long, only to have it
cast back to void * in free_pages() itself, we would obviously be better
off if we'd switched to just passing the damn thing as a pointer.  Especially
since that 80% turn into 90% once you add the callers that could easily
switch to storing the value eventually passed to free_pages() as a pointer.

And free_page() is basically the same story, only with twice as many
call sites...

While we are at it: __get_free_pages() has 238 call sites.  193 of them
immediately cast to pointer.  And there's a bunch of places like this:
static inline void __tlb_alloc_page(struct mmu_gather *tlb)
{
        unsigned long addr = __get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0);

        if (addr) {
                tlb->pages = (void *)addr;
                tlb->max = PAGE_SIZE / sizeof(struct page *);
        }
}
where the cast is not immediate, but might as well had been.  And conversion
of free_pages() whittles it down even more.  For __get_free_page() the
situation is about the same, ditto for get_zeroed_page().

I realize that get_free_page() has been returning unsigned long since 0.01,
but looking at 0.01... it might as well had been returning void * - wouldn't
be more inconvenient.  The kludge you had in get_pipe_inode() would've been
a bit more obviously wrong, but that's about it ;-)

Seriously, though - what do you think about a flagday commit right after
4.5-rc1 switching all those guys to void *?  For __get_user_pages(),
__get_user_page(), get_zeroed_page() - return values, for free_pages(),
free_page() - argument.

  parent reply	other threads:[~2015-12-13  3:47 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-17 22:57 [PATCHSET] ->follow_link() without dropping from RCU mode 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
2015-12-13  3:47             ` Al Viro [this message]
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=20151213034702.GA29845@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=neilb@suse.com \
    --cc=torvalds@linux-foundation.org \
    /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.