lkml.org 
[lkml]   [1999]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: PATCH] fbmem.c, kernel 2.3.25
On Wed, 3 Nov 1999, Arjan van de Ven wrote:

> Ok. Maybe the person who knows he's breaking a _lot_ of interfaces, should
> take the trouble of sending a mail to l-k explaining what he/she has done,
> and what a good fix would look like. (*)

The fix has been sent, here's another copy. Fwiw, the change is
documented in mm.h.

-ben

diff -ur clean/2.3.25/arch/sparc/kernel/signal.c 2.3.25/arch/sparc/kernel/signal.c
--- clean/2.3.25/arch/sparc/kernel/signal.c Tue Aug 31 14:23:29 1999
+++ 2.3.25/arch/sparc/kernel/signal.c Mon Nov 1 19:26:24 1999
@@ -1050,7 +1050,7 @@
ino = map->vm_file->f_dentry->d_inode->i_ino;
line = d_path(map->vm_file->f_dentry, buffer, PAGE_SIZE);
}
- printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_offset,
+ printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
kdevname(dev), ino);
if (map->vm_file != NULL)
printk("%s\n", line);
diff -ur clean/2.3.25/arch/sparc64/kernel/signal.c 2.3.25/arch/sparc64/kernel/signal.c
--- clean/2.3.25/arch/sparc64/kernel/signal.c Wed Sep 8 14:14:32 1999
+++ 2.3.25/arch/sparc64/kernel/signal.c Mon Nov 1 19:26:24 1999
@@ -618,7 +618,7 @@
ino = map->vm_file->f_dentry->d_inode->i_ino;
line = d_path(map->vm_file->f_dentry, buffer, PAGE_SIZE);
}
- printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_offset,
+ printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
kdevname(dev), ino);
if (map->vm_file != NULL)
printk("%s\n", line);
diff -ur clean/2.3.25/arch/sparc64/kernel/signal32.c 2.3.25/arch/sparc64/kernel/signal32.c
--- clean/2.3.25/arch/sparc64/kernel/signal32.c Tue Aug 3 01:07:16 1999
+++ 2.3.25/arch/sparc64/kernel/signal32.c Mon Nov 1 19:26:24 1999
@@ -1226,7 +1226,7 @@
ino = map->vm_file->f_dentry->d_inode->i_ino;
line = d_path(map->vm_file->f_dentry, buffer, PAGE_SIZE);
}
- printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_offset,
+ printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
kdevname(dev), ino);
if (map->vm_file != NULL)
printk("%s\n", line);
diff -ur clean/2.3.25/drivers/char/drm/proc.c 2.3.25/drivers/char/drm/proc.c
--- clean/2.3.25/drivers/char/drm/proc.c Thu Oct 28 14:09:24 1999
+++ 2.3.25/drivers/char/drm/proc.c Mon Nov 1 19:26:24 1999
@@ -382,7 +382,7 @@
vma->vm_flags & VM_MAYSHARE ? 's' : 'p',
vma->vm_flags & VM_LOCKED ? 'l' : '-',
vma->vm_flags & VM_IO ? 'i' : '-',
- vma->vm_offset );
+ vma->vm_pgoff << PAGE_SHIFT );
#if defined(__i386__)
pgprot = pgprot_val(vma->vm_page_prot);
DRM_PROC_PRINT(" %c%c%c%c%c%c%c%c%c",
diff -ur clean/2.3.25/drivers/char/drm/vm.c 2.3.25/drivers/char/drm/vm.c
--- clean/2.3.25/drivers/char/drm/vm.c Tue Sep 7 17:51:28 1999
+++ 2.3.25/drivers/char/drm/vm.c Mon Nov 1 19:53:40 1999
@@ -96,7 +96,7 @@
if (address > vma->vm_end) return 0; /* Disallow mremap */
if (!dma->pagelist) return 0; /* Nothing allocated */

- offset = address - vma->vm_start; /* vm_offset should be 0 */
+ offset = address - vma->vm_start; /* vm_pgoff should be 0 */
page = offset >> PAGE_SHIFT;
physical = dma->pagelist[page] + (offset & (~PAGE_MASK));
atomic_inc(&mem_map[MAP_NR(physical)].count); /* Dec. by kernel */
@@ -168,8 +168,8 @@
drm_device_dma_t *dma = dev->dma;
unsigned long length = vma->vm_end - vma->vm_start;

- DRM_DEBUG("start = 0x%lx, end = 0x%lx, offset = 0x%lx\n",
- vma->vm_start, vma->vm_end, vma->vm_offset);
+ DRM_DEBUG("start = 0x%lx, end = 0x%lx, pgoff = 0x%lx\n",
+ vma->vm_start, vma->vm_end, vma->vm_pgoff);

/* Length must match exact page count */
if ((length >> PAGE_SHIFT) != dma->page_count) return -EINVAL;
@@ -192,13 +192,17 @@
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
drm_map_t *map = NULL;
+ unsigned long off;
int i;

DRM_DEBUG("start = 0x%lx, end = 0x%lx, offset = 0x%lx\n",
- vma->vm_start, vma->vm_end, vma->vm_offset);
+ vma->vm_start, vma->vm_end, vma->vm_pgoff);

