Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9129d6ea authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
  [IA64] Increase default nodes shift to 10, nr_cpus to 1024
  [IA64] remove redundant local_irq_save() calls from sn_sal.h
  [IA64] panic if topology_init kzalloc fails
  [IA64-SGI] Silent data corruption caused by XPC V2.
parents 18f2905f c57d68ca
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -258,7 +258,7 @@ config NR_CPUS
	int "Maximum number of CPUs (2-1024)"
	range 2 1024
	depends on SMP
	default "64"
	default "1024"
	help
	  You should set this to the number of CPUs in your system, but
	  keep in mind that a kernel compiled for, e.g., 2 CPUs will boot but
@@ -354,7 +354,7 @@ config NUMA
config NODES_SHIFT
	int "Max num nodes shift(3-10)"
	range 3 10
	default "8"
	default "10"
	depends on NEED_MULTIPLE_NODES
	help
	  This option specifies the maximum number of nodes in your SSI system.
+2 −4
Original line number Diff line number Diff line
@@ -67,10 +67,8 @@ static int __init topology_init(void)
#endif

	sysfs_cpus = kzalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL);
	if (!sysfs_cpus) {
		err = -ENOMEM;
		goto out;
	}
	if (!sysfs_cpus)
		panic("kzalloc in topology_init failed - NR_CPUS too big?");

	for_each_present_cpu(i) {
		if((err = arch_register_cpu(i)))
+2 −2
Original line number Diff line number Diff line
@@ -279,8 +279,8 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst,
		return part->reason;
	}

	bte_ret = xp_bte_copy((u64) src, (u64) ia64_tpa((u64) dst),
				(u64) cnt, (BTE_NORMAL | BTE_WACQUIRE), NULL);
	bte_ret = xp_bte_copy((u64) src, (u64) dst, (u64) cnt,
					(BTE_NORMAL | BTE_WACQUIRE), NULL);
	if (bte_ret == BTE_SUCCESS) {
		return xpcSuccess;
	}
+16 −12
Original line number Diff line number Diff line
@@ -1052,6 +1052,8 @@ xpc_do_exit(enum xpc_retval reason)
	if (xpc_sysctl) {
		unregister_sysctl_table(xpc_sysctl);
	}

	kfree(xpc_remote_copy_buffer_base);
}


@@ -1212,24 +1214,20 @@ xpc_init(void)
	partid_t partid;
	struct xpc_partition *part;
	pid_t pid;
	size_t buf_size;


	if (!ia64_platform_is("sn2")) {
		return -ENODEV;
	}

	/*
	 * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng
	 * various portions of a partition's reserved page. Its size is based
	 * on the size of the reserved page header and part_nasids mask. So we
	 * need to ensure that the other items will fit as well.
	 */
	if (XPC_RP_VARS_SIZE > XPC_RP_HEADER_SIZE + XP_NASID_MASK_BYTES) {
		dev_err(xpc_part, "xpc_remote_copy_buffer is not big enough\n");
		return -EPERM;
	}
	DBUG_ON((u64) xpc_remote_copy_buffer !=
				L1_CACHE_ALIGN((u64) xpc_remote_copy_buffer));

	buf_size = max(XPC_RP_VARS_SIZE,
				XPC_RP_HEADER_SIZE + XP_NASID_MASK_BYTES);
	xpc_remote_copy_buffer = xpc_kmalloc_cacheline_aligned(buf_size,
				     GFP_KERNEL, &xpc_remote_copy_buffer_base);
	if (xpc_remote_copy_buffer == NULL)
		return -ENOMEM;

	snprintf(xpc_part->bus_id, BUS_ID_SIZE, "part");
	snprintf(xpc_chan->bus_id, BUS_ID_SIZE, "chan");
@@ -1293,6 +1291,8 @@ xpc_init(void)
		if (xpc_sysctl) {
			unregister_sysctl_table(xpc_sysctl);
		}

		kfree(xpc_remote_copy_buffer_base);
		return -EBUSY;
	}

