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

Commit ee214558 authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar
Browse files

x86: fix alloc_mptable()



Fix the conditions when we stop updating the mptable due to
running out of slots.

[ Impact: fix memory corruption / non-working update_mptable boot parameter ]

Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Len Brown <lenb@kernel.org>
LKML-Reference: <4A01C3BB.1000609@kernel.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent b9e0353f
Loading
Loading
Loading
Loading
+9 −16
Original line number Diff line number Diff line
@@ -870,24 +870,17 @@ static
inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {}
#endif /* CONFIG_X86_IO_APIC */

static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length,
		      int count)
static int
check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, int count)
{
	if (!mpc_new_phys) {
		pr_info("No spare slots, try to append...take your risk, "
			"new mpc_length %x\n", count);
	} else {
		if (count <= mpc_new_length)
			pr_info("No spare slots, try to append..., "
				"new mpc_length %x\n", count);
		else {
			pr_err("mpc_new_length %lx is too small\n",
				mpc_new_length);
	int ret = 0;

	if (!mpc_new_phys || count <= mpc_new_length) {
		WARN(1, "update_mptable: No spare slots (length: %x)\n", count);
		return -1;
	}
	}

	return 0;
	return ret;
}

static int  __init replace_intsrc_all(struct mpc_table *mpc,
@@ -946,7 +939,7 @@ static int __init replace_intsrc_all(struct mpc_table *mpc,
		} else {
			struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;
			count += sizeof(struct mpc_intsrc);
			if (!check_slot(mpc_new_phys, mpc_new_length, count))
			if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)
				goto out;
			assign_to_mpc_intsrc(&mp_irqs[i], m);
			mpc->length = count;