Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Wed, 27 Jun 2007 17:04:02 +0000 (10:04 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Wed, 27 Jun 2007 17:04:02 +0000 (10:04 -0700)
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
  [IA64] Make SN2 PCI code use ioremap rather than manually mangle the address
  [IA64] Force error to surface in nofault code
  [IA64] change sh_change_coherence oemcall to use nolock
  [IA64] remove duplicate header include line
  [IA64] Correct unwind validation code
  [IA64] is_power_of_2-ia64/mm/hugetlbpage.c

arch/ia64/kernel/time.c
arch/ia64/kernel/unwind.c
arch/ia64/mm/hugetlbpage.c
arch/ia64/sn/kernel/xp_nofault.S
arch/ia64/sn/pci/pcibr/pcibr_provider.c
arch/ia64/sn/pci/tioca_provider.c
arch/ia64/sn/pci/tioce_provider.c
include/asm-ia64/sn/sn_sal.h

index a06667c7acc0272ba492ef7a11c99fd90046d602..3486fe7d6e65df00db95a4b93ff442cc2b14090d 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/time.h>
 #include <linux/interrupt.h>
 #include <linux/efi.h>
-#include <linux/profile.h>
 #include <linux/timex.h>
 
 #include <asm/machvec.h>
index b0b08b5f3eca217ccecaced1d0188a66b98fd879..c1bdb5131814c8f9f24e01cc51eae54e4df35666 100644 (file)
@@ -1856,11 +1856,19 @@ find_save_locs (struct unw_frame_info *info)
        return 0;
 }
 
