From 02706647a49011ae1e7b4eca33e835d1681b094e Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Tue, 10 Jan 2006 23:15:02 +0100 Subject: [PATCH] mutex: trivial whitespace cleanups Signed-off-by: Ingo Molnar Signed-off-by: Linus Torvalds diff --git a/kernel/mutex-debug.c b/kernel/mutex-debug.c index 3dec753..6f82905 100644 --- a/kernel/mutex-debug.c +++ b/kernel/mutex-debug.c @@ -459,4 +459,3 @@ void fastcall mutex_destroy(struct mutex *lock) } EXPORT_SYMBOL_GPL(mutex_destroy); - diff --git a/kernel/mutex.c b/kernel/mutex.c index 5c25618..5449b21 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -202,7 +202,7 @@ __mutex_lock_slowpath(atomic_t *lock_count __IP_DECL__) static fastcall noinline void __mutex_unlock_slowpath(atomic_t *lock_count __IP_DECL__) { - struct mutex *lock = container_of(lock_count, struct mutex, count); + struct mutex *lock = container_of(lock_count, struct mutex, count); DEBUG_WARN_ON(lock->owner != current_thread_info()); @@ -313,6 +313,3 @@ int fastcall mutex_trylock(struct mutex *lock) } EXPORT_SYMBOL(mutex_trylock); - - - -- cgit v0.10.2 From 7823c7c121839f5a003acdf9c2f1839bfa2f6c43 Mon Sep 17 00:00:00 2001 From: Luiz Fernando Capitulino Date: Wed, 11 Jan 2006 01:38:27 +0100 Subject: ext2: trivial indentation fix. This memset() line was indented with seven spaces, this patch fixes it to use a tab instead. Yes, very trivial but it's the third time I have to look at this line.. Signed-off-by: Luiz Capitulino Signed-off-by: Adrian Bunk diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index 5b5f528..7442bdd 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c @@ -592,7 +592,7 @@ int ext2_make_empty(struct inode *inode, struct inode *parent) goto fail; } kaddr = kmap_atomic(page, KM_USER0); - memset(kaddr, 0, chunk_size); + memset(kaddr, 0, chunk_size); de = (struct ext2_dir_entry_2 *)kaddr; de->name_len = 1; de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(1)); -- cgit v0.10.2 From 210bb9560cb697c950e803d0fdaf9869efefed54 Mon Sep 17 00:00:00 2001 From: Adrian Bunk Date: Wed, 11 Jan 2006 01:43:01 +0100 Subject: MAINTAINERS: sh: update the mailing list Signed-off-by: Adrian Bunk diff --git a/MAINTAINERS b/MAINTAINERS index 090e10b..b6416a2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2487,7 +2487,7 @@ P: Paul Mundt M: lethal@linux-sh.org P: Kazumoto Kojima M: kkojima@rr.iij4u.or.jp -L: linux-sh@m17n.org +L: linuxsh-dev@lists.sourceforge.net W: http://www.linux-sh.org W: http://www.m17n.org/linux-sh/ W: http://www.rr.iij4u.or.jp/~kkojima/linux-sh4.html -- cgit v0.10.2 From ffd59daceb7db5f7c54f095c5529cec45222c1f1 Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Wed, 11 Jan 2006 01:48:08 +0100 Subject: Tiny esthetic changes to Documentation/laptop-mode.txt Here's a tiny patch making a few esthetic changes to Documentation/laptop-mode.txt To me this patch makes sense, but feel free to disagree, I don't feel strongly about it at all. It changes a single URL to its strictly correct form (directories should end in /), and it makes the arguments to main in an included example program follow convention and be named argc and argv. Signed-off-by: Jesper Juhl Signed-off-by: Adrian Bunk diff --git a/Documentation/laptop-mode.txt b/Documentation/laptop-mode.txt index dc4e810..f42e4c0 100644 --- a/Documentation/laptop-mode.txt +++ b/Documentation/laptop-mode.txt @@ -3,7 +3,7 @@ How to conserve battery power using laptop-mode Document Author: Bart Samwel (bart@samwel.tk) Date created: January 2, 2004 -Last modified: July 10, 2004 +Last modified: December 06, 2004 Introduction ------------ @@ -33,7 +33,7 @@ or anything. Simply install all the files included in this document, and laptop mode will automatically be started when you're on battery. For your convenience, a tarball containing an installer can be downloaded at: -http://www.xs4all.nl/~bsamwel/laptop_mode/tools +http://www.xs4all.nl/~bsamwel/laptop_mode/tools/ To configure laptop mode, you need to edit the configuration file, which is located in /etc/default/laptop-mode on Debian-based systems, or in @@ -912,7 +912,7 @@ void usage() exit(0); } -int main(int ac, char **av) +int main(int argc, char **argv) { int fd; char *disk = 0; -- cgit v0.10.2 From e97a31117c0f96be6637f68b4029609bb1f2cc7c Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Wed, 11 Jan 2006 01:50:28 +0100 Subject: add missing printk loglevel in mm/swapfile.c in mm/swapfile.c a printk() is missing a loglevel. I believe the proper loglevel for this situation is KERN_ERR, so that's what the patch below sets -if you agree, please apply. Signed-off-by: Jesper Juhl Signed-off-by: Adrian Bunk diff --git a/mm/swapfile.c b/mm/swapfile.c index 6544565..d8a5afc 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1442,7 +1442,7 @@ asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags) else if (!memcmp("SWAPSPACE2",swap_header->magic.magic,10)) swap_header_version = 2; else { - printk("Unable to find swap-space signature\n"); + printk(KERN_ERR "Unable to find swap-space signature\n"); error = -EINVAL; goto bad_swap; } -- cgit v0.10.2 From 74da6cd06225da6971943bea6a33f4cb7f6b76a3 Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Wed, 11 Jan 2006 01:51:26 +0100 Subject: missing printk loglevel and tiny tiny whitespace change in binfmt_elf() Patch adds a mising printk loglevel (I think KERN_WARNING is appropriate here) in fs/binfmt_elf.c, and while I was there I made some tiny tiny tiny adjustments to whitespacing in the neighborhood. Signed-off-by: Jesper Juhl Signed-off-by: Adrian Bunk diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index a4f6f57..f979ebb 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1634,17 +1634,17 @@ static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file) ELF_CORE_WRITE_EXTRA_DATA; #endif - if ((off_t) file->f_pos != offset) { + if ((off_t)file->f_pos != offset) { /* Sanity check */ - printk("elf_core_dump: file->f_pos (%ld) != offset (%ld)\n", - (off_t) file->f_pos, offset); + printk(KERN_WARNING "elf_core_dump: file->f_pos (%ld) != offset (%ld)\n", + (off_t)file->f_pos, offset); } end_coredump: set_fs(fs); cleanup: - while(!list_empty(&thread_list)) { + while (!list_empty(&thread_list)) { struct list_head *tmp = thread_list.next; list_del(tmp); kfree(list_entry(tmp, struct elf_thread_status, list)); -- cgit v0.10.2 From e8d2a424675d9878356397e2ecfc632bbf09aa2c Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Wed, 11 Jan 2006 01:52:40 +0100 Subject: add loglevel to printk in fs/afs/cmservice.c This is a small patch that adds loglevel to a printk in fs/afs/cmservice.c Signed-off-by: Jesper Juhl Signed-off-by: Adrian Bunk diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c index 0a57fd7..9eef6bf 100644 --- a/fs/afs/cmservice.c +++ b/fs/afs/cmservice.c @@ -118,7 +118,7 @@ static int kafscmd(void *arg) _SRXAFSCM_xxxx_t func; int die; - printk("kAFS: Started kafscmd %d\n", current->pid); + printk(KERN_INFO "kAFS: Started kafscmd %d\n", current->pid); daemonize("kafscmd"); -- cgit v0.10.2 From b56d55b69c5c787b279819f5c0c2d5f5864d0fc2 Mon Sep 17 00:00:00 2001 From: Adrian Bunk Date: Wed, 11 Jan 2006 02:00:10 +0100 Subject: drivers/net/gianfar_sysfs.c: update email address of Kumar Gala drivers/net/gianfar_sysfs.c still contained the old email address of Kumar Gala. Signed-off-by: Adrian Bunk diff --git a/drivers/net/gianfar_sysfs.c b/drivers/net/gianfar_sysfs.c index 10d34cb..51ef181 100644 --- a/drivers/net/gianfar_sysfs.c +++ b/drivers/net/gianfar_sysfs.c @@ -7,7 +7,7 @@ * Based on 8260_io/fcc_enet.c * * Author: Andy Fleming - * Maintainer: Kumar Gala (kumar.gala@freescale.com) + * Maintainer: Kumar Gala (galak@kernel.crashing.org) * * Copyright (c) 2002-2005 Freescale Semiconductor, Inc. * -- cgit v0.10.2 From 864913f30dbd6f75b94045cd20ea0b082996287e Mon Sep 17 00:00:00 2001 From: Paul Jackson Date: Wed, 11 Jan 2006 02:01:38 +0100 Subject: cpuset two little doc fixes Two little cpuset documentation fixes. Signed-off-by: Paul Jackson Signed-off-by: Adrian Bunk diff --git a/Documentation/cpusets.txt b/Documentation/cpusets.txt index 9e49b1c..990998e 100644 --- a/Documentation/cpusets.txt +++ b/Documentation/cpusets.txt @@ -135,7 +135,7 @@ Cpusets extends these two mechanisms as follows: The implementation of cpusets requires a few, simple hooks into the rest of the kernel, none in performance critical paths: - - in main/init.c, to initialize the root cpuset at system boot. + - in init/main.c, to initialize the root cpuset at system boot. - in fork and exit, to attach and detach a task from its cpuset. - in sched_setaffinity, to mask the requested CPUs by what's allowed in that tasks cpuset. @@ -146,7 +146,7 @@ into the rest of the kernel, none in performance critical paths: and related changes in both sched.c and arch/ia64/kernel/domain.c - in the mbind and set_mempolicy system calls, to mask the requested Memory Nodes by what's allowed in that tasks cpuset. - - in page_alloc, to restrict memory to allowed nodes. + - in page_alloc.c, to restrict memory to allowed nodes. - in vmscan.c, to restrict page recovery to the current cpuset. In addition a new file system, of type "cpuset" may be mounted, -- cgit v0.10.2 From b8ab50bc554c2f9149e6d0ae741e05810e581ea5 Mon Sep 17 00:00:00 2001 From: Nicolas Kaiser Date: Wed, 11 Jan 2006 02:04:35 +0100 Subject: netfilter: headers included twice Headers included twice. Signed-off-by: Nicolas Kaiser Signed-off-by: Adrian Bunk diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c index 1ab94c6..16a5a31 100644 --- a/net/decnet/netfilter/dn_rtmsg.c +++ b/net/decnet/netfilter/dn_rtmsg.c @@ -26,8 +26,6 @@ #include #include -#include - static struct sock *dnrmg = NULL; diff --git a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c index f2a90e2..3021af0 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c index ea2b39c..e0dc370 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c @@ -32,7 +32,6 @@ #include -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_conntrack_proto_udp.c b/net/ipv4/netfilter/ip_conntrack_proto_udp.c index 004003f..55b7d32 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_udp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_udp.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include -- cgit v0.10.2 From 099f7f0a828bfef7b7047101cf52dc44a4b1d76f Mon Sep 17 00:00:00 2001 From: Nicolas Kaiser Date: Wed, 11 Jan 2006 02:06:20 +0100 Subject: xfs: header included twice Header included twice. Signed-off-by: Nicolas Kaiser Signed-off-by: Adrian Bunk diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 45a77a3..ca7afc8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -40,7 +40,6 @@ #include "xfs_ialloc.h" #include "xfs_btree.h" #include "xfs_bmap.h" -#include "xfs_bit.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -- cgit v0.10.2 From 0563572bf47efdc02a059b923d3c1e589783c019 Mon Sep 17 00:00:00 2001 From: Nicolas Kaiser Date: Wed, 11 Jan 2006 02:07:34 +0100 Subject: asm-powerpc: header included twice Header included twice. Signed-off-by: Nicolas Kaiser Signed-off-by: Adrian Bunk diff --git a/include/asm-powerpc/elf.h b/include/asm-powerpc/elf.h index c5a635d..45f2af6 100644 --- a/include/asm-powerpc/elf.h +++ b/include/asm-powerpc/elf.h @@ -92,7 +92,6 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include #define ELF_NGREG 48 /* includes nip, msr, lr, etc. */ #define ELF_NFPREG 33 /* includes fpscr */ -- cgit v0.10.2 From c566c6dbf9cb0eed6e11ec7a4141e7af68ec2316 Mon Sep 17 00:00:00 2001 From: Nicolas Kaiser Date: Wed, 11 Jan 2006 02:08:57 +0100 Subject: fs/attr.c: header included twice Header included twice. Signed-off-by: Nicolas Kaiser Signed-off-by: Adrian Bunk diff --git a/fs/attr.c b/fs/attr.c index b347325..d63e509 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -14,7 +14,6 @@ #include #include #include -#include /* Taken over from the old code... */ -- cgit v0.10.2 From 7da942e5bc889bc970554876a8c03d7e2af9923d Mon Sep 17 00:00:00 2001 From: Nicolas Kaiser Date: Wed, 11 Jan 2006 02:10:28 +0100 Subject: fs/proc/vmcore.c: header included twice Header included twice. Signed-off-by: Nicolas Kaiser Signed-off-by: Adrian Bunk diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index 5378d7c7..124e354 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include -- cgit v0.10.2 From 8039de10aae3cd4cf0ef0ccebd58aff0e8810df2 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:35:03 -0500 Subject: [PARISC] Add __read_mostly section for parisc Flag a whole bunch of things as __read_mostly on parisc. Also flag a few branches as unlikely() and cleanup a bit of code. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index a065349..63047c6 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -29,9 +29,9 @@ #include #include -int split_tlb; -int dcache_stride; -int icache_stride; +int split_tlb __read_mostly; +int dcache_stride __read_mostly; +int icache_stride __read_mostly; EXPORT_SYMBOL(dcache_stride); @@ -45,9 +45,9 @@ DEFINE_SPINLOCK(pa_tlb_lock); EXPORT_SYMBOL(pa_tlb_lock); #endif -struct pdc_cache_info cache_info; +struct pdc_cache_info cache_info __read_mostly; #ifndef CONFIG_PA20 -static struct pdc_btlb_info btlb_info; +static struct pdc_btlb_info btlb_info __read_mostly; #endif #ifdef CONFIG_SMP @@ -332,7 +332,7 @@ void clear_user_page_asm(void *page, unsigned long vaddr) } #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ -int parisc_cache_flush_threshold = FLUSH_THRESHOLD; +int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD; void parisc_setup_cache_timing(void) { diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index d016d67..041524d 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c @@ -39,7 +39,7 @@ #include /* See comments in include/asm-parisc/pci.h */ -struct hppa_dma_ops *hppa_dma_ops; +struct hppa_dma_ops *hppa_dma_ops __read_mostly; EXPORT_SYMBOL(hppa_dma_ops); static struct device root = { diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 553f8fe..2dc06b8 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -80,7 +80,7 @@ static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); /* Firmware needs to be initially set to narrow to determine the * actual firmware width. */ -int parisc_narrow_firmware = 1; +int parisc_narrow_firmware __read_mostly = 1; #endif /* On most currently-supported platforms, IODC I/O calls are 32-bit calls diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index 8f56387..4e847ba 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c @@ -38,7 +38,7 @@ */ #undef DEBUG_PAT -int pdc_type = PDC_TYPE_ILLEGAL; +int pdc_type __read_mostly = PDC_TYPE_ILLEGAL; void __init setup_pdc(void) { @@ -120,8 +120,8 @@ set_pmem_entry(physmem_range_t *pmem_ptr, unsigned long start, * pdc info is bad in this case). */ - if ( ((start & (PAGE_SIZE - 1)) != 0) - || ((pages4k & ((1UL << PDC_PAGE_ADJ_SHIFT) - 1)) != 0) ) { + if (unlikely( ((start & (PAGE_SIZE - 1)) != 0) + || ((pages4k & ((1UL << PDC_PAGE_ADJ_SHIFT) - 1)) != 0) )) { panic("Memory range doesn't align with page size!\n"); } diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index f94a02e..a6caf10 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c @@ -33,10 +33,10 @@ #include #include /* for purge_tlb_*() macros */ -static struct proc_dir_entry * proc_gsc_root = NULL; +static struct proc_dir_entry * proc_gsc_root __read_mostly = NULL; static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length); -static unsigned long pcxl_used_bytes = 0; -static unsigned long pcxl_used_pages = 0; +static unsigned long pcxl_used_bytes __read_mostly = 0; +static unsigned long pcxl_used_pages __read_mostly = 0; extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */ static spinlock_t pcxl_res_lock; diff --git a/arch/parisc/kernel/pdc_chassis.c b/arch/parisc/kernel/pdc_chassis.c index 52004ae..2a01fe1 100644 --- a/arch/parisc/kernel/pdc_chassis.c +++ b/arch/parisc/kernel/pdc_chassis.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -38,8 +39,8 @@ #ifdef CONFIG_PDC_CHASSIS -static int pdc_chassis_old = 0; -static unsigned int pdc_chassis_enabled = 1; +static int pdc_chassis_old __read_mostly = 0; +static unsigned int pdc_chassis_enabled __read_mostly = 1; /** @@ -132,7 +133,7 @@ void __init parisc_pdc_chassis_init(void) { #ifdef CONFIG_PDC_CHASSIS int handle = 0; - if (pdc_chassis_enabled) { + if (likely(pdc_chassis_enabled)) { DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__); /* Let see if we have something to handle... */ @@ -142,7 +143,7 @@ void __init parisc_pdc_chassis_init(void) printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n"); handle = 1; } - else if (pdc_chassis_old) { + else if (unlikely(pdc_chassis_old)) { printk(KERN_INFO "Enabling old style chassis LED panel support.\n"); handle = 1; } @@ -178,7 +179,7 @@ int pdc_chassis_send_status(int message) /* Maybe we should do that in an other way ? */ int retval = 0; #ifdef CONFIG_PDC_CHASSIS - if (pdc_chassis_enabled) { + if (likely(pdc_chassis_enabled)) { DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message); @@ -214,7 +215,7 @@ int pdc_chassis_send_status(int message) } } else retval = -1; #else - if (pdc_chassis_old) { + if (unlikely(pdc_chassis_old)) { switch (message) { case PDC_CHASSIS_DIRECT_BSTART: case PDC_CHASSIS_DIRECT_BCOMPLETE: diff --git a/arch/parisc/kernel/perf.c b/arch/parisc/kernel/perf.c index f6fec62..79dcbcc 100644 --- a/arch/parisc/kernel/perf.c +++ b/arch/parisc/kernel/perf.c @@ -66,10 +66,10 @@ struct rdr_tbl_ent { uint8_t write_control; }; -static int perf_processor_interface = UNKNOWN_INTF; -static int perf_enabled = 0; +static int perf_processor_interface __read_mostly = UNKNOWN_INTF; +static int perf_enabled __read_mostly = 0; static spinlock_t perf_lock; -struct parisc_device *cpu_device = NULL; +struct parisc_device *cpu_device __read_mostly = NULL; /* RDRs to write for PCX-W */ static int perf_rdrs_W[] = diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index fee4f1f..4eb70a4 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c @@ -54,7 +54,7 @@ #include #include -static int hlt_counter; +static int hlt_counter __read_mostly; /* * Power off function, if any diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index 4f5bbcf..6df9f62 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c @@ -44,10 +44,10 @@ #include /* for struct irq_region */ #include -struct system_cpuinfo_parisc boot_cpu_data; +struct system_cpuinfo_parisc boot_cpu_data __read_mostly; EXPORT_SYMBOL(boot_cpu_data); -struct cpuinfo_parisc cpu_data[NR_CPUS]; +struct cpuinfo_parisc cpu_data[NR_CPUS] __read_mostly; /* ** PARISC CPU driver - claim "device" and initialize CPU data structures. @@ -378,12 +378,12 @@ show_cpuinfo (struct seq_file *m, void *v) return 0; } -static struct parisc_device_id processor_tbl[] = { +static struct parisc_device_id processor_tbl[] __read_mostly = { { HPHW_NPROC, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, SVERSION_ANY_ID }, { 0, } }; -static struct parisc_driver cpu_driver = { +static struct parisc_driver cpu_driver __read_mostly = { .name = "CPU", .id_table = processor_tbl, .probe = processor_probe diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 73e9c34..4a36ec3 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c @@ -46,15 +46,15 @@ #include #include -char command_line[COMMAND_LINE_SIZE]; +char command_line[COMMAND_LINE_SIZE] __read_mostly; /* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */ -struct proc_dir_entry * proc_runway_root = NULL; -struct proc_dir_entry * proc_gsc_root = NULL; -struct proc_dir_entry * proc_mckinley_root = NULL; +struct proc_dir_entry * proc_runway_root __read_mostly = NULL; +struct proc_dir_entry * proc_gsc_root __read_mostly = NULL; +struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL; #if !defined(CONFIG_PA20) && (defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA)) -int parisc_bus_is_phys = 1; /* Assume no IOMMU is present */ +int parisc_bus_is_phys __read_mostly = 1; /* Assume no IOMMU is present */ EXPORT_SYMBOL(parisc_bus_is_phys); #endif diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index ce89da0..fb3ca84 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -58,9 +58,9 @@ DEFINE_SPINLOCK(smp_lock); volatile struct task_struct *smp_init_current_idle_task; -static volatile int cpu_now_booting = 0; /* track which CPU is booting */ +static volatile int cpu_now_booting __read_mostly = 0; /* track which CPU is booting */ -static int parisc_max_cpus = 1; +static int parisc_max_cpus __read_mostly = 1; /* online cpus are ones that we've managed to bring up completely * possible cpus are all valid cpu @@ -71,8 +71,8 @@ static int parisc_max_cpus = 1; * empty in the beginning. */ -cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */ -cpumask_t cpu_possible_map = CPU_MASK_ALL; /* Bitmap of Present CPUs */ +cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE; /* Bitmap of online CPUs */ +cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CPUs */ EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_possible_map); diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index cded256..594930b 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c @@ -36,8 +36,8 @@ /* xtime and wall_jiffies keep wall-clock time */ extern unsigned long wall_jiffies; -static long clocktick; /* timer cycles per tick */ -static long halftick; +static long clocktick __read_mostly; /* timer cycles per tick */ +static long halftick __read_mostly; #ifdef CONFIG_SMP extern void smp_do_timer(struct pt_regs *regs); diff --git a/arch/parisc/kernel/topology.c b/arch/parisc/kernel/topology.c index ac2a406..3ba0400 100644 --- a/arch/parisc/kernel/topology.c +++ b/arch/parisc/kernel/topology.c @@ -20,8 +20,9 @@ #include #include #include +#include -static struct cpu cpu_devices[NR_CPUS]; +static struct cpu cpu_devices[NR_CPUS] __read_mostly; static int __init topology_init(void) { diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index eaae8a0..de0a1b2 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c @@ -122,7 +122,7 @@ #define ERR_NOTHANDLED -1 #define ERR_PAGEFAULT -2 -int unaligned_enabled = 1; +int unaligned_enabled __read_mostly = 1; void die_if_kernel (char *str, struct pt_regs *regs, long err); diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index db14110..cc1c1af 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c @@ -35,7 +35,7 @@ static spinlock_t unwind_lock; * we can call unwind_init as early in the bootup process as * possible (before the slab allocator is initialized) */ -static struct unwind_table kernel_unwind_table; +static struct unwind_table kernel_unwind_table __read_mostly; static LIST_HEAD(unwind_tables); static inline const struct unwind_table_entry * diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index e5fac3e..b8b9174 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S @@ -105,6 +105,10 @@ SECTIONS . = ALIGN(16); .data.lock_aligned : { *(.data.lock_aligned) } + /* rarely changed data like cpu maps */ + . = ALIGN(16); + .data.read_mostly : { *(.data.read_mostly) } + _edata = .; /* End of data section */ . = ALIGN(16384); /* init_task */ diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 29b998e..a992cb8 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c @@ -36,9 +36,9 @@ extern char _end; /* end of BSS, defined by linker */ extern char __init_begin, __init_end; #ifdef CONFIG_DISCONTIGMEM -struct node_map_data node_data[MAX_NUMNODES]; -bootmem_data_t bmem_data[MAX_NUMNODES]; -unsigned char pfnnid_map[PFNNID_MAP_MAX]; +struct node_map_data node_data[MAX_NUMNODES] __read_mostly; +bootmem_data_t bmem_data[MAX_NUMNODES] __read_mostly; +unsigned char pfnnid_map[PFNNID_MAP_MAX] __read_mostly; #endif static struct resource data_resource = { @@ -58,14 +58,14 @@ static struct resource pdcdata_resource = { .flags = IORESOURCE_BUSY | IORESOURCE_MEM, }; -static struct resource sysram_resources[MAX_PHYSMEM_RANGES]; +static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly; /* The following array is initialized from the firmware specific * information retrieved in kernel/inventory.c. */ -physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES]; -int npmem_ranges; +physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly; +int npmem_ranges __read_mostly; #ifdef __LP64__ #define MAX_MEM (~0UL) @@ -73,7 +73,7 @@ int npmem_ranges; #define MAX_MEM (3584U*1024U*1024U) #endif /* !__LP64__ */ -static unsigned long mem_limit = MAX_MEM; +static unsigned long mem_limit __read_mostly = MAX_MEM; static void __init mem_limit_func(void) { @@ -431,11 +431,11 @@ void free_initmem(void) #define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \ & ~(VM_MAP_OFFSET-1))) -void *vmalloc_start; +void *vmalloc_start __read_mostly; EXPORT_SYMBOL(vmalloc_start); #ifdef CONFIG_PA11 -unsigned long pcxl_dma_start; +unsigned long pcxl_dma_start __read_mostly; #endif void __init mem_init(void) @@ -475,7 +475,7 @@ int do_check_pgt_cache(int low, int high) return 0; } -unsigned long *empty_zero_page; +unsigned long *empty_zero_page __read_mostly; void show_mem(void) { diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 6362bf9..3d94d86 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c @@ -57,7 +57,7 @@ static DEFINE_SPINLOCK(eisa_irq_lock); -void __iomem *eisa_eeprom_addr; +void __iomem *eisa_eeprom_addr __read_mostly; /* We can only have one EISA adapter in the system because neither * implementation can be flexed. @@ -141,7 +141,7 @@ static int slave_mask; * in the furure. */ /* irq 13,8,2,1,0 must be edge */ -static unsigned int eisa_irq_level; /* default to edge triggered */ +static unsigned int eisa_irq_level __read_mostly; /* default to edge triggered */ /* called by free irq */ diff --git a/drivers/parisc/lasi.c b/drivers/parisc/lasi.c index a8c2039..2b3ba1d 100644 --- a/drivers/parisc/lasi.c +++ b/drivers/parisc/lasi.c @@ -150,7 +150,7 @@ void __init lasi_led_init(unsigned long lasi_hpa) * */ -static unsigned long lasi_power_off_hpa; +static unsigned long lasi_power_off_hpa __read_mostly; static void lasi_power_off(void) { diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 5e495dc..4f6bdf0 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -167,7 +167,7 @@ /* non-postable I/O port space, densely packed */ #define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL) -static void __iomem *astro_iop_base; +static void __iomem *astro_iop_base __read_mostly; #define ELROY_HVERS 0x782 #define MERCURY_HVERS 0x783 diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index 315be47..f357d3f 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -3,7 +3,7 @@ * * (c) Copyright 2000 Red Hat Software * (c) Copyright 2000 Helge Deller - * (c) Copyright 2001-2004 Helge Deller + * (c) Copyright 2001-2005 Helge Deller * (c) Copyright 2001 Randolph Chung * * This program is free software; you can redistribute it and/or modify @@ -56,13 +56,13 @@ relatively large amount of CPU time, some of the calculations can be turned off with the following variables (controlled via procfs) */ -static int led_type = -1; +static int led_type __read_mostly = -1; static unsigned char lastleds; /* LED state from most recent update */ -static unsigned int led_heartbeat = 1; -static unsigned int led_diskio = 1; -static unsigned int led_lanrxtx = 1; -static char lcd_text[32]; -static char lcd_text_default[32]; +static unsigned int led_heartbeat __read_mostly = 1; +static unsigned int led_diskio __read_mostly = 1; +static unsigned int led_lanrxtx __read_mostly = 1; +static char lcd_text[32] __read_mostly; +static char lcd_text_default[32] __read_mostly; static struct workqueue_struct *led_wq; @@ -108,7 +108,7 @@ struct pdc_chassis_lcd_info_ret_block { /* lcd_info is pre-initialized to the values needed to program KittyHawk LCD's * HP seems to have used Sharp/Hitachi HD44780 LCDs most of the time. */ static struct pdc_chassis_lcd_info_ret_block -lcd_info __attribute__((aligned(8))) = +lcd_info __attribute__((aligned(8))) __read_mostly = { .model = DISPLAY_MODEL_LCD, .lcd_width = 16, @@ -144,7 +144,7 @@ static int start_task(void) device_initcall(start_task); /* ptr to LCD/LED-specific function */ -static void (*led_func_ptr) (unsigned char); +static void (*led_func_ptr) (unsigned char) __read_mostly; #ifdef CONFIG_PROC_FS static int led_proc_read(char *page, char **start, off_t off, int count, diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index 273a741..11750cb 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c @@ -70,7 +70,7 @@ MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data"); MODULE_LICENSE("GPL"); MODULE_VERSION(PDCS_VERSION); -static unsigned long pdcs_size = 0; +static unsigned long pdcs_size __read_mostly; /* This struct defines what we need to deal with a parisc pdc path entry */ struct pdcspath_entry { diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index ff75e92..54b2b7f 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -2,7 +2,7 @@ * linux/arch/parisc/kernel/power.c * HP PARISC soft power switch support driver * - * Copyright (c) 2001-2002 Helge Deller + * Copyright (c) 2001-2005 Helge Deller * All rights reserved. * * @@ -102,7 +102,7 @@ static DECLARE_WORK(poweroff_work, deferred_poweroff, NULL); static void poweroff(void) { - static int powering_off; + static int powering_off __read_mostly; if (powering_off) return; @@ -113,7 +113,7 @@ static void poweroff(void) /* local time-counter for shutdown */ -static int shutdown_timer; +static int shutdown_timer __read_mostly; /* check, give feedback and start shutdown after one second */ static void process_shutdown(void) @@ -139,7 +139,7 @@ static void process_shutdown(void) DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0); /* soft power switch enabled/disabled */ -int pwrsw_enabled = 1; +int pwrsw_enabled __read_mostly = 1; /* * On gecko style machines (e.g. 712/xx and 715/xx) @@ -149,7 +149,7 @@ int pwrsw_enabled = 1; */ static void gecko_tasklet_func(unsigned long unused) { - if (!pwrsw_enabled) + if (unlikely(!pwrsw_enabled)) return; if (__getDIAG(25) & 0x80000000) { @@ -173,7 +173,7 @@ static void polling_tasklet_func(unsigned long soft_power_reg) { unsigned long current_status; - if (!pwrsw_enabled) + if (unlikely(!pwrsw_enabled)) return; current_status = gsc_readl(soft_power_reg); diff --git a/include/linux/cache.h b/include/linux/cache.h index ffe5221..d22e632 100644 --- a/include/linux/cache.h +++ b/include/linux/cache.h @@ -13,7 +13,7 @@ #define SMP_CACHE_BYTES L1_CACHE_BYTES #endif -#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64) +#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC) #define __read_mostly __attribute__((__section__(".data.read_mostly"))) #else #define __read_mostly -- cgit v0.10.2 From 1b2425e3c79984975a1a3e6fa84512f23d96da9f Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 10 Jan 2006 20:47:49 -0500 Subject: [PARISC] Make local cache flushes take a void * Make flush_data_cache_local, flush_instruction_cache_local and flush_tlb_all_local take a void * so they don't have to be cast when using on_each_cpu(). This becomes a problem when on_each_cpu is a macro (as it is in current -mm). Also move the prototype of flush_tlb_all_local into tlbflush.h and remove its declaration from .c files. Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 63047c6..d8a4ca0 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -54,20 +54,20 @@ static struct pdc_btlb_info btlb_info __read_mostly; void flush_data_cache(void) { - on_each_cpu((void (*)(void *))flush_data_cache_local, NULL, 1, 1); + on_each_cpu(flush_data_cache_local, NULL, 1, 1); } void flush_instruction_cache(void) { - on_each_cpu((void (*)(void *))flush_instruction_cache_local, NULL, 1, 1); + on_each_cpu(flush_instruction_cache_local, NULL, 1, 1); } #endif void flush_cache_all_local(void) { - flush_instruction_cache_local(); - flush_data_cache_local(); + flush_instruction_cache_local(NULL); + flush_data_cache_local(NULL); } EXPORT_SYMBOL(flush_cache_all_local); diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index fb3ca84..17f23c2 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -39,7 +39,7 @@ #include #include #include -#include /* for flush_tlb_all() proto/macro */ +#include #include #include /* for CPU_IRQ_REGION and friends */ @@ -406,12 +406,10 @@ EXPORT_SYMBOL(smp_call_function); * as we want to ensure all TLB's flushed before proceeding. */ -extern void flush_tlb_all_local(void); - void smp_flush_tlb_all(void) { - on_each_cpu((void (*)(void *))flush_tlb_all_local, NULL, 1, 1); + on_each_cpu(flush_tlb_all_local, NULL, 1, 1); } @@ -487,7 +485,7 @@ void __init smp_callin(void) #endif flush_cache_all_local(); /* start with known state */ - flush_tlb_all_local(); + flush_tlb_all_local(NULL); local_irq_enable(); /* Interrupts have been off until now */ diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index a992cb8..f2e7f13 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c @@ -998,7 +998,7 @@ void flush_tlb_all(void) void flush_tlb_all(void) { spin_lock(&sid_lock); - flush_tlb_all_local(); + flush_tlb_all_local(NULL); recycle_sids(); spin_unlock(&sid_lock); } diff --git a/include/asm-parisc/cache.h b/include/asm-parisc/cache.h index 38d201b..93f179f 100644 --- a/include/asm-parisc/cache.h +++ b/include/asm-parisc/cache.h @@ -29,14 +29,14 @@ #define SMP_CACHE_BYTES L1_CACHE_BYTES -extern void flush_data_cache_local(void); /* flushes local data-cache only */ -extern void flush_instruction_cache_local(void); /* flushes local code-cache only */ +extern void flush_data_cache_local(void *); /* flushes local data-cache only */ +extern void flush_instruction_cache_local(void *); /* flushes local code-cache only */ #ifdef CONFIG_SMP extern void flush_data_cache(void); /* flushes data-cache only (all processors) */ extern void flush_instruction_cache(void); /* flushes i-cache only (all processors) */ #else -#define flush_data_cache flush_data_cache_local -#define flush_instruction_cache flush_instruction_cache_local +#define flush_data_cache() flush_data_cache_local(NULL) +#define flush_instruction_cache() flush_instruction_cache_local(NULL) #endif extern void parisc_cache_init(void); /* initializes cache-flushing */ diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h index c9ec39c..825994a 100644 --- a/include/asm-parisc/tlbflush.h +++ b/include/asm-parisc/tlbflush.h @@ -22,6 +22,7 @@ extern spinlock_t pa_tlb_lock; #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) extern void flush_tlb_all(void); +extern void flush_tlb_all_local(void *); /* * flush_tlb_mm() -- cgit v0.10.2 From 04d35d7324ed35983189bd396db7874a50bbea43 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:47:50 -0500 Subject: [PARISC] Fix Cirrus 6832 Cardbus on RDI Tadpole PARISC Laptop Fix irq-off-by-one for Cirrus 6832 Cardbus on RDI Tadpole PARISC Laptop. We just DECLARE_PCI_FIXUP_ENABLE as it is unlikely that this will be found in any other parisc system. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 5ab7533..595d198 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -435,6 +435,21 @@ static void dino_choose_irq(struct parisc_device *dev, void *ctrl) dino_assign_irq(dino, irq, &dev->irq); } + +/* + * Cirrus 6832 Cardbus reports wrong irq on RDI Tadpole PARISC Laptop (deller@gmx.de) + * (the irqs are off-by-one, not sure yet if this is a cirrus, dino-hardware or dino-driver problem...) + */ +static void __devinit quirk_cirrus_cardbus(struct pci_dev *dev) +{ + u8 new_irq = dev->irq - 1; + printk(KERN_INFO "PCI: Cirrus Cardbus IRQ fixup for %s, from %d to %d\n", + pci_name(dev), dev->irq, new_irq); + dev->irq = new_irq; +} +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus ); + + static void __init dino_bios_init(void) { -- cgit v0.10.2 From 45dbe9147dcad2b03f9d1397353d6eed9204da02 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Tue, 10 Jan 2006 20:47:51 -0500 Subject: [PARISC] Add __user annotation to eisa_eeprom.c Annotate eisa_eeprom_read() with __user. Signed-off-by: Alexey Dobriyan Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/drivers/parisc/eisa_eeprom.c b/drivers/parisc/eisa_eeprom.c index 3a1b482..e13aafa 100644 --- a/drivers/parisc/eisa_eeprom.c +++ b/drivers/parisc/eisa_eeprom.c @@ -48,7 +48,7 @@ static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin ) } static ssize_t eisa_eeprom_read(struct file * file, - char *buf, size_t count, loff_t *ppos ) + char __user *buf, size_t count, loff_t *ppos ) { unsigned char *tmp; ssize_t ret; -- cgit v0.10.2 From e0565a1c83a1045d8fae728056082262e712b201 Mon Sep 17 00:00:00 2001 From: Kyle McMartin Date: Tue, 10 Jan 2006 20:47:52 -0500 Subject: [PARISC] Fix and cleanup ioremap.c to work with 4level-fixup.h Fixup ioremap a bit. It seems to work on 32-bit kernels, but fails miserably on the first ioremapped access on 64-bit kernels. Also, having STI enabled causes it to fail. Probably because we're passing an ioremapped region to a real-mode STI call... Signed-off-by: Kyle McMartin diff --git a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c index 5c7a1b3..edd9a95 100644 --- a/arch/parisc/mm/ioremap.c +++ b/arch/parisc/mm/ioremap.c @@ -1,12 +1,9 @@ /* * arch/parisc/mm/ioremap.c * - * Re-map IO memory to kernel address space so that we can access it. - * This is needed for high PCI addresses that aren't mapped in the - * 640k-1MB IO memory area on PC's - * * (C) Copyright 1995 1996 Linus Torvalds * (C) Copyright 2001 Helge Deller + * (C) Copyright 2005 Kyle McMartin */ #include @@ -14,81 +11,107 @@ #include #include #include +#include +#include -static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size, - unsigned long phys_addr, unsigned long flags) +static inline void +remap_area_pte(pte_t *pte, unsigned long address, unsigned long size, + unsigned long phys_addr, unsigned long flags) { - unsigned long end; + unsigned long end, pfn; + pgprot_t pgprot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | + _PAGE_ACCESSED | flags); address &= ~PMD_MASK; + end = address + size; if (end > PMD_SIZE) end = PMD_SIZE; - if (address >= end) - BUG(); + + BUG_ON(address >= end); + + pfn = phys_addr >> PAGE_SHIFT; do { - if (!pte_none(*pte)) { - printk(KERN_ERR "remap_area_pte: page already exists\n"); - BUG(); - } - set_pte(pte, mk_pte_phys(phys_addr, __pgprot(_PAGE_PRESENT | _PAGE_RW | - _PAGE_DIRTY | _PAGE_ACCESSED | flags))); + BUG_ON(!pte_none(*pte)); + + set_pte(pte, pfn_pte(pfn, pgprot)); + address += PAGE_SIZE; - phys_addr += PAGE_SIZE; + pfn++; pte++; } while (address && (address < end)); } -static inline int remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, - unsigned long phys_addr, unsigned long flags) +static inline int +remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size, + unsigned long phys_addr, unsigned long flags) { unsigned long end; address &= ~PGDIR_MASK; + end = address + size; if (end > PGDIR_SIZE) end = PGDIR_SIZE; + + BUG_ON(address >= end); + phys_addr -= address; - if (address >= end) - BUG(); do { - pte_t * pte = pte_alloc_kernel(pmd, address); + pte_t *pte = pte_alloc_kernel(pmd, address); if (!pte) return -ENOMEM; - remap_area_pte(pte, address, end - address, address + phys_addr, flags); + + remap_area_pte(pte, address, end - address, + address + phys_addr, flags); + address = (address + PMD_SIZE) & PMD_MASK; pmd++; } while (address && (address < end)); + return 0; } -#if (USE_HPPA_IOREMAP) -static int remap_area_pages(unsigned long address, unsigned long phys_addr, - unsigned long size, unsigned long flags) +#if USE_HPPA_IOREMAP +static int +remap_area_pages(unsigned long address, unsigned long phys_addr, + unsigned long size, unsigned long flags) { - int error; - pgd_t * dir; + pgd_t *dir; + int error = 0; unsigned long end = address + size; + BUG_ON(address >= end); + phys_addr -= address; - dir = pgd_offset(&init_mm, address); + dir = pgd_offset_k(address); + flush_cache_all(); - if (address >= end) - BUG(); + do { + pud_t *pud; pmd_t *pmd; - pmd = pmd_alloc(&init_mm, dir, address); + error = -ENOMEM; + pud = pud_alloc(&init_mm, dir, address); + if (!pud) + break; + + pmd = pmd_alloc(&init_mm, pud, address); if (!pmd) break; + if (remap_area_pmd(pmd, address, end - address, - phys_addr + address, flags)) + phys_addr + address, flags)) break; + error = 0; address = (address + PGDIR_SIZE) & PGDIR_MASK; dir++; } while (address && (address < end)); + flush_tlb_all(); + return error; } #endif /* USE_HPPA_IOREMAP */ @@ -123,8 +146,7 @@ EXPORT_SYMBOL(__raw_bad_addr); /* * Remap an arbitrary physical address space into the kernel virtual - * address space. Needed when the kernel wants to access high addresses - * directly. + * address space. * * NOTE! We need to allow non-page-aligned mappings too: we will obviously * have to convert them into an offset in a page-aligned mapping, but the @@ -148,8 +170,8 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l #endif #else - void * addr; - struct vm_struct * area; + void *addr; + struct vm_struct *area; unsigned long offset, last_addr; /* Don't allow wraparound or zero size */ @@ -167,9 +189,11 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l t_addr = __va(phys_addr); t_end = t_addr + (size - 1); - for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) + for (page = virt_to_page(t_addr); + page <= virt_to_page(t_end); page++) { if(!PageReserved(page)) return NULL; + } } /* @@ -185,11 +209,13 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l area = get_vm_area(size, VM_IOREMAP); if (!area) return NULL; + addr = area->addr; if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vfree(addr); return NULL; } + return (void __iomem *) (offset + (char *)addr); #endif } -- cgit v0.10.2 From a01c8cb126cb5f5a592f01b08ff8859508c75ba1 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 10 Jan 2006 20:47:53 -0500 Subject: [PARISC] Fix GSC graphics cards with 64MB regions Make knapps work with its 64MB gfx card. I probably just broke another machine in the process, but assuming 64MB when 64MB aligned is probably safer than assuming 32MB all the time. Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index 041524d..1eaa0d3 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c @@ -515,8 +515,13 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path) (iodc_data[5] << 8) | iodc_data[6]; dev->hpa.name = parisc_pathname(dev); dev->hpa.start = hpa; - if (hpa == 0xf4000000 || hpa == 0xf6000000 || - hpa == 0xf8000000 || hpa == 0xfa000000) { + /* This is awkward. The STI spec says that gfx devices may occupy + * 32MB or 64MB. Unfortunately, we don't know how to tell whether + * it's the former or the latter. Assumptions either way can hurt us. + */ + if (hpa == 0xf4000000 || hpa == 0xf8000000) { + dev->hpa.end = hpa + 0x03ffffff; + } else if (hpa == 0xf6000000 || hpa == 0xfa000000) { dev->hpa.end = hpa + 0x01ffffff; } else { dev->hpa.end = hpa + 0xfff; @@ -834,7 +839,7 @@ static void print_parisc_device(struct parisc_device *dev) if (dev->num_addrs) { int k; - printk(", additional addresses: "); + printk(", additional addresses: "); for (k = 0; k < dev->num_addrs; k++) printk("0x%lx ", dev->addr[k]); } -- cgit v0.10.2 From 4d64c9f58e618b1bdbc91cb071e6c8d90f43d620 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:47:54 -0500 Subject: [PARISC] Introduce DINO_LOCAL_IRQS and use it for gsc_find_local_irq Fix dino by using DINO_LOCAL_IRQS as the limit for gsc_find_local_irq() instead of the irq itself. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 595d198..45a1a49 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -124,6 +124,7 @@ #define DINO_IRQS 11 /* bits 0-10 are architected */ #define DINO_IRR_MASK 0x5ff /* only 10 bits are implemented */ +#define DINO_LOCAL_IRQS (DINO_IRQS+1) #define DINO_MASK_IRQ(x) (1<<(x)) @@ -146,7 +147,7 @@ struct dino_device unsigned long txn_addr; /* EIR addr to generate interrupt */ u32 txn_data; /* EIR data assign to each dino */ u32 imr; /* IRQ's which are enabled */ - int global_irq[12]; /* map IMR bit to global irq */ + int global_irq[DINO_LOCAL_IRQS]; /* map IMR bit to global irq */ #ifdef DINO_DEBUG unsigned int dino_irr0; /* save most recent IRQ line stat */ #endif @@ -297,7 +298,7 @@ struct pci_port_ops dino_port_ops = { static void dino_disable_irq(unsigned int irq) { struct dino_device *dino_dev = irq_desc[irq].handler_data; - int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); + int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); @@ -309,7 +310,7 @@ static void dino_disable_irq(unsigned int irq) static void dino_enable_irq(unsigned int irq) { struct dino_device *dino_dev = irq_desc[irq].handler_data; - int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); + int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); u32 tmp; DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); -- cgit v0.10.2 From e8b736c860dd93ba26b391abc91891e03ca99858 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:47:55 -0500 Subject: [PARISC] Add some defines for HugeTLB pages Define some constants for HugeTLB pages, not that parisc-linux supports it yet. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/include/asm-parisc/page.h b/include/asm-parisc/page.h index 44eae9f..4a6752b 100644 --- a/include/asm-parisc/page.h +++ b/include/asm-parisc/page.h @@ -135,6 +135,13 @@ extern int npmem_ranges; #define pfn_valid(pfn) ((pfn) < max_mapnr) #endif /* CONFIG_DISCONTIGMEM */ +#ifdef CONFIG_HUGETLB_PAGE +#define HPAGE_SHIFT 22 /* 4MB (is this fixed?) */ +#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) +#define HPAGE_MASK (~(HPAGE_SIZE - 1)) +#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) +#endif + #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) -- cgit v0.10.2 From 110957f0e521c8d14f97bbe955af2fa17bb720bf Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Tue, 10 Jan 2006 20:47:56 -0500 Subject: [PARISC] Add __iomem to __raw_check_addr() Add __iomem to __raw_check_addr(), which nukes ~13809 sparse warnings on allmodconfig. Signed-off-by: Alexey Dobriyan Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/include/asm-parisc/io.h b/include/asm-parisc/io.h index b9bb594..0db00ad 100644 --- a/include/asm-parisc/io.h +++ b/include/asm-parisc/io.h @@ -41,7 +41,7 @@ extern void __raw_bad_addr(const volatile void __iomem *addr); #define __raw_check_addr(addr) \ if (((unsigned long)addr >> NYBBLE_SHIFT) != 0xe) \ __raw_bad_addr(addr); \ - addr = (void *)((unsigned long)addr | (0xfUL << NYBBLE_SHIFT)); + addr = (void __iomem *)((unsigned long)addr | (0xfUL << NYBBLE_SHIFT)); #else #define gsc_check_addr(addr) #define __raw_check_addr(addr) -- cgit v0.10.2 From 6ca45a24ccb847251f71aec8906746d33e99f33e Mon Sep 17 00:00:00 2001 From: Grant Grundler Date: Tue, 10 Jan 2006 20:47:56 -0500 Subject: [PARISC] Truncate overlapping PAT PDC reported ranges Deal with overlapping LBA MMIO resources, rp3440 PDC BUG: PDC reports lmmio range for the last rope that overlaps with the CPU HPA. Console output was: ... Found devices: 1. Storm Peak Fast at 0xfffffffffe798000 [152] { 0, 0x0, 0x889, 0x00004 } 2. Storm Peak Fast at 0xfffffffffe799000 [153] { 0, 0x0, 0x889, 0x00004 } ... FAILED: lba_fixup_bus() request for lmmio_space [fffffffff0000000/fffffffffecffffe] Output is now: LBA: Truncating lmmio_space [fffffffff0000000/fffffffffecffffe] to [fffffffff0000000,fffffffffe797fff] My only concern with this patch is how C8000 (PAT PDC) will report elmmio ranges when a gfx card is installed. I'll have to test this another day. Signed-off-by: Grant Grundler Signed-off-by: James Bottomley Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 4f6bdf0..cbae8c8 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -695,11 +695,71 @@ lba_claim_dev_resources(struct pci_dev *dev) } } } + + +/* + * truncate_pat_collision: Deal with overlaps or outright collisions + * between PAT PDC reported ranges. + * + * Broken PA8800 firmware will report lmmio range that + * overlaps with CPU HPA. Just truncate the lmmio range. + * + * BEWARE: conflicts with this lmmio range may be an + * elmmio range which is pointing down another rope. + * + * FIXME: only deals with one collision per range...theoretically we + * could have several. Supporting more than one collision will get messy. + */ +static unsigned long +truncate_pat_collision(struct resource *root, struct resource *new) +{ + unsigned long start = new->start; + unsigned long end = new->end; + struct resource *tmp = root->child; + + if (end <= start || start < root->start || !tmp) + return 0; + + /* find first overlap */ + while (tmp && tmp->end < start) + tmp = tmp->sibling; + + /* no entries overlap */ + if (!tmp) return 0; + + /* found one that starts behind the new one + ** Don't need to do anything. + */ + if (tmp->start >= end) return 0; + + if (tmp->start <= start) { + /* "front" of new one overlaps */ + new->start = tmp->end + 1; + + if (tmp->end >= end) { + /* AACCKK! totally overlaps! drop this range. */ + return 1; + } + } + + if (tmp->end < end ) { + /* "end" of new one overlaps */ + new->end = tmp->start - 1; + } + + printk(KERN_WARNING "LBA: Truncating lmmio_space [%lx/%lx] " + "to [%lx,%lx]\n", + start, end, + new->start, new->end ); + + return 0; /* truncation successful */ +} + #else -#define lba_claim_dev_resources(dev) +#define lba_claim_dev_resources(dev) do { } while (0) +#define truncate_pat_collision(r,n) (0) #endif - /* ** The algorithm is generic code. ** But it needs to access local data structures to get the IRQ base. @@ -747,6 +807,9 @@ lba_fixup_bus(struct pci_bus *bus) lba_dump_res(&ioport_resource, 2); BUG(); } + /* advertize Host bridge resources to PCI bus */ + bus->resource[0] = &(ldev->hba.io_space); + i = 1; if (ldev->hba.elmmio_space.start) { err = request_resource(&iomem_resource, @@ -760,23 +823,35 @@ lba_fixup_bus(struct pci_bus *bus) /* lba_dump_res(&iomem_resource, 2); */ /* BUG(); */ - } + } else + bus->resource[i++] = &(ldev->hba.elmmio_space); } - err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space)); - if (err < 0) { - /* FIXME overlaps with elmmio will fail here. - * Need to prune (or disable) the distributed range. - * - * BEWARE: conflicts with this lmmio range may be - * elmmio range which is pointing down another rope. - */ - - printk("FAILED: lba_fixup_bus() request for " + + /* Overlaps with elmmio can (and should) fail here. + * We will prune (or ignore) the distributed range. + * + * FIXME: SBA code should register all elmmio ranges first. + * that would take care of elmmio ranges routed + * to a different rope (already discovered) from + * getting registered *after* LBA code has already + * registered it's distributed lmmio range. + */ + if (truncate_pat_collision(&iomem_resource, + &(ldev->hba.lmmio_space))) { + + printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n", + ldev->hba.lmmio_space.start, + ldev->hba.lmmio_space.end); + } else { + err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space)); + if (err < 0) { + printk(KERN_ERR "FAILED: lba_fixup_bus() request for " "lmmio_space [%lx/%lx]\n", ldev->hba.lmmio_space.start, ldev->hba.lmmio_space.end); - /* lba_dump_res(&iomem_resource, 2); */ + } else + bus->resource[i++] = &(ldev->hba.lmmio_space); } #ifdef CONFIG_64BIT @@ -791,18 +866,10 @@ lba_fixup_bus(struct pci_bus *bus) lba_dump_res(&iomem_resource, 2); BUG(); } + bus->resource[i++] = &(ldev->hba.gmmio_space); } #endif - /* advertize Host bridge resources to PCI bus */ - bus->resource[0] = &(ldev->hba.io_space); - bus->resource[1] = &(ldev->hba.lmmio_space); - i=2; - if (ldev->hba.elmmio_space.start) - bus->resource[i++] = &(ldev->hba.elmmio_space); - if (ldev->hba.gmmio_space.start) - bus->resource[i++] = &(ldev->hba.gmmio_space); - } list_for_each(ln, &bus->devices) { -- cgit v0.10.2 From 5cdb8205e917c09fd1348e4b22e26492e8c45b36 Mon Sep 17 00:00:00 2001 From: Grant Grundler Date: Tue, 10 Jan 2006 20:47:57 -0500 Subject: [PARISC] Fix BLK_BOUNCE_HIGH on parisc by initializing max_low_pfn max_low_pfn was not being set in arch/parisc/mm/init.c, causing severe problems whenever anything tried to use BLK_BOUNCE_HIGH. Set it to max_pfn like other similar architectures do. Signed-off-by: Grant Grundler Signed-off-by: Kyle McMartin diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index f2e7f13..720287d 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c @@ -300,6 +300,13 @@ static void __init setup_bootmem(void) max_pfn = start_pfn + npages; } + /* IOMMU is always used to access "high mem" on those boxes + * that can support enough mem that a PCI device couldn't + * directly DMA to any physical addresses. + * ISA DMA support will need to revisit this. + */ + max_low_pfn = max_pfn; + if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) { printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n"); BUG(); -- cgit v0.10.2 From 49efdd46eed353027096a765f40dd8af52ece5ae Mon Sep 17 00:00:00 2001 From: Stuart Brady Date: Tue, 10 Jan 2006 20:47:58 -0500 Subject: [PARISC] OSS: Fix build of parisc harmony driver OSS Harmony got missed on the conversion of parisc_device.hpa to a struct resource... fix its build. Signed-off-by: Stuart Brady Signed-off-by: Kyle McMartin diff --git a/sound/oss/harmony.c b/sound/oss/harmony.c index bee9d34..591683c 100644 --- a/sound/oss/harmony.c +++ b/sound/oss/harmony.c @@ -1236,7 +1236,7 @@ harmony_driver_probe(struct parisc_device *dev) } /* Set the HPA of harmony */ - harmony.hpa = (struct harmony_hpa *)dev->hpa; + harmony.hpa = (struct harmony_hpa *)dev->hpa.start; harmony.dev = dev; /* Grab the ID and revision from the device */ @@ -1250,7 +1250,7 @@ harmony_driver_probe(struct parisc_device *dev) printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", " "h/w id %i, rev. %i at 0x%lx, IRQ %i\n", - id, rev, dev->hpa, harmony.dev->irq); + id, rev, dev->hpa.start, harmony.dev->irq); /* Make sure the control bit isn't set, although I don't think it ever is. */ -- cgit v0.10.2 From 7c0b67efe9e15fa81cfa332a9a6f6cd5f7941bbc Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Tue, 10 Jan 2006 20:47:59 -0500 Subject: [PARISC] Fix parport_gsc by selecting PARPORT_NOT_PC PARPORT_GSC requires selecting PARPORT_NOT_PC in order to work properly. Signed-off-by: Guy Martin Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index a665951..f605dea 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig @@ -121,6 +121,7 @@ config PARPORT_GSC tristate default GSC depends on PARPORT + select PARPORT_NOT_PC config PARPORT_SUNBPP tristate "Sparc hardware (EXPERIMENTAL)" -- cgit v0.10.2 From 9b9ff2e16a4609a7ab39b12e67fc56b51c8cd1f4 Mon Sep 17 00:00:00 2001 From: Grant Grundler Date: Tue, 10 Jan 2006 20:48:00 -0500 Subject: [PARISC] Make PCI_HOST_ADDR and PCI_BUS_ADDR symmetrical Change to asm-parisc/pci.h makes the define of PCI_HOST_ADDR symmetrical with PCI_BUS_ADDR. Also add a comment about PA_VIEW and LMMIO/ELMMIO/GMMIO. Signed-off-by: Grant Grundler Signed-off-by: Kyle McMartin diff --git a/include/asm-parisc/pci.h b/include/asm-parisc/pci.h index fa39d07..f277254 100644 --- a/include/asm-parisc/pci.h +++ b/include/asm-parisc/pci.h @@ -84,11 +84,17 @@ static __inline__ int pci_is_lmmio(struct pci_hba_data *hba, unsigned long a) /* ** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses. ** See pcibios.c for more conversions used by Generic PCI code. +** +** Platform characteristics/firmware guarantee that +** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO +** (2) PA_VIEW == IO_VIEW for GMMIO */ #define PCI_BUS_ADDR(hba,a) (PCI_IS_LMMIO(hba,a) \ ? ((a) - hba->lmmio_space_offset) /* mangle LMMIO */ \ : (a)) /* GMMIO */ -#define PCI_HOST_ADDR(hba,a) ((a) + hba->lmmio_space_offset) +#define PCI_HOST_ADDR(hba,a) (((a) & PCI_F_EXTEND) == 0 \ + ? (a) + hba->lmmio_space_offset \ + : (a)) #else /* !CONFIG_64BIT */ -- cgit v0.10.2 From 4b991da7fec9b87acf86c250332ce15c2811255b Mon Sep 17 00:00:00 2001 From: Thibaut VARENE Date: Tue, 10 Jan 2006 20:48:01 -0500 Subject: [PARISC] pdc_stable: More robust sysfs error checking pdc_stable 0.10: As mentioned on LKML, pdc_stable wasn't checky enough on the return values of some calls. This patch makes it more robust to errors when registering objects in sysfs. Signed-off-by: Thibaut VARENE Signed-off-by: Kyle McMartin diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index 11750cb..38bdca2 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c @@ -56,7 +56,7 @@ #include #include -#define PDCS_VERSION "0.09" +#define PDCS_VERSION "0.10" #define PDCS_ADDR_PPRI 0x00 #define PDCS_ADDR_OSID 0x40 @@ -194,7 +194,8 @@ pdcspath_store(struct pdcspath_entry *entry) return -EIO; } - entry->ready = 1; + /* kobject is already registered */ + entry->ready = 2; DPRINTK("%s: device: 0x%p\n", __func__, entry->dev); @@ -653,15 +654,21 @@ pdcs_register_pathentries(void) { unsigned short i; struct pdcspath_entry *entry; + int err; for (i = 0; (entry = pdcspath_entries[i]); i++) { if (pdcspath_fetch(entry) < 0) continue; - kobject_set_name(&entry->kobj, "%s", entry->name); + if ((err = kobject_set_name(&entry->kobj, "%s", entry->name))) + return err; kobj_set_kset_s(entry, paths_subsys); - kobject_register(&entry->kobj); - + if ((err = kobject_register(&entry->kobj))) + return err; + + /* kobject is now registered */ + entry->ready = 2; + if (!entry->dev) continue; @@ -675,14 +682,14 @@ pdcs_register_pathentries(void) /** * pdcs_unregister_pathentries - Routine called when unregistering the module. */ -static inline void __exit +static inline void pdcs_unregister_pathentries(void) { unsigned short i; struct pdcspath_entry *entry; for (i = 0; (entry = pdcspath_entries[i]); i++) - if (entry->ready) + if (entry->ready >= 2) kobject_unregister(&entry->kobj); } @@ -704,7 +711,7 @@ pdc_stable_init(void) /* For now we'll register the pdc subsys within this driver */ if ((rc = firmware_register(&pdc_subsys))) - return rc; + goto fail_firmreg; /* Don't forget the info entry */ for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++) @@ -713,12 +720,25 @@ pdc_stable_init(void) /* register the paths subsys as a subsystem of pdc subsys */ kset_set_kset_s(&paths_subsys, pdc_subsys); - subsystem_register(&paths_subsys); + if ((rc= subsystem_register(&paths_subsys))) + goto fail_subsysreg; /* now we create all "files" for the paths subsys */ - pdcs_register_pathentries(); + if ((rc = pdcs_register_pathentries())) + goto fail_pdcsreg; + + return rc; - return 0; +fail_pdcsreg: + pdcs_unregister_pathentries(); + subsystem_unregister(&paths_subsys); + +fail_subsysreg: + firmware_unregister(&pdc_subsys); + +fail_firmreg: + printk(KERN_INFO "PDC Stable Storage bailing out\n"); + return rc; } static void __exit -- cgit v0.10.2 From 02d79800a221eb4e54d80cbf2026af9edc1f437d Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Tue, 10 Jan 2006 20:48:02 -0500 Subject: [PARISC] Use C99 initializers in asm-parisc/processor.h Cleanup asm-parisc/processor.h to use C99 initializers in INIT_THREAD(). Signed-off-by: Alexey Dobriyan Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/include/asm-parisc/processor.h b/include/asm-parisc/processor.h index aae40e8..89f2f1c 100644 --- a/include/asm-parisc/processor.h +++ b/include/asm-parisc/processor.h @@ -144,16 +144,16 @@ struct thread_struct { }) #define INIT_THREAD { \ - regs: { gr: { 0, }, \ - fr: { 0, }, \ - sr: { 0, }, \ - iasq: { 0, }, \ - iaoq: { 0, }, \ - cr27: 0, \ + .regs = { .gr = { 0, }, \ + .fr = { 0, }, \ + .sr = { 0, }, \ + .iasq = { 0, }, \ + .iaoq = { 0, }, \ + .cr27 = 0, \ }, \ - task_size: DEFAULT_TASK_SIZE, \ - map_base: DEFAULT_MAP_BASE, \ - flags: 0 \ + .task_size = DEFAULT_TASK_SIZE, \ + .map_base = DEFAULT_MAP_BASE, \ + .flags = 0 \ } /* -- cgit v0.10.2 From 5d6d1640a254b27d0f598007313065713c1e3a04 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:48:03 -0500 Subject: [PARISC] stifb: use F_EXTEND macro Use the F_EXTEND() macro instead of open coding it with an #ifdef. Provides a nice cleanup. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c index fbb1733..83cd76c 100644 --- a/drivers/video/stifb.c +++ b/drivers/video/stifb.c @@ -73,13 +73,8 @@ #include "sticore.h" /* REGION_BASE(fb_info, index) returns the virtual address for region */ -#ifdef __LP64__ - #define REGION_BASE(fb_info, index) \ - (fb_info->sti->glob_cfg->region_ptrs[index] | 0xffffffff00000000) -#else - #define REGION_BASE(fb_info, index) \ - fb_info->sti->glob_cfg->region_ptrs[index] -#endif +#define REGION_BASE(fb_info, index) \ + F_EXTEND(fb_info->sti->glob_cfg->region_ptrs[index]) #define NGLEDEVDEPROM_CRT_REGION 1 @@ -1250,12 +1245,10 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) memset(&fb->ngle_rom, 0, sizeof(fb->ngle_rom)); if ((fb->sti->regions_phys[0] & 0xfc000000) == (fb->sti->regions_phys[2] & 0xfc000000)) - sti_rom_address = fb->sti->regions_phys[0]; + sti_rom_address = F_EXTEND(fb->sti->regions_phys[0]); else - sti_rom_address = fb->sti->regions_phys[1]; -#ifdef __LP64__ - sti_rom_address |= 0xffffffff00000000; -#endif + sti_rom_address = F_EXTEND(fb->sti->regions_phys[1]); + fb->deviceSpecificConfig = gsc_readl(sti_rom_address); if (IS_24_DEVICE(fb)) { if (bpp_pref == 8 || bpp_pref == 32) -- cgit v0.10.2 From daaeb6f8d3afdfa58ffeffb7ba168ccbd5969858 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:48:04 -0500 Subject: [PARISC] stifb: Fix framebuffer console at 32bpp Fix stifb framebuffer console at 32bpp on a HCRX-24 card by properly setting DIRECTCOLOR. Also a few nice cleanups to the code. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c index 83cd76c..3f050a7 100644 --- a/drivers/video/stifb.c +++ b/drivers/video/stifb.c @@ -3,7 +3,7 @@ * Low level Frame buffer driver for HP workstations with * STI (standard text interface) video firmware. * - * Copyright (C) 2001-2004 Helge Deller + * Copyright (C) 2001-2005 Helge Deller * Portions Copyright (C) 2001 Thomas Bogendoerfer * * Based on: @@ -78,6 +78,8 @@ #define NGLEDEVDEPROM_CRT_REGION 1 +#define NR_PALETTE 256 + typedef struct { __s32 video_config_reg; __s32 misc_video_start; @@ -107,7 +109,7 @@ struct stifb_info { ngle_rom_t ngle_rom; struct sti_struct *sti; int deviceSpecificConfig; - u32 pseudo_palette[256]; + u32 pseudo_palette[16]; }; static int __initdata stifb_bpp_pref[MAX_STI_ROMS]; @@ -347,10 +349,10 @@ ARTIST_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable) #define IS_888_DEVICE(fb) \ (!(IS_24_DEVICE(fb))) -#define GET_FIFO_SLOTS(fb, cnt, numslots) \ -{ while (cnt < numslots) \ +#define GET_FIFO_SLOTS(fb, cnt, numslots) \ +{ while (cnt < numslots) \ cnt = READ_WORD(fb, REG_34); \ - cnt -= numslots; \ + cnt -= numslots; \ } #define IndexedDcd 0 /* Pixel data is indexed (pseudo) color */ @@ -990,7 +992,7 @@ stifb_setcolreg(u_int regno, u_int red, u_int green, struct stifb_info *fb = (struct stifb_info *) info; u32 color; - if (regno >= 256) /* no. of hw registers */ + if (regno >= NR_PALETTE) return 1; red >>= 8; @@ -1000,8 +1002,8 @@ stifb_setcolreg(u_int regno, u_int red, u_int green, DEBUG_OFF(); START_IMAGE_COLORMAP_ACCESS(fb); - - if (fb->info.var.grayscale) { + + if (unlikely(fb->info.var.grayscale)) { /* gray = 0.30*R + 0.59*G + 0.11*B */ color = ((red * 77) + (green * 151) + @@ -1012,17 +1014,17 @@ stifb_setcolreg(u_int regno, u_int red, u_int green, (blue)); } - if (info->var.bits_per_pixel == 32) { - ((u32 *)(info->pseudo_palette))[regno] = - (red << info->var.red.offset) | - (green << info->var.green.offset) | - (blue << info->var.blue.offset); - } else { - ((u32 *)(info->pseudo_palette))[regno] = regno; + if (fb->info.fix.visual == FB_VISUAL_DIRECTCOLOR) { + struct fb_var_screeninfo *var = &fb->info.var; + if (regno < 16) + ((u32 *)fb->info.pseudo_palette)[regno] = + regno << var->red.offset | + regno << var->green.offset | + regno << var->blue.offset; } WRITE_IMAGE_COLOR(fb, regno, color); - + if (fb->id == S9000_ID_HCRX) { NgleLutBltCtl lutBltCtl; @@ -1061,9 +1063,9 @@ stifb_blank(int blank_mode, struct fb_info *info) case S9000_ID_HCRX: HYPER_ENABLE_DISABLE_DISPLAY(fb, enable); break; - case S9000_ID_A1659A:; /* fall through */ - case S9000_ID_TIMBER:; - case CRX24_OVERLAY_PLANES:; + case S9000_ID_A1659A: /* fall through */ + case S9000_ID_TIMBER: + case CRX24_OVERLAY_PLANES: default: ENABLE_DISABLE_DISPLAY(fb, enable); break; @@ -1308,7 +1310,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) break; case 32: fix->type = FB_TYPE_PACKED_PIXELS; - fix->visual = FB_VISUAL_TRUECOLOR; + fix->visual = FB_VISUAL_DIRECTCOLOR; var->red.length = var->green.length = var->blue.length = var->transp.length = 8; var->blue.offset = 0; var->green.offset = 8; @@ -1330,7 +1332,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) info->pseudo_palette = &fb->pseudo_palette; /* This has to been done !!! */ - fb_alloc_cmap(&info->cmap, 256, 0); + fb_alloc_cmap(&info->cmap, NR_PALETTE, 0); stifb_init_display(fb); if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) { -- cgit v0.10.2 From 4d62ce5d2a85976a2e6f2732980e59b21b2aa8d2 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Tue, 10 Jan 2006 20:48:05 -0500 Subject: [PARISC] stifb: Remove obsolete MODULE_PARM() The bpp module parameter has been obsoleted in favour of a setup string, so remove the MODULE_PARM. Signed-off-by: Helge Deller Signed-off-by: Kyle McMartin diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c index 3f050a7..56d71d6 100644 --- a/drivers/video/stifb.c +++ b/drivers/video/stifb.c @@ -1483,7 +1483,3 @@ module_exit(stifb_cleanup); MODULE_AUTHOR("Helge Deller , Thomas Bogendoerfer "); MODULE_DESCRIPTION("Framebuffer driver for HP's NGLE series graphics cards in HP PARISC machines"); MODULE_LICENSE("GPL v2"); - -MODULE_PARM(bpp, "i"); -MODULE_PARM_DESC(mem, "Bits per pixel (default: 8)"); - -- cgit v0.10.2 From f45adcf977ac3c5512c17fd97b073bda99c81232 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 10 Jan 2006 20:48:06 -0500 Subject: [PARISC] Fix Dino reporting on J2240 Fix Dino reporting on J2240. This particular machine thought it had a Cujo. Also add J2240 Dino chip to the hp_hardware_list. Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c index 2071b5b..3058bff 100644 --- a/arch/parisc/kernel/hardware.c +++ b/arch/parisc/kernel/hardware.c @@ -551,6 +551,7 @@ static struct hp_hardware hp_hardware_list[] __initdata = { {HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"}, {HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"}, {HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"}, + {HPHW_BRIDGE, 0x05D, 0x0000A, 0x00, "SummitHawk Dino PCI Bridge"}, {HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"}, {HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"}, {HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"}, diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 45a1a49..216d1d8 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -83,7 +83,8 @@ ** bus number for each dino. */ -#define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA) +#define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA) +#define is_cujo(id) ((id)->hversion == 0x682) #define DINO_IAR0 0x004 #define DINO_IODC_ADDR 0x008 @@ -682,7 +683,6 @@ dino_fixup_bus(struct pci_bus *bus) printk(KERN_WARNING "Device %s has unassigned IRQ\n", pci_name(dev)); #endif } else { - /* Adjust INT_LINE for that busses region */ dino_assign_irq(dino_dev, dev->irq, &dev->irq); } @@ -888,7 +888,7 @@ static int __init dino_common_init(struct parisc_device *dev, /* allocate I/O Port resource region */ res = &dino_dev->hba.io_space; - if (dev->id.hversion == 0x680 || is_card_dino(&dev->id)) { + if (!is_cujo(&dev->id)) { res->name = "Dino I/O Port"; } else { res->name = "Cujo I/O Port"; @@ -943,7 +943,7 @@ static int __init dino_probe(struct parisc_device *dev) if (is_card_dino(&dev->id)) { version = "3.x (card mode)"; } else { - if(dev->id.hversion == 0x680) { + if (!is_cujo(&dev->id)) { if (dev->id.hversion_rev < 4) { version = dino_vers[dev->id.hversion_rev]; } -- cgit v0.10.2 From 58b6c58caef7a34eab7ec887288fa495696653e7 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 10 Jan 2006 20:48:07 -0500 Subject: [PARISC] Use STABS_DEBUG macro from vmlinux.lds.h Cleanup vmlinux.lds.S by using STABS_DEBUG macro from vmlinux.lds.h instead of repeating the sections. Signed-off-by: Matthew Wilcox Signed-off-by: Kyle McMartin diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index b8b9174..6d6436a 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S @@ -68,7 +68,7 @@ SECTIONS RODATA /* writeable */ - . = ALIGN(4096); /* Make sure this is paged aligned so + . = ALIGN(4096); /* Make sure this is page aligned so that we can properly leave these as writable */ data_start = .; @@ -198,14 +198,7 @@ SECTIONS #endif } - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } + STABS_DEBUG .note 0 : { *(.note) } } -- cgit v0.10.2 From 9819d85c210f5953fffc1052060e589d633f20ed Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 10 Jan 2006 19:35:19 -0800 Subject: Fix net/core/wireless.c link failure It needs for compare_ether_addr() diff --git a/net/core/wireless.c b/net/core/wireless.c index f88b0af..2add7ed 100644 --- a/net/core/wireless.c +++ b/net/core/wireless.c @@ -78,6 +78,7 @@ #include #include /* for __init */ #include /* ARPHRD_ETHER */ +#include /* compare_ether_addr */ #include /* Pretty obvious */ #include /* New driver API */ -- cgit v0.10.2 From 5bf887f2ff874e2cd881c34bbed974bee2c90808 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 10 Jan 2006 21:02:21 -0800 Subject: [IPV6]: Fix modular build with netfilter enabled. Also, drop __exit marker from ipv6_netfilter_fini() as this can be invoked from inet6_init() error handling paths. Based upon a report from Stephen Hemminger. Signed-off-by: David S. Miller diff --git a/net/ipv6/Makefile b/net/ipv6/Makefile index bf18cff..41877ab 100644 --- a/net/ipv6/Makefile +++ b/net/ipv6/Makefile @@ -12,13 +12,14 @@ ipv6-objs := af_inet6.o anycast.o ip6_output.o ip6_input.o addrconf.o sit.o \ ipv6-$(CONFIG_XFRM) += xfrm6_policy.o xfrm6_state.o xfrm6_input.o \ xfrm6_output.o +ipv6-$(CONFIG_NETFILTER) += netfilter.o ipv6-objs += $(ipv6-y) obj-$(CONFIG_INET6_AH) += ah6.o obj-$(CONFIG_INET6_ESP) += esp6.o obj-$(CONFIG_INET6_IPCOMP) += ipcomp6.o obj-$(CONFIG_INET6_TUNNEL) += xfrm6_tunnel.o -obj-$(CONFIG_NETFILTER) += netfilter.o netfilter/ +obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 1ab62f0..d750cfc 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c @@ -90,7 +90,10 @@ int __init ipv6_netfilter_init(void) return nf_register_queue_rerouter(PF_INET6, &ip6_reroute); } -void __exit ipv6_netfilter_fini(void) +/* This can be called from inet6_init() on errors, so it cannot + * be marked __exit. -DaveM + */ +void ipv6_netfilter_fini(void) { nf_unregister_queue_rerouter(PF_INET6); } -- cgit v0.10.2 From d274ba2081cce6ff59f94e608a348f20ba1fe775 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 10 Jan 2006 21:09:19 -0800 Subject: x86: fix "make install" target Removing the dependency on the boot image build was good, but it also meant that the $< expansion by make needed to be done explicitly. Noted by Stephen Hemminger. Signed-off-by: Linus Torvalds diff --git a/arch/i386/boot/Makefile b/arch/i386/boot/Makefile index 0fea75d..f136752 100644 --- a/arch/i386/boot/Makefile +++ b/arch/i386/boot/Makefile @@ -101,4 +101,4 @@ zlilo: $(BOOTIMAGE) if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi install: - sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $< System.map "$(INSTALL_PATH)" + sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)" -- cgit v0.10.2 From a8b9ee7396ccc8db3bdb4108993556acbe2d3527 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 11 Jan 2006 00:15:16 -0800 Subject: [MUTEX]: linux/mutex.h needs linux/linkage.h too Signed-off-by: David S. Miller diff --git a/include/linux/mutex.h b/include/linux/mutex.h index 9bce0fe..f1c84b1 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -12,6 +12,7 @@ #include #include +#include #include -- cgit v0.10.2 From a4fc7ab1d065a9dd89ed0e74439ef87d4a16e980 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 11 Jan 2006 14:41:26 +0000 Subject: [PATCH] fix/simplify mutex debugging code Let's switch mutex_debug_check_no_locks_freed() to take (addr, len) as arguments instead, since all its callers were just calculating the 'to' address for themselves anyway... (and sometimes doing so badly). Signed-off-by: David Woodhouse Acked-by: Ingo Molnar Signed-off-by: Linus Torvalds diff --git a/arch/i386/mm/pageattr.c b/arch/i386/mm/pageattr.c index e8a5355..d0cadb3 100644 --- a/arch/i386/mm/pageattr.c +++ b/arch/i386/mm/pageattr.c @@ -224,7 +224,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable) return; if (!enable) mutex_debug_check_no_locks_freed(page_address(page), - page_address(page+numpages)); + numpages * PAGE_SIZE); /* the return value is ignored - the calls cannot fail, * large pages are disabled at boot time. diff --git a/include/linux/mm.h b/include/linux/mm.h index 3f1fafc..e53d2c6 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1027,7 +1027,7 @@ kernel_map_pages(struct page *page, int numpages, int enable) { if (!PageHighMem(page) && !enable) mutex_debug_check_no_locks_freed(page_address(page), - page_address(page + numpages)); + numpages * PAGE_SIZE); } #endif diff --git a/include/linux/mutex-debug.h b/include/linux/mutex-debug.h index 8138d9eb..8b5769f 100644 --- a/include/linux/mutex-debug.h +++ b/include/linux/mutex-debug.h @@ -18,6 +18,6 @@ extern void FASTCALL(mutex_destroy(struct mutex *lock)); extern void mutex_debug_show_all_locks(void); extern void mutex_debug_show_held_locks(struct task_struct *filter); extern void mutex_debug_check_no_locks_held(struct task_struct *task); -extern void mutex_debug_check_no_locks_freed(const void *from, const void *to); +extern void mutex_debug_check_no_locks_freed(const void *from, unsigned long len); #endif diff --git a/include/linux/mutex.h b/include/linux/mutex.h index f1c84b1..f1ac507 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -79,7 +79,7 @@ struct mutex_waiter { # define mutex_debug_show_all_locks() do { } while (0) # define mutex_debug_show_held_locks(p) do { } while (0) # define mutex_debug_check_no_locks_held(task) do { } while (0) -# define mutex_debug_check_no_locks_freed(from, to) do { } while (0) +# define mutex_debug_check_no_locks_freed(from, len) do { } while (0) #endif #define __MUTEX_INITIALIZER(lockname) \ diff --git a/kernel/mutex-debug.c b/kernel/mutex-debug.c index 6f82905..f4913c3 100644 --- a/kernel/mutex-debug.c +++ b/kernel/mutex-debug.c @@ -333,9 +333,10 @@ void mutex_debug_check_no_locks_held(struct task_struct *task) * is destroyed or reinitialized - this code checks whether there is * any held lock in the memory range of to : */ -void mutex_debug_check_no_locks_freed(const void *from, const void *to) +void mutex_debug_check_no_locks_freed(const void *from, unsigned long len) { struct list_head *curr, *next; + const void *to = from + len; unsigned long flags; struct mutex *lock; void *lock_addr; @@ -437,7 +438,7 @@ void debug_mutex_init(struct mutex *lock, const char *name) /* * Make sure we are not reinitializing a held lock: */ - mutex_debug_check_no_locks_freed((void *)lock, (void *)(lock + 1)); + mutex_debug_check_no_locks_freed((void *)lock, sizeof(*lock)); lock->owner = NULL; INIT_LIST_HEAD(&lock->held_list); lock->name = name; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a5e6891..8e36353 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -417,7 +417,7 @@ static void __free_pages_ok(struct page *page, unsigned int order) arch_free_page(page, order); if (!PageHighMem(page)) mutex_debug_check_no_locks_freed(page_address(page), - page_address(page+(1<