Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder3.hal-mli.net!nx01.iad01.newshosting.com!newshosting.com!news2.euro.net!feeder.news-service.com!94.75.214.39.MISMATCH!aioe.org!.POSTED!not-for-mail From: Pavel Borzenkov Newsgroups: comp.os.linux.development.system Subject: Re: mmap dma buffer Date: Thu, 7 Jul 2011 09:59:46 +0000 (UTC) Organization: Aioe.org NNTP Server Lines: 46 Message-ID: References: NNTP-Posting-Host: 5Bi2vCRq6cgjQObVvr9N+Q.user.speranza.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: slrn/0.9.9p1 (OpenBSD) X-Notice: Filtered by postfilter v. 0.8.2 Xref: x330-a1.tempe.blueboxinc.net comp.os.linux.development.system:206 Hello, On 2011-07-06, new wrote: > Hello Experts, > > From the application using ioctl i get the size of the write dma > buffer and then i do the mmap() operation. can you pls review the code > below: > > ************************************************* > /* driver mmap routine*/ > static int pcie_mmap(struct file *filp, struct vm_area_struct *vma) > { > unsigned long pfn; > unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; > unsigned long len = vma->vm_end - vma->vm_start; > > printk(KERN_ALERT "\nRAGHU: pcie-axi: Inside pcie_MMAP"); > > if (offset >= PAGE_SIZE) > return -EINVAL; > > if (len > (PAGE_SIZE - offset)) > return -EINVAL; > > vma->vm_flags |= VM_RESERVED; > vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); > > printk(KERN_ALERT "\nRAGHU: pcie-axi: %s: mapping %ld bytes of mem at > offset %ld\n", > __stringify(KBUILD_BASENAME), len, offset); > > /* need to get the pfn for remap_pfn_range -- > ds->wr_buf_ptr is the virtual pointer returned from > pci_alloc_consistent*/ > > pfn = virt_to_phys(ds->wr_buf_ptr + offset) >> PAGE_SHIFT; You can't convert address returned by pci_alloc_consistent() using virt_to_phys() macro. This macro correctly works only for the kernel virtual addresses. And this is not needed, actually, because pci_alloc_consistent() function returns physical address of the allocated memory in its third argument. -- Pavel