From: Alan Cox Various proposals were made about the problem of u32 in atomic.h. I've followed Andi Kleen's comments here - that atomic.h is about atomic_t not atomic operations in general. I've moved the header bits to edac.h Avi Kivity also observed the x86_64 one was wrong and I've fixed that too Removed the #if 0 unused code Fixed some typos and coding style Signed-off-by: Alan Cox Signed-off-by: Andrew Morton --- drivers/edac/edac_mc.c | 110 ++------------------------------------------ include/asm-i386/atomic.h | 11 ---- include/asm-i386/edac.h | 18 +++++++ include/asm-x86_64/atomic.h | 12 ---- include/asm-x86_64/edac.h | 18 +++++++ 5 files changed, 41 insertions(+), 128 deletions(-) diff -puN drivers/edac/edac_mc.c~edac-clean-up-atomic-stuff drivers/edac/edac_mc.c --- devel/drivers/edac/edac_mc.c~edac-clean-up-atomic-stuff 2005-10-23 13:24:47.000000000 -0700 +++ devel-akpm/drivers/edac/edac_mc.c 2005-10-23 13:24:47.000000000 -0700 @@ -31,6 +31,7 @@ #include #include +#include #include "edac_mc.h" @@ -67,106 +68,6 @@ static struct list_head mc_devices = LIS #ifdef CONFIG_SYSCTL -#if 0 -static struct mem_ctl_info *find_mc_by_idx(int idx) -{ - struct list_head *item; - struct mem_ctl_info *mci; - - list_for_each(item, &mc_devices) { - mci = list_entry(item, struct mem_ctl_info, link); - - if (mci->mc_idx >= idx) { - if (mci->mc_idx == idx) - return mci; - - break; - } - } - - return NULL; -} - -static void dimm_labels(char *buf, void *data) -{ - int mcidx, ridx, chidx; - char *mcstr, *rstr, *chstr, *lstr, *p; - struct mem_ctl_info *mci; - - lstr = buf; - - mcstr = strsep(&lstr, "."); - if (!lstr) - return; - mcidx = simple_strtol(mcstr, &p, 0); - if (*p) - return; - if ((mci = find_mc_by_idx(mcidx)) == NULL) - return; - rstr = strsep(&lstr, "."); - if (!lstr) - return; - ridx = simple_strtol(rstr, &p, 0); - if (*p) - return; - if ((ridx >= mci->nr_csrows) || !mci->csrows) - return; - - chstr = strsep(&lstr, ":"); - if (!lstr) - return; - chidx = simple_strtol(chstr, &p, 0); - if (*p) - return; - if ((chidx >= mci->csrows[ridx].nr_channels) || - !mci->csrows[ridx].channels) - return; - - debugf1("%d:%d.%d:%s\n", mcidx, ridx, chidx, lstr); - - strncpy(mci->csrows[ridx].channels[chidx].label, lstr, - EDAC_MC_LABEL_LEN + 1); - /* - * no need to NULL terminate label since - * get_user_tok() NULL terminates. - */ -} - -static void counter_reset(char *buf, void *data) -{ - char *p = buf; - int mcidx, row, chan; - struct mem_ctl_info *mci; - - pci_parity_count = 0; - - mcidx = simple_strtol(buf, &p, 0); - if (*p) - return; - - down(&mem_ctls_mutex); - mci = find_mc_by_idx(mcidx); - - if (mci == NULL) - goto out; - - mci->ue_noinfo_count = 0; - mci->ce_noinfo_count = 0; - mci->ue_count = 0; - mci->ce_count = 0; - for (row = 0; row < mci->nr_csrows; row++) { - struct csrow_info *ri = &mci->csrows[row]; - - ri->ue_count = 0; - ri->ce_count = 0; - for (chan = 0; chan < ri->nr_channels; chan++) - ri->channels[chan].ce_count = 0; - } - mci->start_time = jiffies; -out: - up(&mem_ctls_mutex); -} -#endif static ctl_table mc_table[] = { {-1, "panic_on_ue", &panic_on_ue, @@ -729,14 +630,13 @@ int edac_mc_del_mc(struct mem_ctl_info * } -/* FIXME - this should go in an arch dependant file */ EXPORT_SYMBOL(edac_mc_scrub_block); void edac_mc_scrub_block(unsigned long page, unsigned long offset, u32 size) { struct page *pg; - unsigned long *virt_addr; + void *virt_addr; debugf3("MC: " __FILE__ ": %s()\n", __func__); @@ -897,7 +797,7 @@ void edac_mc_handle_ue(struct mem_ctl_in debugf3("MC%d: " __FILE__ ": %s()\n", mci->mc_idx, __func__); /* FIXME - maybe make panic on INTERNAL ERROR an option */ - if ((row >= mci->nr_csrows) || (row < 0)) { + if (row >= mci->nr_csrows || row < 0) { /* something is wrong */ printk(KERN_ERR "MC%d: INTERNAL ERROR: row out of range (%d >= %d)\n", @@ -980,7 +880,7 @@ static inline void edac_pci_dev_parity_t if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) printk(KERN_CRIT "PCI- " - "Signaled System Error on %s %s\n", + "Signalled System Error on %s %s\n", dev->dev.bus_id, pci_name(dev)); @@ -1029,7 +929,7 @@ static inline void edac_pci_dev_parity_t if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) printk(KERN_CRIT "PCI-Bridge- " - "Signaled System Error on %s %s\n", + "Signalled System Error on %s %s\n", dev->dev.bus_id, pci_name(dev)); diff -puN include/asm-i386/atomic.h~edac-clean-up-atomic-stuff include/asm-i386/atomic.h --- devel/include/asm-i386/atomic.h~edac-clean-up-atomic-stuff 2005-10-23 13:24:47.000000000 -0700 +++ devel-akpm/include/asm-i386/atomic.h 2005-10-23 13:24:47.000000000 -0700 @@ -233,15 +233,4 @@ __asm__ __volatile__(LOCK "orl %0,%1" \ #define smp_mb__before_atomic_inc() barrier() #define smp_mb__after_atomic_inc() barrier() -/* ECC atomic, DMA, SMP and interrupt safe scrub function */ - -static __inline__ void atomic_scrub(unsigned long *virt_addr, u32 size) -{ - u32 i; - for (i = 0; i < size / 4; i++, virt_addr++) - /* Very carefully read and write to memory atomically - * so we are interrupt, DMA and SMP safe. - */ - __asm__ __volatile__("lock; addl $0, %0"::"m"(*virt_addr)); -} #endif diff -puN /dev/null include/asm-i386/edac.h --- /dev/null 2003-09-15 06:40:47.000000000 -0700 +++ devel-akpm/include/asm-i386/edac.h 2005-10-23 13:24:47.000000000 -0700 @@ -0,0 +1,18 @@ +#ifndef ASM_EDAC_H +#define ASM_EDAC_H + +/* ECC atomic, DMA, SMP and interrupt safe scrub function */ + +static __inline__ void atomic_scrub(void *va, u32 size) +{ + unsigned long *virt_addr = va; + u32 i; + + for (i = 0; i < size / 4; i++, virt_addr++) + /* Very carefully read and write to memory atomically + * so we are interrupt, DMA and SMP safe. + */ + __asm__ __volatile__("lock; addl $0, %0"::"m"(*virt_addr)); +} + +#endif diff -puN include/asm-x86_64/atomic.h~edac-clean-up-atomic-stuff include/asm-x86_64/atomic.h --- devel/include/asm-x86_64/atomic.h~edac-clean-up-atomic-stuff 2005-10-23 13:24:47.000000000 -0700 +++ devel-akpm/include/asm-x86_64/atomic.h 2005-10-23 13:24:47.000000000 -0700 @@ -378,16 +378,4 @@ __asm__ __volatile__(LOCK "orl %0,%1" \ #define smp_mb__before_atomic_inc() barrier() #define smp_mb__after_atomic_inc() barrier() -/* ECC atomic, DMA, SMP and interrupt safe scrub function */ - -static __inline__ void atomic_scrub(u32 *virt_addr, u32 size) -{ - u32 i; - for (i = 0; i < size / 4; i++, virt_addr++) - /* Very carefully read and write to memory atomically - * so we are interrupt, DMA and SMP safe. - */ - __asm__ __volatile__("lock; addl $0, %0"::"m"(*virt_addr)); -} - #endif diff -puN /dev/null include/asm-x86_64/edac.h --- /dev/null 2003-09-15 06:40:47.000000000 -0700 +++ devel-akpm/include/asm-x86_64/edac.h 2005-10-23 13:24:47.000000000 -0700 @@ -0,0 +1,18 @@ +#ifndef ASM_EDAC_H +#define ASM_EDAC_H + +/* ECC atomic, DMA, SMP and interrupt safe scrub function */ + +static __inline__ void atomic_scrub(void *va, u32 size) +{ + unsigned int *virt_addr = va; + u32 i; + + for (i = 0; i < size / 4; i++, virt_addr++) + /* Very carefully read and write to memory atomically + * so we are interrupt, DMA and SMP safe. + */ + __asm__ __volatile__("lock; addl $0, %0"::"m"(*virt_addr)); +} + +#endif _