WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] mmap in PV xen-4.0.1

To: Wei Liu <liuw@xxxxxxxxx>
Subject: Re: [Xen-devel] mmap in PV xen-4.0.1
From: Eric Camachat <eric.camachat@xxxxxxxxx>
Date: Wed, 10 Aug 2011 11:31:29 -0700
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Wed, 10 Aug 2011 11:32:41 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type:content-transfer-encoding; bh=tideht/b63jaI/rMl3tPTDEWkpwYxOeRIG7trNN8CD0=; b=FIfjllfoYFxj0hfuWI+BBS219tQJ5Xmxjdp+c0z8w8wCQR8xDtWmKrKKsHQJX03X+n 4mpzz6EgvOsvfQHRO5r3K877xgQ83Hzq2t3mHKJciXSfcBH4i/zY9Goz4BGgqBRzkXLg H0UdNi06Tfo2R9kdQKG6QW4/2f3E803+DlUkM=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20110810091256.GA1537@limbo>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <CACeEFf77eOLLNgsJwEYdzeiuxm+qDcO2zs09FK-Waas0sxcwLQ@xxxxxxxxxxxxxx> <CACeEFf5yDb3dh+M3nycmYMaW5Vf+6C57QXZjXEBQZhrwkTHkHg@xxxxxxxxxxxxxx> <20110810091256.GA1537@limbo>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
On Wed, Aug 10, 2011 at 2:12 AM, Wei Liu <liuw@xxxxxxxxx> wrote:
> On Tue, Aug 09, 2011 at 11:29:51PM -0700, Eric Camachat wrote:
>> Hi,
>>
>> I have a problem to map kernel memory to userspace via /dev/mem.
>> The mmap() succeeded, but when I try to access it, the program will
>> hang forever (until press ctrl-c to terminate it).
>>
>> # memtest-user
>> memtest_vma_open: virt 0x7fbc90085000, phys 0x3eee8000
>> paddr = 0x3eee8000
>>  mem = 0x7fbc90089000
>>  map = 0x7fbc90085000
>> map[0]= 4c4c4c4c
>> map[1]= 4c4c4c4c
>> *** Hang here, it cannot (finish) access the memory mapped via /dev/mem ***
>>
>> My test source below, and it runs properly on HVM, VirtualBox, QEM and
>> physical machines.
>> What mistake I did?
>>
>> My kernel module look like this:
>> =================================================================================
>
> [...snip...]
>
>> memtest_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
>>               unsigned long arg)
>> {
>>        int ret = -ENOIOCTLCMD;
>>        phys_addr_t *paddr;
>>        unsigned long *vaddr;
>>        uint32_t *size;
>>
>>        switch(cmd) {
>>        case MEMTEST_DMA_SIZE:
>>                size = (uint32_t*)arg;
>>                *size = _size;
>
> Though your output shows that this assignment works, shouldn't this
> kind of direct assignment across kernel space and user land be
> avoided? It is bad practice to do direct assignment I think.
>
> copy_{from,to}_user should do the job.
>

I want share some memory between kernel and user applications, so I am
trying to use mmap instead of copy_{from,to} multiple times.

>>                ret = 0;
>>                break;
>>        case MEMTEST_DMA_PADDR:
>>                paddr = (phys_addr_t*)arg;
>>                *paddr = _pbase;
>>                ret = 0;
>>                break;
>>        case MEMTEST_DMA_VADDR:
>>                vaddr = (unsigned long*)arg;
>>                *vaddr = _vbase;
>>                ret = 0;
>>                break;
>>        }
>>        return ret;
>> }
>>
>>
>
> [...snip...]
>
>> static struct file_operations memtest_fops = {
>>        .owner          = THIS_MODULE,
>>        .llseek         = no_llseek,
>>        .ioctl          = memtest_ioctl,
>
> My kernel doesn't have field called 'ioctl' in file_operations.
>
> So which kernel do you use? 2.6.18? I don't have old kernel at the
> moment so I can't help you much...

I am using linux-2.5.32.24 kernel.

>
>>        .mmap           = memtest_mmap,
>> };
>>
>>
>
> [...snip...]
>
>> static void __exit memtest_exit(void)
>> {
>>        if (_vbase != 0)
>>                free_page(_vbase);
>
> I suppose you should use free_pages here, since you use
> __get_free_pages when allocating.
>
>>        unregister_chrdev(MEMTEST_MAJOR, MEMTEST_NAME);
>> }
>>
>>
>> MODULE_LICENSE("GPL");
>>
>> module_init(memtest_init);
>> module_exit(memtest_exit);
>> =================================================================================
>>
>> Here is my user program:
>>
>> =================================================================================
>>
>
> [...snip...]
>
>>       if (map)
>>       {
>>               printf("map[0]= %x\n", map[0]);
>>               printf("map[1]= %x\n", map[1]);
>
> This confuses me. You did write different values in _vbase[0],
> _vbase[1]. But the output '4C4C4C4C' shows that the value is 'L'.
>
> I just skimmed the output and the code. I don't run your code since I
> don't have a suitible environment at the moment...
>
> Wei.
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel