From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Yinghai Lu To: "H. Peter Anvin" , Andrew Morton Cc: Thomas Gleixner , Ingo Molnar , Joshua Covington , linux-kernel@vger.kernel.org, Yinghai Lu , Subject: [PATCH 2/2] x86, range: make add_range use blank slot Date: Sun, 9 Jun 2013 13:00:05 -0700 Message-Id: <1370808005-23565-2-git-send-email-yinghai@kernel.org> In-Reply-To: <1370808005-23565-1-git-send-email-yinghai@kernel.org> References: <1370808005-23565-1-git-send-email-yinghai@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: Now add_range_with_merge will generate blank slot as subtract_range. we could reach the array limit because of blank slots. We can let add_range to have second try to use blank slot. Also use WARN_ONCE to print trace. Reported-by: Joshua Covington Signed-off-by: Yinghai Lu Cc: v3.9 --- kernel/range.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) Index: linux-2.6/kernel/range.c =================================================================== --- linux-2.6.orig/kernel/range.c +++ linux-2.6/kernel/range.c @@ -3,23 +3,34 @@ */ #include #include +#include #include - #include int add_range(struct range *range, int az, int nr_range, u64 start, u64 end) { - if (start >= end) - return nr_range; + int i; - /* Out of slots: */ - if (nr_range >= az) + if (start >= end) return nr_range; - range[nr_range].start = start; - range[nr_range].end = end; + /* Out of slots ? */ + if (nr_range < az) { + i = nr_range; + nr_range++; + } else { + /* find blank slot */ + for (i = 0; i < az; i++) + if (!range[i].end) + break; + if (i == az) { + WARN_ONCE(1, "run out of slot in ranges\n"); + return az; + } + } - nr_range++; + range[i].start = start; + range[i].end = end; return nr_range; } @@ -98,10 +109,9 @@ void subtract_range(struct range *range, if (i < az) { range[i].end = range[j].end; range[i].start = end; - } else { - pr_err("%s: run out of slot in ranges\n", - __func__); - } + } else + WARN_ONCE(1, "run out of slot in ranges\n"); + range[j].end = start; continue; }