From: William Lee Irwin III <wli@holomorphy.com>
To: linux-kernel@vger.kernel.org
Cc: rddunlap@osdl.org
Subject: Re: [profile]: [23/23] add mmap() support for /proc/profile
Date: Tue, 22 Jun 2004 10:03:40 -0700 [thread overview]
Message-ID: <20040622170340.GC2135@holomorphy.com> (raw)
In-Reply-To: <0406220818.3aWaYa1aKb3aHbWaYaMbJb3aLbIbXa3aWa1aLbMbKb1a0aLb1a3aZaLbHb2a3a2a15250@holomorphy.com>
On Tue, Jun 22, 2004 at 08:18:10AM -0700, William Lee Irwin III wrote:
> Allow mmap() on /proc/profile.
Stale code. =(
The working version is:
Index: prof-2.6.7/kernel/profile.c
===================================================================
--- prof-2.6.7.orig/kernel/profile.c 2004-06-22 08:28:12.237655416 -0700
+++ prof-2.6.7/kernel/profile.c 2004-06-22 08:28:13.102523936 -0700
@@ -8,10 +8,11 @@
#include <linux/bootmem.h>
#include <linux/notifier.h>
#include <linux/mm.h>
+#include <linux/pagemap.h>
#include <asm/sections.h>
static atomic_t *prof_buffer;
-static unsigned long prof_len, prof_shift;
+static unsigned long prof_len, prof_shift, prof_pages;
static int prof_on;
int __init profile_setup(char * str)
@@ -33,7 +34,8 @@
/* only text is profiled */
prof_len = ((unsigned long)(_etext - _stext) + 1) >> prof_shift;
- prof_buffer = alloc_bootmem(sizeof(atomic_t)*prof_len);
+ prof_buffer = alloc_bootmem_pages(sizeof(atomic_t)*prof_len);
+ prof_pages = PAGE_ALIGN(prof_len*sizeof(atomic_t))/PAGE_SIZE;
atomic_set(prof_buffer, 1 << prof_shift);
}
@@ -167,6 +169,7 @@
EXPORT_SYMBOL_GPL(profile_event_unregister);
#ifdef CONFIG_PROC_FS
+#include <linux/proc_fs.h>
/*
* This function accesses profiling information. The returned data is
* binary: the sampling step and the actual contents of the profile
@@ -180,7 +183,7 @@
if (p >= sizeof(atomic_t)*prof_len)
return 0;
- count = min(prof_len*sizeof(atomic_t) - p, count);
+ count = min_t(size_t, prof_len*sizeof(atomic_t) - p, count);
if (copy_to_user(buf, (char *)prof_buffer + p, count))
return -EFAULT;
*ppos += count;
@@ -210,13 +213,44 @@
}
#endif
- memset(prof_buffer, 0, prof_len*sizeof(atomic_t));
+ memset(&prof_buffer[1], 0, (prof_len - 1)*sizeof(atomic_t));
return count;
}
+static int mmap_profile(struct file *file, struct vm_area_struct *vma)
+{
+ unsigned long pfn, vaddr, base_pfn = __pa(prof_buffer)/PAGE_SIZE;
+ if (vma->vm_pgoff + vma_pages(vma) > prof_pages)
+ return -ENODEV;
+ vma->vm_flags |= VM_RESERVED|VM_IO;
+ for (vaddr = vma->vm_start; vaddr < vma->vm_end; vaddr += PAGE_SIZE) {
+ pgd_t *pgd = pgd_offset(vma->vm_mm, vaddr);
+ pmd_t *pmd;
+ pte_t *pte, pte_val;
+ spin_lock(&vma->vm_mm->page_table_lock);
+ pmd = pmd_alloc(vma->vm_mm, pgd, vaddr);
+ if (!pmd)
+ goto enomem;
+ pte = pte_alloc_map(vma->vm_mm, pmd, vaddr);
+ if (!pte)
+ goto enomem;
+ pfn = base_pfn + linear_page_index(vma, vaddr);
+ pte_val = pfn_pte(pfn, vma->vm_page_prot);
+ set_pte(pte, pte_val);
+ update_mmu_cache(vma, vaddr, pte_val);
+ pte_unmap(pte);
+ spin_unlock(&vma->vm_mm->page_table_lock);
+ }
+ return 0;
+enomem:
+ spin_unlock(&vma->vm_mm->page_table_lock);
+ return -ENOMEM;
+}
+
static struct file_operations proc_profile_operations = {
.read = read_profile,
.write = write_profile,
+ .mmap = mmap_profile,
};
void create_proc_profile(void)
next prev parent reply other threads:[~2004-06-22 17:13 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-06-22 15:16 [profile]: [0/23] mmap() support for /proc/profile William Lee Irwin III
2004-06-22 15:16 ` [profile]: [1/23] move proc_profile_operations to profile.c William Lee Irwin III
2004-06-22 15:16 ` [profile]: [2/23] ppc32 profiling cleanups William Lee Irwin III
2004-06-22 15:16 ` [profile]: [3/23] mips " William Lee Irwin III
2004-06-22 15:16 ` [profile]: [4/23] sparc64 " William Lee Irwin III
2004-06-22 15:16 ` [profile]: [5/23] m68knommu " William Lee Irwin III
2004-06-22 15:16 ` [profile]: [6/23] sparc32 " William Lee Irwin III
2004-06-22 15:16 ` [profile]: [7/23] superh " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [8/23] arm26 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [9/23] m68k " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [10/23] ia64 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [11/23] alpha " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [12/23] ppc64 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [13/23] arm " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [14/23] parisc " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [15/23] h8300 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [16/23] s390 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [17/23] x86-64 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [18/23] i386 " William Lee Irwin III
2004-06-22 15:17 ` [profile]: [19/23] remove public decls of profile.c internal state William Lee Irwin III
2004-06-22 15:17 ` [profile]: [20/23] clean up profile_init() not to oversize buffer William Lee Irwin III
2004-06-22 15:17 ` [profile]: [21/23] use atomic_t for prof_buffer William Lee Irwin III
2004-06-22 15:18 ` [profile]: [22/23] put 1 << prof_shift at prof_buffer[0] William Lee Irwin III
2004-06-22 15:18 ` [profile]: [23/23] add mmap() support for /proc/profile William Lee Irwin III
2004-06-22 17:03 ` William Lee Irwin III [this message]
2004-06-22 17:10 ` [profile]: [22/23] put 1 << prof_shift at prof_buffer[0] William Lee Irwin III
2004-06-22 17:12 ` William Lee Irwin III
2004-06-22 20:01 ` [profile]: [21/23] use atomic_t for prof_buffer David S. Miller
2004-06-22 20:16 ` William Lee Irwin III
2004-06-22 20:47 ` David S. Miller
2004-06-29 18:56 ` [profile]: [10/23] ia64 profiling cleanups David Mosberger
2004-06-29 19:23 ` William Lee Irwin III
2004-06-22 23:16 ` [profile]: [0/23] mmap() support for /proc/profile Anton Blanchard
2004-06-23 1:58 ` David S. Miller
2004-06-23 2:05 ` William Lee Irwin III
2004-06-23 3:00 ` Anton Blanchard
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=20040622170340.GC2135@holomorphy.com \
--to=wli@holomorphy.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rddunlap@osdl.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox