public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
From: Omar Ramirez Luna <omar.ramirez@ti.com>
To: linux-omap <linux-omap@vger.kernel.org>
Cc: Ameya Palande <ameya.palande@nokia.com>,
	Hiroshi Doyu <Hiroshi.DOYU@nokia.com>,
	Felipe Contreras <felipe.contreras@nokia.com>,
	"Menon, Nishanth" <nm@ti.com>
Subject: [RESEND][PATCH] DSPBRIDGE: cache operation against kernel address instead of user's
Date: Mon, 25 Jan 2010 19:56:08 -0600	[thread overview]
Message-ID: <4B5E4BB8.5090108@ti.com> (raw)
In-Reply-To: <1264220772-11097-1-git-send-email-omar.ramirez@ti.com>

From: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>

Based on the discussion:
   http://www.spinics.net/lists/arm-kernel/msg72810.html

HACK: export "follow_page()" for dspbridge cache operation

Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
---
  drivers/dsp/bridge/rmgr/proc.c |   68 
++++++++++++++++++++++++++++++---------
  mm/memory.c                    |    1 +
  2 files changed, 53 insertions(+), 16 deletions(-)

diff --git a/drivers/dsp/bridge/rmgr/proc.c b/drivers/dsp/bridge/rmgr/proc.c
index 491661f..3e05281 100644
--- a/drivers/dsp/bridge/rmgr/proc.c
+++ b/drivers/dsp/bridge/rmgr/proc.c
@@ -574,8 +574,43 @@ DSP_STATUS PROC_EnumNodes(DSP_HPROCESSOR 
hProcessor, OUT DSP_HNODE *aNodeTab,
  	return status;
  }

+/* Cache operation against kernel address instead of users */
+static int memory_sync_page(struct vm_area_struct *vma, unsigned long 
start,
+			    ssize_t len, enum DSP_FLUSHTYPE ftype)
+{
+	struct page *page;
+	void *kaddr;
+	unsigned long offset;
+	ssize_t rest;
+
+	while (len) {
+		page = follow_page(vma, start, FOLL_GET);
+		if (!page) {
+			pr_err("%s: no page for %08lx\n", __func__, start);
+			return -EINVAL;
+		} else if (IS_ERR(page)) {
+			pr_err("%s: err page for %08lx(%lu)\n", __func__, start,
+			       IS_ERR(page));
+			return IS_ERR(page);
+		}
+
+		offset = start & ~PAGE_MASK;
+		kaddr = page_address(page) + offset;
+		rest = min_t(ssize_t, PAGE_SIZE - offset, len);
+
+		MEM_FlushCache(kaddr, rest, ftype);
+
+		put_page(page);
+		len -= rest;
+		start += rest;
+	}
+
+	return 0;
+}
+
  /* Check if the given area blongs to process virtul memory address 
space */
-static int memory_check_vma(unsigned long start, u32 len)
+static int memory_sync_vma(unsigned long start, u32 len,
+			   enum DSP_FLUSHTYPE ftype)
  {
  	int err = 0;
  	unsigned long end;
@@ -585,14 +620,19 @@ static int memory_check_vma(unsigned long start, 
u32 len)
  	if (end <= start)
  		return -EINVAL;

-	down_read(&current->mm->mmap_sem);
-
  	while ((vma = find_vma(current->mm, start)) != NULL) {
+		ssize_t size;

-		if (vma->vm_start > start) {
-			err = -EINVAL;
+		if (vma->vm_flags & (VM_IO | VM_PFNMAP))
+			return -EINVAL;
+
+		if (vma->vm_start > start)
+			return -EINVAL;
+
+		size = min_t(ssize_t, vma->vm_end - start, len);
+		err = memory_sync_page(vma, start, size, ftype);
+		if (err)
  			break;
-		}

  		if (end <= vma->vm_end)
  			break;
@@ -603,8 +643,6 @@ static int memory_check_vma(unsigned long start, u32 
len)
  	if (!vma)
  		err = -EINVAL;

-	up_read(&current->mm->mmap_sem);
-
  	return err;
  }

@@ -629,17 +667,15 @@ static DSP_STATUS proc_memory_sync(DSP_HPROCESSOR 
hProcessor, void *pMpuAddr,
  		goto err_out;
  	}

-	if (memory_check_vma((u32)pMpuAddr, ulSize)) {
-		GT_3trace(PROC_DebugMask, GT_7CLASS,
-			  "%s: InValid address parameters\n",
-			  __func__, pMpuAddr, ulSize);
+	down_read(&current->mm->mmap_sem);
+
+	if (memory_sync_vma((u32)pMpuAddr, ulSize, FlushMemType)) {
+		pr_err("%s: InValid address parameters %p %x\n",
+		       __func__, pMpuAddr, ulSize);
  		status = DSP_EHANDLE;
-		goto err_out;
  	}

-	(void)SYNC_EnterCS(hProcLock);
-	MEM_FlushCache(pMpuAddr, ulSize, FlushMemType);
-	(void)SYNC_LeaveCS(hProcLock);
+	up_read(&current->mm->mmap_sem);

  err_out:
  	GT_2trace(PROC_DebugMask, GT_ENTER,
diff --git a/mm/memory.c b/mm/memory.c
index 6ab19dd..377be88 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1228,6 +1228,7 @@ no_page_table:
  		return ERR_PTR(-EFAULT);
  	return page;
  }
+EXPORT_SYMBOL_GPL(follow_page);

  int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
  		     unsigned long start, int nr_pages, unsigned int gup_flags,
-- 
1.6.2.4



  reply	other threads:[~2010-01-26  1:56 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-23  4:26 [PATCH] DSPBRIDGE: cache operation against kernel address instead of user's Omar Ramirez Luna
2010-01-26  1:56 ` Omar Ramirez Luna [this message]
2010-01-26 11:52   ` [RESEND][PATCH] " Felipe Contreras
2010-02-02 20:10     ` Omar Ramirez Luna

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=4B5E4BB8.5090108@ti.com \
    --to=omar.ramirez@ti.com \
    --cc=Hiroshi.DOYU@nokia.com \
    --cc=ameya.palande@nokia.com \
    --cc=felipe.contreras@nokia.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=nm@ti.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