[IA64-SGI] cleanup the way XPC locates the reserved page
authorDean Nelson <dcn@sgi.com>
Tue, 25 Oct 2005 19:11:53 +0000 (14:11 -0500)
committerTony Luck <tony.luck@intel.com>
Tue, 25 Oct 2005 23:33:22 +0000 (16:33 -0700)
Eliminate the passing in of a scratch buffer used for locating the
reserved page setup for XPC.

Signed-off-by: Dean Nelson <dcn@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/sn/kernel/xpc_partition.c

index 6bb1091f2a4df3113269beed28f5ec927625208c..ce5a37ff4388f706cfa46ee746d261437dedbf24 100644 (file)
@@ -85,13 +85,16 @@ char ____cacheline_aligned xpc_remote_copy_buffer[XPC_RP_HEADER_SIZE +
  * for that nasid. This function returns 0 on any error.
  */
 static u64
-xpc_get_rsvd_page_pa(int nasid, u64 buf, u64 buf_size)
+xpc_get_rsvd_page_pa(int nasid)
 {
        bte_result_t bte_res;
        s64 status;
        u64 cookie = 0;
        u64 rp_pa = nasid;      /* seed with nasid */
        u64 len = 0;
+       u64 buf = buf;
+       u64 buf_len = 0;
+       void *buf_base = NULL;
 
 
        while (1) {
@@ -107,13 +110,22 @@ xpc_get_rsvd_page_pa(int nasid, u64 buf, u64 buf_size)
                        break;
                }
 
-               if (len > buf_size) {
-                       dev_err(xpc_part, "len (=0x%016lx) > buf_size\n", len);
-                       status = SALRET_ERROR;
-                       break;
+               if (L1_CACHE_ALIGN(len) > buf_len) {
+                       if (buf_base != NULL) {
+                               kfree(buf_base);
+                       }
+                       buf_len = L1_CACHE_ALIGN(len);
+                       buf = (u64) xpc_kmalloc_cacheline_aligned(buf_len,
+                                                       GFP_KERNEL, &buf_base);
+                       if (buf_base == NULL) {
+                               dev_err(xpc_part, "unable to kmalloc "
+                                       "len=0x%016lx\n", buf_len);
+                               status = SALRET_ERROR;
+                               break;
+                       }
                }
 
-               bte_res = xp_bte_copy(rp_pa, ia64_tpa(buf), buf_size,
+               bte_res = xp_bte_copy(rp_pa, ia64_tpa(buf), buf_len,
                                        (BTE_NOTIFY | BTE_WACQUIRE), NULL);
                if (bte_res != BTE_SUCCESS) {
                        dev_dbg(xpc_part, "xp_bte_copy failed %i\n", bte_res);
@@ -122,6 +134,10 @@ xpc_get_rsvd_page_pa(int nasid, u64 buf, u64 buf_size)
                }
        }
 
+       if (buf_base != NULL) {
+               kfree(buf_base);
+       }
+
        if (status != SALRET_OK) {
                rp_pa = 0;
        }
@@ -146,10 +162,9 @@ xpc_rsvd_page_init(void)
 
        /* get the local reserved page's address */
 
-       rp_pa = xpc_get_rsvd_page_pa(cnodeid_to_nasid(0),
-                                       (u64) xpc_remote_copy_buffer,
-                                               XPC_RP_HEADER_SIZE +
-                                                       L1_CACHE_BYTES);
+       preempt_disable();
+       rp_pa = xpc_get_rsvd_page_pa(cpuid_to_nasid(smp_processor_id()));
+       preempt_enable();
        if (rp_pa == 0) {
                dev_err(xpc_part, "SAL failed to locate the reserved page\n");
                return NULL;
@@ -455,9 +470,7 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids,
 
        /* get the reserved page's physical address */
 
-       *remote_rp_pa = xpc_get_rsvd_page_pa(nasid, (u64) remote_rp,
-                                               XPC_RP_HEADER_SIZE +
-                                                       xp_nasid_mask_bytes);
+       *remote_rp_pa = xpc_get_rsvd_page_pa(nasid);
        if (*remote_rp_pa == 0) {
                return xpcNoRsvdPageAddr;
        }