aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2006-09-27 04:50:22 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-27 11:26:15 -0400
commit930e652a21a08986b03d1f370f933057dc0db2dc (patch)
treec422f35bc2e7c17f58cb14544919affa52d8bac6
parent0112c4c6461fed12ed9bcb249f967bc17a23f6c4 (diff)
[PATCH] NOMMU: Make futexes work under NOMMU conditions
Make futexes work under NOMMU conditions. This can be tested by running this in one shell: #define SYSERROR(X, Y) \ do { if ((long)(X) == -1L) { perror(Y); exit(1); }} while(0) int main() { int shmid, tmp, *f, n; shmid = shmget(23, 4, IPC_CREAT|0666); SYSERROR(shmid, "shmget"); f = shmat(shmid, NULL, 0); SYSERROR(f, "shmat"); n = *f; printf("WAIT: %p{%x}\n", f, n); tmp = futex(f, FUTEX_WAIT, n, NULL, NULL, 0); SYSERROR(tmp, "futex"); printf("WAITED: %d\n", tmp); tmp = shmdt(f); SYSERROR(tmp, "shmdt"); exit(0); } And then this in the other shell: #define SYSERROR(X, Y) \ do { if ((long)(X) == -1L) { perror(Y); exit(1); }} while(0) int main() { int shmid, tmp, *f; shmid = shmget(23, 4, IPC_CREAT|0666); SYSERROR(shmid, "shmget"); f = shmat(shmid, NULL, 0); SYSERROR(f, "shmat"); (*f)++; printf("WAKE: %p{%x}\n", f, *f); tmp = futex(f, FUTEX_WAKE, 1, NULL, NULL, 0); SYSERROR(tmp, "futex"); printf("WOKE: %d\n", tmp); tmp = shmdt(f); SYSERROR(tmp, "shmdt"); exit(0); } The first program will set up a SYSV IPC SHM segment and wait on a futex in it for the number at the start to change. The program will increment that number and wake the first program up. This leads to output of the form: SHELL 1 SHELL 2 ======================= ======================= # /dowait WAIT: 0xc32ac000{0} # /dowake WAKE: 0xc32ac000{1} WAITED: 0 WOKE: 1 Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Documentation/nommu-mmap.txt10
-rw-r--r--mm/nommu.c14
2 files changed, 19 insertions, 5 deletions
diff --git a/Documentation/nommu-mmap.txt b/Documentation/nommu-mmap.txt
index 4db7c18bf68c..7714f57caad5 100644
--- a/Documentation/nommu-mmap.txt
+++ b/Documentation/nommu-mmap.txt
@@ -138,6 +138,16 @@ mode. The former through the usual mechanism, the latter through files created
138on ramfs or tmpfs mounts. 138on ramfs or tmpfs mounts.
139 139
140 140
141=======
142FUTEXES
143=======
144
145Futexes are supported in NOMMU mode if the arch supports them. An error will
146be given if an address passed to the futex system call lies outside the
147mappings made by a process or if the mapping in which the address lies does not
148support futexes (such as an I/O chardev mapping).
149
150
141============= 151=============
142NO-MMU MREMAP 152NO-MMU MREMAP
143============= 153=============
diff --git a/mm/nommu.c b/mm/nommu.c
index 23cfa8ec914a..564540662192 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -350,6 +350,15 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
350EXPORT_SYMBOL(find_vma); 350EXPORT_SYMBOL(find_vma);
351 351
352/* 352/*
353 * find a VMA
354 * - we don't extend stack VMAs under NOMMU conditions
355 */
356struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr)
357{
358 return find_vma(mm, addr);
359}
360
361/*
353 * look up the first VMA exactly that exactly matches addr 362 * look up the first VMA exactly that exactly matches addr
354 * - should be called with mm->mmap_sem at least held readlocked 363 * - should be called with mm->mmap_sem at least held readlocked
355 */ 364 */
@@ -1153,11 +1162,6 @@ struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
1153 return NULL; 1162 return NULL;
1154} 1163}
1155 1164
1156struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr)
1157{
1158 return NULL;
1159}
1160
1161int remap_pfn_range(struct vm_area_struct *vma, unsigned long from, 1165int remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
1162 unsigned long to, unsigned long size, pgprot_t prot) 1166 unsigned long to, unsigned long size, pgprot_t prot)
1163{ 1167{