From: monstr@monstr.eu (Michal Simek)
To: linux-arm-kernel@lists.infradead.org
Subject: scatterlist: sg_set_buf() argument must be in linear mapping (sha1: ac4e97abce9b80c020e7113325f49e58b7b15e3f)
Date: Tue, 23 Jul 2013 14:12:09 +0200 [thread overview]
Message-ID: <51EE7319.408@monstr.eu> (raw)
In-Reply-To: <20130723103704.GS24642@n2100.arm.linux.org.uk>
On 07/23/2013 12:37 PM, Russell King - ARM Linux wrote:
> On Tue, Jul 23, 2013 at 12:00:30PM +0930, Rusty Russell wrote:
>> Michal Simek <monstr@monstr.eu> writes:
>>> Let me take some code from virtio_rpmsg_bus.c to show that problematic part.
>>>
>>> bufs_va = dma_alloc_coherent(vdev->dev.parent->parent,
>>> RPMSG_TOTAL_BUF_SPACE,
>>> &vrp->bufs_dma, GFP_KERNEL);
>>> vrp->rbufs = bufs_va;
>>> for (i = 0; i < RPMSG_NUM_BUFS / 2; i++) {
>>> struct scatterlist sg;
>>> void *cpu_addr = vrp->rbufs + i * RPMSG_BUF_SIZE;
>>>
>>> sg_init_one(&sg, cpu_addr, RPMSG_BUF_SIZE);
>>> }
>>
>> Hmm. Looking at arch/arm/include/asm/memory.h:
>>
>> #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
>> #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
>>
>> pfn_to_page in ARM seems to be the asm-generic one, which depends on
>> CONFIG_SPARSEMEM/CONFIG_DISCONTIGMEM/CONFIG_FLATMEM etc.
>>
>> Perhaps virt_addr_valid() is wrong for your config? It's pretty clear
>> that you shouldn't call virt_to_page() on something for which
>> !virt_addr_valid().
>
> The above code fragment is just wrong. You can't make any assumptions about
> the memory returned from dma_alloc_coherent(), because:
>
> - On x86, it is kernel direct mapped memory, where things like
> virt_to_phys(cpuaddr) will work fine with it.
>
> - On any architecture which needs to remap memory to make it coherent
> with the DMA device, the key word there is "remap" - it's not kernel
> direct mapped memory, and virt_to_phys(cpuaddr) on it is illegal.
>
> The only valid operation with scatterlists and such memory returned from
> dma_alloc_coherent() is:
>
> sg_dma_address(sg) = dma_address;
> sg_dma_len(sg) = dma_length;
>
> and not to use the virtual address(es) at all in the scatterlist. And
> it is very very important to realise that you must not mix the streaming
> and coherent DMA APIs - you must never pass coherent memory into the
> dma_map_* functions.
Ohad: This code is probably yours and you know the whole history of it.
Can you please comment it?
Thanks,
Michal
--
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 263 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130723/e40ca146/attachment.sig>
prev parent reply other threads:[~2013-07-23 12:12 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <51E64C6B.3080306@monstr.eu>
[not found] ` <87siz7xt4z.fsf@rustcorp.com.au>
[not found] ` <51ED2C74.7050502@monstr.eu>
2013-07-23 2:30 ` scatterlist: sg_set_buf() argument must be in linear mapping (sha1: ac4e97abce9b80c020e7113325f49e58b7b15e3f) Rusty Russell
2013-07-23 10:37 ` Russell King - ARM Linux
2013-07-23 12:12 ` Michal Simek [this message]
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=51EE7319.408@monstr.eu \
--to=monstr@monstr.eu \
--cc=linux-arm-kernel@lists.infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).