All of lore.kernel.org
 help / color / mirror / Atom feed
From: Venki Pallipadi <venkatesh.pallipadi@intel.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: "Pallipadi, Venkatesh" <venkatesh.pallipadi@intel.com>,
	Ingo Molnar <mingo@elte.hu>, "H. Peter Anvin" <hpa@zytor.com>,
	linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [git pull] x86 PAT changes
Date: Sat, 26 Apr 2008 11:32:12 -0700	[thread overview]
Message-ID: <20080426183212.GA15007@linux-os.sc.intel.com> (raw)
In-Reply-To: <alpine.LFD.1.10.0804261011030.2813@woody.linux-foundation.org>

On Sat, Apr 26, 2008 at 10:15:33AM -0700, Linus Torvalds wrote:
> 
> 
> On Sat, 26 Apr 2008, Pallipadi, Venkatesh wrote:
> > 
> > Agreed that NONPROMISC_DEVMEM is not really needed for read/write. But,
> > we will still need it for /dev/mem.
> 
> If so, just disable it unconditionally for mmap.
> 
> As mentioned, that's really just a return to original Linux /dev/mmap 
> semantics: long ago (well, not _that_ long ago) we never used to be able 
> to mmap() normal kernel memory, because the page counts would get screwed 
> up on pages that weren't marked PG_Reserved.
> 
> So the traditional Linux behavior for mmap() on /dev/mem was always to 
> only allow it on memory that either had no "struct page *" backing at all, 
> or that was marked PG_Reserved (ie the ISA hole ay 640k-1M and things like 
> the BIOS tables etc).
> 
> Going back to that doesn't sound horrible.
> 

OK. Below is the quick to disable /dev/mem mmap of RAM with PAT.
This should go along with Ingo's patch that removes PAT dependency on
NONPROMISC_DEVMEM.  It makes things safer and eliminates aliasing.
Still somewhat unclean as the range_is_allowed is duplicated.
And also, just compile tested right now.


Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>

---
 arch/x86/mm/pat.c |   31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

Index: linux-2.6/arch/x86/mm/pat.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/pat.c	2008-04-26 09:34:31.000000000 -0700
+++ linux-2.6/arch/x86/mm/pat.c	2008-04-26 11:25:57.000000000 -0700
@@ -16,6 +16,7 @@
 #include <asm/msr.h>
 #include <asm/tlbflush.h>
 #include <asm/processor.h>
+#include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/pat.h>
 #include <asm/e820.h>
@@ -477,6 +478,33 @@ pgprot_t phys_mem_access_prot(struct fil
 	return vma_prot;
 }
 
+#ifdef CONFIG_NONPROMISC_DEVMEM
+/* This check is done in drivers/char/mem.c in case of NONPROMISC_DEVMEM*/
+static inline int range_is_allowed(unsigned long pfn, unsigned long size)
+{
+	return 1;
+}
+#else
+static inline int range_is_allowed(unsigned long pfn, unsigned long size)
+{
+	u64 from = ((u64)pfn) << PAGE_SHIFT;
+	u64 to = from + size;
+	u64 cursor = from;
+
+	while (cursor < to) {
+		if (!devmem_is_allowed(pfn)) {
+			printk(KERN_INFO
+		"Program %s tried to access /dev/mem between %Lx->%Lx.\n",
+				current->comm, from, to);
+			return 0;
+		}
+		cursor += PAGE_SIZE;
+		pfn++;
+	}
+	return 1;
+}
+#endif /* CONFIG_NONPROMISC_DEVMEM */
+
 int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
 				unsigned long size, pgprot_t *vma_prot)
 {
@@ -485,6 +513,9 @@ int phys_mem_access_prot_allowed(struct 
 	unsigned long ret_flags;
 	int retval;
 
+	if (!range_is_allowed(pfn, size))
+		return 0;
+
 	if (file->f_flags & O_SYNC) {
 		flags = _PAGE_CACHE_UC;
 	}


  reply	other threads:[~2008-04-26 18:32 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-24 22:56 [git pull] x86 PAT changes Ingo Molnar
2008-04-25 23:43 ` Linus Torvalds
2008-04-26  0:06   ` H. Peter Anvin
2008-04-26  1:12     ` Linus Torvalds
2008-04-26  8:56       ` Ingo Molnar
2008-04-26 16:54         ` Pallipadi, Venkatesh
2008-04-26 17:15           ` Linus Torvalds
2008-04-26 18:32             ` Venki Pallipadi [this message]
2008-04-26 19:07               ` [patch] x86, PAT: disable /dev/mem mmap RAM with PAT Ingo Molnar
2008-04-26  9:57   ` [git pull] x86 PAT changes Ingo Molnar
2008-04-26 13:40 ` Gabriel C
2008-04-26 14:42   ` Ingo Molnar
2008-04-26 15:37     ` Gabriel C
2008-04-26 15:41       ` Ingo Molnar
2008-04-26 16:43         ` Linus Torvalds

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=20080426183212.GA15007@linux-os.sc.intel.com \
    --to=venkatesh.pallipadi@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.