From: Jared Hulbert <jaredeh@gmail.com>
To: Matthew Wilcox <willy@linux.intel.com>
Cc: "Wilcox, Matthew R" <matthew.r.wilcox@intel.com>,
Linux FS Devel <linux-fsdevel@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Linux Memory Management List <linux-mm@kvack.org>,
Andrew Morton <akpm@linux-foundation.org>,
Carsten Otte <cotte@de.ibm.com>,
Chris Brandt <Chris.Brandt@renesas.com>
Subject: Re: [PATCH v12 10/20] dax: Replace XIP documentation with DAX documentation
Date: Mon, 25 Jan 2016 13:18:55 -0800 [thread overview]
Message-ID: <CA+ZsKJ5dRTtmqj-ErKn=hx8xqornAZ3i2kHWWNfLubrCQkZTiA@mail.gmail.com> (raw)
In-Reply-To: <20160125165209.GH2948@linux.intel.com>
On Mon, Jan 25, 2016 at 8:52 AM, Matthew Wilcox <willy@linux.intel.com> wrote:
> On Sun, Jan 24, 2016 at 01:03:49AM -0800, Jared Hulbert wrote:
>> I our defense we didn't know we were sinning at the time.
>
> Fair enough. Cache flushing is Hard.
>
>> Can you walk me through the cache flushing hole? How is it okay on
>> X86 but not VIVT archs? I'm missing something obvious here.
>>
>> I thought earlier that vm_insert_mixed() handled the necessary
>> flushing. Is that even the part you are worried about?
>
> No, that part should be fine. My concern is about write() calls to files
> which are also mmaped. See Documentation/cachetlb.txt around line 229,
> starting with "There exists another whole class of cpu cache issues" ...
oh wow. So aren't all the copy_to/from_user() variants specifically
supposed to handle such cases?
>> What flushing functions would you call if you did have a cache page.
>
> Well, that's the problem; they don't currently exist.
>
>> There are all kinds of cache flushing functions that work without a
>> struct page. If nothing else the specialized ASM instructions that do
>> the various flushes don't use struct page as a parameter. This isn't
>> the first I've run into the lack of a sane cache API. Grep for
>> inval_cache in the mtd drivers, should have been much easier. Isn't
>> the proper solution to fix update_mmu_cache() or build out a pageless
>> cache flushing API?
>>
>> I don't get the explicit mapping solution. What are you mapping
>> where? What addresses would be SHMLBA? Phys, kernel, userspace?
>
> The problem comes in dax_io() where the kernel stores to an alias of the
> user address (or reads from an alias of the user address). Theoretically,
> we should flush user addresses before we read from the kernel's alias,
> and flush the kernel's alias after we store to it.
Reasoning this out loud here. Please correct.
For the dax read case:
- kernel virt is mapped to pfn
- data is memcpy'd from kernel virt
For the dax write case:
- kernel virt is mapped to pfn
- data is memcpy'd to kernel virt
- user virt map to pfn attempts to read
Is that right? I see the x86 does a nocache copy_to/from operation,
I'm not familiar with the semantics of that call and it would take me
a while to understand the assembly but I assume it's doing some magic
opcodes that forces the writes down to physical memory with each
load/store. Does the the caching model of the x86 arch update the
cache entries tied to the physical memory on update?
For architectures that don't do auto coherency magic...
For reads:
- User dcaches need flushing before kernel virtual mapping to ensure
kernel reads latest data. If the user has unflushed data in the
dcache it would not be reflected in the read copy.
This failure mode only is a problem if the filesystem is RW.
For writes:
- Unlike the read case we don't need up to date data for the user's
mapping of a pfn. However, the user will need to caches invalidated
to get fresh data, so we should make sure to writeback any affected
lines in the user caches so they don't get lost if we do an
invalidate. I suppose uncommitted data might corrupt the new data
written from the kernel mapping if the cachelines get flushed later.
- After the data is memcpy'ed to the kernel virt map the cache, and
possibly the write buffers, should be flushed. Without this flush the
data might not ever get to the user mapped versions.
- Assuming the user maps were all flushed at the outset they should be
reloaded with fresh data on access.
Do I get it more or less?
> But if we create a new address for the kernel to use which lands on the
> same cache line as the user's address (and this is what SHMLBA is used
> to indicate), there is no incoherency between the kernel's view and the
> user's view. And no new cache flushing API is needed.
So... how exactly would one force the kernel address to be at the
SHMLBA boundary?
> Is that clearer? I'm not always good at explaining these things in a
> way which makes sense to other people :-(
Yeah. I think I'm at 80% comprehension here. Or at least I think I
am. Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-01-25 21:18 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-24 21:20 [PATCH v12 00/20] DAX: Page cache bypass for filesystems on memory storage Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 01/20] axonram: Fix bug in direct_access Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 02/20] block: Change direct_access calling convention Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 03/20] mm: Fix XIP fault vs truncate race Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
2015-01-13 18:50 ` Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 04/20] mm: Allow page fault handlers to perform the COW Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
2015-01-13 18:58 ` Matthew Wilcox
2015-02-05 9:16 ` Yigal Korman
2015-02-05 21:39 ` Matthew Wilcox
2015-02-08 11:48 ` Yigal Korman
2014-10-24 21:20 ` [PATCH v12 05/20] vfs,ext2: Introduce IS_DAX(inode) Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 06/20] dax,ext2: Replace XIP read and write with DAX I/O Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
2015-01-13 20:59 ` Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 07/20] dax,ext2: Replace ext2_clear_xip_target with dax_clear_blocks Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
2015-01-13 21:39 ` Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 08/20] dax,ext2: Replace the XIP page fault handler with the DAX page fault handler Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
2015-01-13 21:53 ` Matthew Wilcox
2015-01-13 22:47 ` Andrew Morton
2014-10-24 21:20 ` [PATCH v12 09/20] dax,ext2: Replace xip_truncate_page with dax_truncate_page Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
2015-01-13 21:55 ` Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 10/20] dax: Replace XIP documentation with DAX documentation Matthew Wilcox
2015-01-12 23:10 ` Andrew Morton
2016-01-21 18:38 ` Jared Hulbert
2016-01-22 13:07 ` Wilcox, Matthew R
2016-01-22 13:48 ` Chris Brandt
2016-01-22 14:39 ` Matthew Wilcox
2016-01-24 9:03 ` Jared Hulbert
2016-01-25 16:52 ` Matthew Wilcox
2016-01-25 21:18 ` Jared Hulbert [this message]
2016-01-27 19:51 ` Jared Hulbert
2014-10-24 21:20 ` [PATCH v12 11/20] vfs: Remove get_xip_mem Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 12/20] ext2: Remove ext2_xip_verify_sb() Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 13/20] ext2: Remove ext2_use_xip Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 14/20] ext2: Remove xip.c and xip.h Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 15/20] vfs,ext2: Remove CONFIG_EXT2_FS_XIP and rename CONFIG_FS_XIP to CONFIG_FS_DAX Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 16/20] ext2: Remove ext2_aops_xip Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 17/20] ext2: Get rid of most mentions of XIP in ext2 Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 18/20] dax: Add dax_zero_page_range Matthew Wilcox
2015-01-12 23:10 ` Andrew Morton
2015-01-12 23:20 ` Ross Zwisler
2014-10-24 21:20 ` [PATCH v12 19/20] ext4: Add DAX functionality Matthew Wilcox
2014-10-24 21:20 ` [PATCH v12 20/20] brd: Rename XIP to DAX Matthew Wilcox
2014-12-10 14:03 ` [PATCH v12 00/20] DAX: Page cache bypass for filesystems on memory storage Christoph Hellwig
2014-12-10 14:12 ` Matthew Wilcox
2014-12-10 14:28 ` Jeff Moyer
2014-12-10 20:53 ` Dave Chinner
2015-01-05 18:41 ` Christoph Hellwig
2015-01-06 8:47 ` Andrew Morton
2015-01-08 11:49 ` pread2/ pwrite2 Christoph Hellwig
2015-01-09 19:30 ` Steve French
2015-01-08 16:27 ` [PATCH v12 00/20] DAX: Page cache bypass for filesystems on memory storage Milosz Tanski
2015-01-08 16:28 ` Milosz Tanski
2015-01-08 17:36 ` Jeremy Allison
2015-01-12 14:47 ` Matthew Wilcox
2015-01-12 23:09 ` Andrew Morton
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='CA+ZsKJ5dRTtmqj-ErKn=hx8xqornAZ3i2kHWWNfLubrCQkZTiA@mail.gmail.com' \
--to=jaredeh@gmail.com \
--cc=Chris.Brandt@renesas.com \
--cc=akpm@linux-foundation.org \
--cc=cotte@de.ibm.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=matthew.r.wilcox@intel.com \
--cc=willy@linux.intel.com \
/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