fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / ia64 / sn / kernel / xpc_partition.c
index 372c8f4..57c723f 100644 (file)
@@ -76,6 +76,31 @@ char *xpc_remote_copy_buffer;
 void *xpc_remote_copy_buffer_base;
 
 
+/*
+ * Guarantee that the kmalloc'd memory is cacheline aligned.
+ */
+void *
+xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base)
+{
+       /* see if kmalloc will give us cachline aligned memory by default */
+       *base = kmalloc(size, flags);
+       if (*base == NULL) {
+               return NULL;
+       }
+       if ((u64) *base == L1_CACHE_ALIGN((u64) *base)) {
+               return *base;
+       }
+       kfree(*base);
+
+       /* nope, we'll have to do it ourselves */
+       *base = kmalloc(size + L1_CACHE_BYTES, flags);
+       if (*base == NULL) {
+               return NULL;
+       }
+       return (void *) L1_CACHE_ALIGN((u64) *base);
+}
+
+
 /*
  * Given a nasid, get the physical address of the  partition's reserved page
  * for that nasid. This function returns 0 on any error.
@@ -107,9 +132,7 @@ xpc_get_rsvd_page_pa(int nasid)
                }
 
                if (L1_CACHE_ALIGN(len) > buf_len) {
-                       if (buf_base != NULL) {
-                               kfree(buf_base);
-                       }
+                       kfree(buf_base);
                        buf_len = L1_CACHE_ALIGN(len);
                        buf = (u64) xpc_kmalloc_cacheline_aligned(buf_len,
                                                        GFP_KERNEL, &buf_base);
@@ -130,9 +153,7 @@ xpc_get_rsvd_page_pa(int nasid)
                }
        }
 
-       if (buf_base != NULL) {
-               kfree(buf_base);
-       }
+       kfree(buf_base);
 
        if (status != SALRET_OK) {
                rp_pa = 0;
@@ -1030,13 +1051,12 @@ xpc_discovery(void)
        remote_vars = (struct xpc_vars *) remote_rp;
 
 
-       discovered_nasids = kmalloc(sizeof(u64) * xp_nasid_mask_words,
+       discovered_nasids = kzalloc(sizeof(u64) * xp_nasid_mask_words,
                                                        GFP_KERNEL);
        if (discovered_nasids == NULL) {
                kfree(remote_rp_base);
                return;
        }
-       memset(discovered_nasids, 0, sizeof(u64) * xp_nasid_mask_words);
 
        rp = (struct xpc_rsvd_page *) xpc_rsvd_page;