@@ -1311,6 +1311,8 @@ xpc_init(void)
		if (xpc_sysctl) {
			unregister_sysctl_table(xpc_sysctl);
		}

		kfree(xpc_remote_copy_buffer_base);
		return -EBUSY;
	}

@@ -1362,6 +1364,8 @@ xpc_init(void)
		if (xpc_sysctl) {
			unregister_sysctl_table(xpc_sysctl);
		}

		kfree(xpc_remote_copy_buffer_base);
		return -EBUSY;
	}

+8 −16
Original line number Diff line number Diff line
@@ -71,19 +71,15 @@ struct xpc_partition xpc_partitions[XP_MAX_PARTITIONS + 1];
 * Generic buffer used to store a local copy of portions of a remote
 * partition's reserved page (either its header and part_nasids mask,
 * or its vars).
 *
 * xpc_discovery runs only once and is a seperate thread that is
 * very likely going to be processing in parallel with receiving
 * interrupts.
 */
char ____cacheline_aligned xpc_remote_copy_buffer[XPC_RP_HEADER_SIZE +
							XP_NASID_MASK_BYTES];
char *xpc_remote_copy_buffer;
void *xpc_remote_copy_buffer_base;


/*
 * Guarantee that the kmalloc'd memory is cacheline aligned.
 */
static void *
void *
xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base)
{
	/* see if kmalloc will give us cachline aligned memory by default */
@@ -148,7 +144,7 @@ xpc_get_rsvd_page_pa(int nasid)
			}
		}

		bte_res = xp_bte_copy(rp_pa, ia64_tpa(buf), buf_len,
		bte_res = xp_bte_copy(rp_pa, 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);
@@ -447,7 +443,7 @@ xpc_check_remote_hb(void)

		/* pull the remote_hb cache line */
		bres = xp_bte_copy(part->remote_vars_pa,
					ia64_tpa((u64) remote_vars),
					(u64) remote_vars,
					XPC_RP_VARS_SIZE,
					(BTE_NOTIFY | BTE_WACQUIRE), NULL);
		if (bres != BTE_SUCCESS) {
@@ -498,8 +494,7 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids,


	/* pull over the reserved page header and part_nasids mask */

	bres = xp_bte_copy(*remote_rp_pa, ia64_tpa((u64) remote_rp),
	bres = xp_bte_copy(*remote_rp_pa, (u64) remote_rp,
				XPC_RP_HEADER_SIZE + xp_nasid_mask_bytes,
				(BTE_NOTIFY | BTE_WACQUIRE), NULL);
	if (bres != BTE_SUCCESS) {
@@ -554,11 +549,8 @@ xpc_get_remote_vars(u64 remote_vars_pa, struct xpc_vars *remote_vars)
		return xpcVarsNotSet;
	}


	/* pull over the cross partition variables */

	bres = xp_bte_copy(remote_vars_pa, ia64_tpa((u64) remote_vars),
				XPC_RP_VARS_SIZE,
	bres = xp_bte_copy(remote_vars_pa, (u64) remote_vars, XPC_RP_VARS_SIZE,
				(BTE_NOTIFY | BTE_WACQUIRE), NULL);
	if (bres != BTE_SUCCESS) {
		return xpc_map_bte_errors(bres);
@@ -1239,7 +1231,7 @@ xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask)

	part_nasid_pa = (u64) XPC_RP_PART_NASIDS(part->remote_rp_pa);

	bte_res = xp_bte_copy(part_nasid_pa, ia64_tpa((u64) nasid_mask),
	bte_res = xp_bte_copy(part_nasid_pa, (u64) nasid_mask,
			xp_nasid_mask_bytes, (BTE_NOTIFY | BTE_WACQUIRE), NULL);

	return xpc_map_bte_errors(bte_res);
Loading