- if (!vma->vm_offset) return drm_mmap_dma(filp, vma);
+ if (!vma->vm_pgoff) return drm_mmap_dma(filp, vma);
+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) /* overflow? */
+ return -EINVAL;

+ off = vma->vm_pgoff << PAGE_SHIFT;
/* A sequential search of a linked list is
fine here because: 1) there will only be
about 5-10 entries in the list and, 2) a
@@ -208,7 +212,7 @@
bit longer. */
for (i = 0; i < dev->map_count; i++) {
map = dev->maplist[i];
- if (map->offset == vma->vm_offset) break;
+ if (map->offset == off) break;
}

if (i >= dev->map_count) return -EINVAL;
@@ -222,7 +226,7 @@
switch (map->type) {
case _DRM_FRAME_BUFFER:
case _DRM_REGISTERS:
- if (vma->vm_offset >= __pa(high_memory)) {
+ if (off >= __pa(high_memory)) {
#if defined(__i386__)
if (boot_cpu_data.x86 > 3) {
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
@@ -232,7 +236,7 @@
vma->vm_flags |= VM_IO; /* not in core dump */
}
if (remap_page_range(vma->vm_start,
- vma->vm_offset,
+ off,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
diff -ur clean/2.3.25/drivers/sbus/char/flash.c 2.3.25/drivers/sbus/char/flash.c
--- clean/2.3.25/drivers/sbus/char/flash.c Mon Nov 1 18:22:42 1999
+++ 2.3.25/drivers/sbus/char/flash.c Mon Nov 1 19:26:24 1999
@@ -55,12 +55,13 @@
return -ENXIO;
}

- if (vma->vm_offset > size)
+ if (vma->vm_pgoff > (size >> PAGE_SHIFT))
return -ENXIO;
- addr += vma->vm_offset;
+ off = vma->vm_pgoff << PAGE_SHIFT;
+ addr += off;

- if (vma->vm_end - (vma->vm_start + vma->vm_offset) > size)
- size = vma->vm_end - (vma->vm_start + vma->vm_offset);
+ if (vma->vm_end - (vma->vm_start + off) > size)
+ size = vma->vm_end - (vma->vm_start + off);

pgprot_val(vma->vm_page_prot) &= ~(_PAGE_CACHE);
pgprot_val(vma->vm_page_prot) |= _PAGE_E;
diff -ur clean/2.3.25/drivers/sbus/char/vfc_dev.c 2.3.25/drivers/sbus/char/vfc_dev.c
--- clean/2.3.25/drivers/sbus/char/vfc_dev.c Wed Jun 9 17:44:25 1999
+++ 2.3.25/drivers/sbus/char/vfc_dev.c Mon Nov 1 20:00:29 1999
@@ -572,8 +572,6 @@
if(map_size > sizeof(struct vfc_regs))
map_size=sizeof(struct vfc_regs);

-
- if(vma->vm_offset & ~PAGE_MASK) return -ENXIO;
vma->vm_flags |= VM_SHM | VM_LOCKED | VM_IO | VM_MAYREAD | VM_MAYWRITE | VM_MAYSHARE;
map_offset=(unsigned int)dev->phys_regs;
ret = io_remap_page_range(vma->vm_start,map_offset,map_size,
diff -ur clean/2.3.25/drivers/sgi/char/graphics.c 2.3.25/drivers/sgi/char/graphics.c
--- clean/2.3.25/drivers/sgi/char/graphics.c Tue Aug 31 14:23:03 1999
+++ 2.3.25/drivers/sgi/char/graphics.c Mon Nov 1 20:03:13 1999
@@ -271,8 +271,6 @@
uint size;

size = vma->vm_end - vma->vm_start;
- if (vma->vm_offset & ~PAGE_MASK)
- return -ENXIO;

/* 1. Set our special graphic virtualizer */
vma->vm_ops = &graphics_mmap;
diff -ur clean/2.3.25/drivers/sgi/char/shmiq.c 2.3.25/drivers/sgi/char/shmiq.c
--- clean/2.3.25/drivers/sgi/char/shmiq.c Mon Oct 11 13:13:25 1999
+++ 2.3.25/drivers/sgi/char/shmiq.c Mon Nov 1 19:26:24 1999
@@ -318,7 +318,7 @@
if (minor-- == 0)
return -EINVAL;

- if (vma->vm_offset != 0)
+ if (vma->vm_pgoff)
return -EINVAL;

size = vma->vm_end - vma->vm_start;
diff -ur clean/2.3.25/drivers/video/atyfb.c 2.3.25/drivers/video/atyfb.c
--- clean/2.3.25/drivers/video/atyfb.c Wed Oct 27 02:26:59 1999
+++ 2.3.25/drivers/video/atyfb.c Mon Nov 1 20:20:21 1999
@@ -3048,21 +3048,26 @@
struct fb_info_aty *fb = (struct fb_info_aty *)info;
unsigned int size, page, map_size = 0;
unsigned long map_offset = 0;
+ unsigned long off;
int i;

if (!fb->mmap_map)
return -ENXIO;

+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
+ return -EINVAL;
+
+ off = vma->vm_pgoff << PAGE_SHIFT;
size = vma->vm_end - vma->vm_start;
- if (vma->vm_offset & ~PAGE_MASK)
- return -ENXIO;

/* To stop the swapper from even considering these pages. */
vma->vm_flags |= (VM_SHM | VM_LOCKED);

- if (((vma->vm_offset == 0) && (size == fb->total_vram)) ||
- ((vma->vm_offset == fb->total_vram) && (size == PAGE_SIZE)))
- vma->vm_offset += 0x8000000000000000UL;
+ if (((vma->vm_pgoff == 0) && (size == fb->total_vram)) ||
+ ((off == fb->total_vram) && (size == PAGE_SIZE)))
+ off += 0x8000000000000000UL;
+
+ vma->vm_pgoff = off >> PAGE_SHIFT; /* propagate off changes */

#ifdef __sparc_v9__
/* Align it as much as desirable */
@@ -3070,9 +3075,9 @@
unsigned long j, align;
int max = -1;

- map_offset = vma->vm_offset+size;
+ map_offset = off + size;
for (i = 0; fb->mmap_map[i].size; i++) {
- if (fb->mmap_map[i].voff < vma->vm_offset)
+ if (fb->mmap_map[i].voff < off)
continue;
if (fb->mmap_map[i].voff >= map_offset)
break;
@@ -3092,7 +3097,7 @@
j = align;
align = j - ((vma->vm_start
+ fb->mmap_map[max].voff
- - vma->vm_offset) & (j - 1));
+ - off) & (j - 1));
if (align != j) {
struct vm_area_struct *vmm;

@@ -3115,7 +3120,7 @@
for (i = 0; fb->mmap_map[i].size; i++) {
unsigned long start = fb->mmap_map[i].voff;
unsigned long end = start + fb->mmap_map[i].size;
- unsigned long offset = vma->vm_offset + page;
+ unsigned long offset = off + page;

if (start > offset)
continue;
diff -ur clean/2.3.25/drivers/video/fbmem.c 2.3.25/drivers/video/fbmem.c
--- clean/2.3.25/drivers/video/fbmem.c Mon Nov 1 18:22:43 1999
+++ 2.3.25/drivers/video/fbmem.c Mon Nov 1 19:26:24 1999
@@ -483,9 +483,12 @@
struct fb_ops *fb = info->fbops;
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var;
- unsigned long start;
+ unsigned long start, off;
u32 len;

+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
+ return -EINVAL;
+ off = vma->vm_pgoff << PAGE_SHIFT;
if (!fb)
return -ENODEV;
if (fb->fb_mmap)
@@ -504,10 +507,10 @@
start = fix.smem_start;
len = (start & ~PAGE_MASK)+fix.smem_len;
start &= PAGE_MASK;
- len = (len+~PAGE_MASK) & PAGE_MASK;
- if (vma->vm_offset >= len) {
+ len = (len+~PAGE_MASK) & PAGE_MASK; /* someone's on crack. */
+ if (off >= len) {
/* memory mapped io */
- vma->vm_offset -= len;
+ off -= len;
fb->fb_get_var(&var, PROC_CONSOLE(info), info);
if (var.accel_flags)
return -EINVAL;
@@ -516,11 +519,10 @@
start &= PAGE_MASK;
len = (len+~PAGE_MASK) & PAGE_MASK;
}
- if ((vma->vm_end - vma->vm_start + vma->vm_offset) > len)
+ if ((vma->vm_end - vma->vm_start + off) > len)
return -EINVAL;
- vma->vm_offset += start;
- if (vma->vm_offset & ~PAGE_MASK)
- return -ENXIO;
+ off += start;
+ vma->vm_pgoff = off >> PAGE_CACHE_SHIFT;
#if defined(__mc68000__)
if (CPU_IS_020_OR_030)
pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE030;
@@ -549,7 +551,7 @@
#else
#warning What do we have to do here??
#endif
- if (io_remap_page_range(vma->vm_start, vma->vm_offset,
+ if (io_remap_page_range(vma->vm_start, off,
vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
return 0;
diff -ur clean/2.3.25/drivers/video/igafb.c 2.3.25/drivers/video/igafb.c
--- clean/2.3.25/drivers/video/igafb.c Thu Aug 19 14:01:00 1999
+++ 2.3.25/drivers/video/igafb.c Mon Nov 1 19:26:24 1999
@@ -261,8 +261,6 @@
return -ENXIO;

size = vma->vm_end - vma->vm_start;
- if (vma->vm_offset & ~PAGE_MASK)
- return -ENXIO;

/* To stop the swapper from even considering these pages. */
vma->vm_flags |= (VM_SHM | VM_LOCKED);
@@ -271,17 +269,17 @@
for (page = 0; page < size; ) {
map_size = 0;
for (i = 0; fb->mmap_map[i].size; i++) {
- unsigned long start = fb->mmap_map[i].voff;
- unsigned long end = start + fb->mmap_map[i].size;
- unsigned long offset = vma->vm_offset + page;
+ unsigned long start = (fb->mmap_map[i].voff) >> PAGE_SHIFT;
+ unsigned long end = start + (fb->mmap_map[i].size) >> PAGE_SHIFT;
+ unsigned long offset = vma->vm_pgoff + (page >> PAGE_SHIFT);

if (start > offset)
continue;
if (offset >= end)
continue;

- map_size = fb->mmap_map[i].size - (offset - start);
- map_offset = fb->mmap_map[i].poff + (offset - start);
+ map_size = fb->mmap_map[i].size - ((offset - start) << PAGE_SHIFT);
+ map_offset = fb->mmap_map[i].poff + ((offset - start) << PAGE_SHIFT);
break;
}
if (!map_size) {
diff -ur clean/2.3.25/drivers/video/sbusfb.c 2.3.25/drivers/video/sbusfb.c
--- clean/2.3.25/drivers/video/sbusfb.c Mon Oct 11 13:26:52 1999
+++ 2.3.25/drivers/video/sbusfb.c Tue Nov 2 20:16:57 1999
@@ -175,12 +175,15 @@
struct fb_info_sbusfb *fb = sbusfbinfo(info);
unsigned int size, page, r, map_size;
unsigned long map_offset = 0;
+ unsigned long off;
int i;

size = vma->vm_end - vma->vm_start;
- if (vma->vm_offset & ~PAGE_MASK)
- return -ENXIO;
-
+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
+ return -EINVAL;
+
+ off = vma->vm_pgoff << PAGE_SHIFT;
+
/* To stop the swapper from even considering these pages */
vma->vm_flags |= (VM_SHM| VM_LOCKED);

@@ -190,9 +193,9 @@
unsigned long j, alignment, s = 0;
int max = -1;

- map_offset = vma->vm_offset+size;
+ map_offset = (vma->vm_pgoff << PAGE_SHIFT) + size;
for (i = 0; fb->mmap_map[i].size; i++) {
- if (fb->mmap_map[i].voff < vma->vm_offset)
+ if (fb->mmap_map[i].voff < off)
continue;
if (fb->mmap_map[i].voff >= map_offset)
break;
@@ -210,7 +213,7 @@
break;
if (alignment > PAGE_SIZE) {
j = alignment;
- alignment = j - ((vma->vm_start + fb->mmap_map[max].voff - vma->vm_offset) & (j - 1));
+ alignment = j - ((vma->vm_start + fb->mmap_map[max].voff - off) & (j - 1));
if (alignment != j) {
struct vm_area_struct *vmm = find_vma(current->mm, vma->vm_start);
if (!vmm || vmm->vm_start >= vma->vm_end + alignment) {
@@ -227,7 +230,7 @@
for (page = 0; page < size; ){
map_size = 0;
for (i = 0; fb->mmap_map[i].size; i++)
- if (fb->mmap_map[i].voff == vma->vm_offset+page) {
+ if (fb->mmap_map[i].voff == off+page) {
map_size = sbusfb_mmapsize(fb,fb->mmap_map[i].size);
#ifdef __sparc_v9__
#define POFF_MASK (PAGE_MASK|0x1UL)
diff -ur clean/2.3.25/drivers/video/sgivwfb.c 2.3.25/drivers/video/sgivwfb.c
--- clean/2.3.25/drivers/video/sgivwfb.c Thu Aug 19 14:01:00 1999
+++ 2.3.25/drivers/video/sgivwfb.c Mon Nov 1 19:26:24 1999
@@ -907,9 +907,12 @@
struct vm_area_struct *vma)
{
unsigned long size = vma->vm_end - vma->vm_start;
- unsigned long offset = sgivwfb_mem_phys + vma->vm_offset;
- if (vma->vm_offset+size > sgivwfb_mem_size)
+ unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
+ return -EINVAL;
+ if (offset+size > sgivwfb_mem_size)
return -EINVAL;
+ offset += sgivwfb_mem_phys;
pgprot_val(vma->vm_page_prot) = pgprot_val(vma->vm_page_prot) | _PAGE_PCD;
vma->vm_flags |= VM_IO;
if (remap_page_range(vma->vm_start, offset, size, vma->vm_page_prot))


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:54    [W:0.056 / U:0.104 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site