+static int
+unw_valid(const struct unw_frame_info *info, unsigned long* p)
+{
+       unsigned long loc = (unsigned long)p;
+       return (loc >= info->regstk.limit && loc < info->regstk.top) ||
+              (loc >= info->memstk.top && loc < info->memstk.limit);
+}
+
 int
 unw_unwind (struct unw_frame_info *info)
 {
        unsigned long prev_ip, prev_sp, prev_bsp;
-       unsigned long ip, pr, num_regs, rp_loc, pfs_loc;
+       unsigned long ip, pr, num_regs;
        STAT(unsigned long start, flags;)
        int retval;
 
@@ -1871,8 +1879,7 @@ unw_unwind (struct unw_frame_info *info)
        prev_bsp = info->bsp;
 
        /* validate the return IP pointer */
-       rp_loc = (unsigned long) info->rp_loc;
-       if ((rp_loc < info->regstk.limit) || (rp_loc > info->regstk.top)) {
+       if (!unw_valid(info, info->rp_loc)) {
                /* FIXME: should really be level 0 but it occurs too often. KAO */
                UNW_DPRINT(1, "unwind.%s: failed to locate return link (ip=0x%lx)!\n",
                           __FUNCTION__, info->ip);
@@ -1888,8 +1895,7 @@ unw_unwind (struct unw_frame_info *info)
        }
 
        /* validate the previous stack frame pointer */
-       pfs_loc = (unsigned long) info->pfs_loc;
-       if ((pfs_loc < info->regstk.limit) || (pfs_loc > info->regstk.top)) {
+       if (!unw_valid(info, info->pfs_loc)) {
                UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __FUNCTION__);
                STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
                return -1;
index 1346b7f05397506f0384fb204d9d62f27d838d6e..d22861c5b04ca596e4beebbf295f66955bef1606 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/pagemap.h>
 #include <linux/slab.h>
 #include <linux/sysctl.h>
+#include <linux/log2.h>
 #include <asm/mman.h>
 #include <asm/pgalloc.h>
 #include <asm/tlb.h>
@@ -182,7 +183,7 @@ static int __init hugetlb_setup_sz(char *str)
                tr_pages = 0x15557000UL;
 
        size = memparse(str, &str);
-       if (*str || (size & (size-1)) || !(tr_pages & size) ||
+       if (*str || !is_power_of_2(size) || !(tr_pages & size) ||
                size <= PAGE_SIZE ||
                size >= (1UL << PAGE_SHIFT << MAX_ORDER)) {
                printk(KERN_WARNING "Invalid huge page size specified\n");
index b772543053c96d98bdf45d2b23ec0a2a5bad2178..54e8973b6e99d21679c2083d76c8c0ea2cdfaedf 100644 (file)
@@ -21,7 +21,8 @@
 xp_nofault_PIOR:
        mov     r8=r0                   // Stage a success return value
        ld8.acq r9=[r32];;              // PIO Read the specified register
-       adds    r9=1,r9                 // Add to force a consume
+       adds    r9=1,r9;;               // Add to force consumption
+       or      r9=r9,r9;;              // Or to force consumption
        br.ret.sptk.many b0;;           // Return success
 
        .global xp_error_PIOR
index 04a8256017eb6ab8c0294580c52b12b584c15102..b42bfcae6f911108f364473ae7e3d7a7fcf80b26 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/sn/pcibus_provider_defs.h>
 #include <asm/sn/pcidev.h>
 #include <asm/sn/sn_sal.h>
+#include <asm/sn/pic.h>
 #include <asm/sn/sn2/sn_hwperf.h>
 #include "xtalk/xwidgetdev.h"
 #include "xtalk/hubdev.h"
@@ -130,9 +131,9 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
        }
 
        memcpy(soft, prom_bussoft, sizeof(struct pcibus_info));
-       soft->pbi_buscommon.bs_base =
-           (((u64) soft->pbi_buscommon.
-             bs_base << 4) >> 4) | __IA64_UNCACHED_OFFSET;
+       soft->pbi_buscommon.bs_base = (unsigned long)
+               ioremap(REGION_OFFSET(soft->pbi_buscommon.bs_base),
+                       sizeof(struct pic));
 
        spin_lock_init(&soft->pbi_lock);
 
index b9bedbd6e1d628d38016e9910fd0ab0b6307b7a8..d798dd4d0dc444eb2144eaaf4404e71552c3c7af 100644 (file)
@@ -610,7 +610,9 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
                return NULL;
 
        memcpy(tioca_common, prom_bussoft, sizeof(struct tioca_common));
-       tioca_common->ca_common.bs_base |= __IA64_UNCACHED_OFFSET;
+       tioca_common->ca_common.bs_base = (unsigned long)
+               ioremap(REGION_OFFSET(tioca_common->ca_common.bs_base),
+                       sizeof(struct tioca_common));
 
        /* init kernel-private area */
 
index f4c0b961a9390ccbaad79dc45413615a9f6addc3..84b72b27e27fcdc6917e3587f52c8b55039a355b 100644 (file)
@@ -1002,7 +1002,9 @@ tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
                return NULL;
 
        memcpy(tioce_common, prom_bussoft, sizeof(struct tioce_common));
-       tioce_common->ce_pcibus.bs_base |= __IA64_UNCACHED_OFFSET;
+       tioce_common->ce_pcibus.bs_base = (unsigned long)
+               ioremap(REGION_OFFSET(tioce_common->ce_pcibus.bs_base),
+                       sizeof(struct tioce_common));
 
        tioce_kern = tioce_kern_init(tioce_common);
        if (tioce_kern == NULL) {
index 291e8ceed6e6ddddfdbcd2060aa97f0eb914aba9..d3566a298fa40b773a96d3518e1fd1f71782eec0 100644 (file)
@@ -696,8 +696,8 @@ static inline int
 sn_change_coherence(u64 *new_domain, u64 *old_domain)
 {
        struct ia64_sal_retval ret_stuff;
-       ia64_sal_oemcall(&ret_stuff, SN_SAL_COHERENCE, (u64)new_domain,
-                        (u64)old_domain, 0, 0, 0, 0, 0);
+       ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_COHERENCE, (u64)new_domain,
+                               (u64)old_domain, 0, 0, 0, 0, 0);
        return ret_stuff.status;
 }