Messages in this thread Patch in this message | | | Date | Wed, 3 Nov 1999 12:16:28 -0500 (EST) | From | <> | Subject | Re: 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/
| |