Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752443Ab3CWXNg (ORCPT ); Sat, 23 Mar 2013 19:13:36 -0400 Received: from mail-oa0-f41.google.com ([209.85.219.41]:55846 "EHLO mail-oa0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752296Ab3CWXNe (ORCPT ); Sat, 23 Mar 2013 19:13:34 -0400 MIME-Version: 1.0 In-Reply-To: References: Date: Sat, 23 Mar 2013 20:13:34 -0300 Message-ID: Subject: Re: remap kernel static memory to user space From: Eduardo Cruz To: Hugh Dickins Cc: Clemens Ladisch , linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2586 Lines: 81 Man, it worked! You saved my life kkkkkkkkkkkkkkk. Thank you very much! 2013/3/23 Hugh Dickins : > On Wed, 20 Mar 2013, Eduardo Cruz wrote: > >> Hello. >> >> I'm trying to remap some kernel static memory to user space using >> remap_pfn_range. >> For that, I wrote a module that initializes a device, which later I >> use mknod, etc. >> >> When I allocate the memory with kmalloc, everything works: (where >> user_space_shared was allocated with kmalloc) >> >> if ((ret = remap_pfn_range(vma, vma->vm_start, >> virt_to_phys(user_space_shared) >> PAGE_SHIFT, length, >> vma->vm_page_prot)) < 0) > > I have no ia64 experience, but my guess is that your problem is with > that virt_to_phys(user_space_shared). > > virt_to_phys() expects to be given an address from the kernel's direct > map of physical memory; whereas if you declare user_space_shared[] in > kernel static memory, I believe ia64 places that in a different region. > > Try changing that to virt_to_phys(ia64_imva(user_space_shared)) > and I expect it will then work: see comment above ia64_imva() > in arch/ia64/include/asm/processor.h. > > Hugh > >> >> In the application in user space: >> kstc = mmap(0, sizeof(user_space_shared_t), PROT_READ|PROT_WRITE, >> MAP_SHARED| MAP_LOCKED, fd, 0); >> >> With user_space_shared allocated using kmalloc, it is working. >> The application is able to read the data I wrote in the kernel module. >> >> However, when I define and allocate that var in arch/ia64/mm/fault.c: >> >> unsigned char user_space_shared[ sizeof(user_space_shared_t) + >> PAGE_SIZE ] __attribute__((aligned(PAGE_SIZE))); >> EXPORT_SYMBOL(user_space_shared); >> >> And access that var from the module: >> >> extern unsigned char user_space_shared[ sizeof(user_space_shared_t) + >> PAGE_SIZE ]; >> >> There is no error message, but I can't read the contents i wrote >> inside the kernel module from the application. >> >> Your help would be appreciated. >> >> ps: >> I am taking care of page offsets/boundaries. >> I'm using kernel 2.6.32 for ia64. >> >> >> -- >> Eduardo Henrique Molina da Cruz >> PhD student >> Parallel and Distributed Processing Group >> Federal University of Rio Grande do Sul (UFRGS) -- Eduardo Henrique Molina da Cruz PhD student Parallel and Distributed Processing Group Federal University of Rio Grande do Sul (UFRGS) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/