kernel, range: fix broken mtrr_cleanup
PATCH 1/1 kernel, range: fix broken mtrr_cleanup
From: Samuel Liao <[email protected]>
commit fbe06b7bae7c9cf6ab05168fce5ee93b2f4bae7c broken the mtrr_cleanup due to return incorrect merged range. this patch remove the empty range by swapping with the last.
Error messages:
Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 64K num_reg: 4 lose cover RAM: -0G Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 128K num_reg: 4 lose cover RAM: -0G Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 256K num_reg: 4 lose cover RAM: -0G Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 512K num_reg: 4 lose cover RAM: -0G
--- kernel/range.c | 15 ++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
kernel/range.c +11 -4
@@ -48,11 +48,18 @@ int add_range_with_merge(struct range *range, int az, int nr_range, final_start =min (range[i].start, start); final_end =max (range[i].end, end); +if (final_start == range[i].start && final_end == range[i].end) +return nr_range; +/* clear it and add it back for further merge */ - range[i].start =0 ; - range[i].end =0 ; -return add_range_with_merge (range, az, nr_range, - final_start, final_end); + nr_range -=1 ; +if (i != nr_range) { + range[i].start = range[nr_range].start; + range[i].end = range[nr_range].end; + } + range[nr_range].start =0 ; + range[nr_range].end =0 ; + i =-1 ; }/* Need to add it: */
Signature · 1 line
1.8.2.1
Quoted 36 lines · Shan Wei
From: Samuel Liao <[email protected]>
commit
fbe06b7bae7c9cf6ab05168fce5ee93b2f4bae7cbroken themtrr_cleanupdue to return incorrect merged range. this patch remove the empty range by swapping with the last.Error messages:
Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 64K num_reg: 4 lose cover RAM: -0G Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 128K num_reg: 4 lose cover RAM: -0G Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 256K num_reg: 4 lose cover RAM: -0G Jun 9 14:06:18 kernel: [ 0.000000] *BAD*gran_size: 64K chunk_size: 512K num_reg: 4 lose cover RAM: -0GSigned-off-by Samuel Liao <[email protected]>--- kernel/range.c | 15 ++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)kernel/range.c +4
-4@@ -48,11 +48,18 @@ int add_range_with_merge(struct range *range, int az, int nr_range, final_start =min (range[i].start, start); final_end =max (range[i].end, end); +if (final_start == range[i].start && final_end == range[i].end) +return nr_range; +/* clear it and add it back for further merge */ - range[i].start =0 ; - range[i].end =0 ; -return add_range_with_merge (range, az, nr_range, - final_start, final_end); + nr_range -=1 ;
kernel/range.c int add_range_with_merge(struct range *range, int az, int nr_range, · line 65
Quoted 10 lines
kernel/range.c +7
-0+if (i != nr_range) { + range[i].start = range[nr_range].start; + range[i].end = range[nr_range].end; + } + range[nr_range].start =0 ; + range[nr_range].end =0 ; + i =-1 ; }/* Need to add it: */
this patch is totally wrong.
if the ranges already have [0,1g), [2g, 3g). and want to add [1g, 2g) to it.
what is the result after this patch?
only [1g, 2g)
Thanks
Yinghai
Re: [PATCH buf-fix] kernel, range: fix broken mtrr_cleanup(Internet mail)
I forget change final_start/final_end to start/end. The old code add empty range in following case:
Before mtrr cleanup:
1. got initial MTRR range: 0-3G.
2. MTRR code try to merge 0-1M
3. result is 0-0, 0-3G, total 2 range count
After cleanup:
1. got final MTRR range: 0-3G, total 1 range count
the cleanup code failed, because range count mismatch. �翳簕.n�+壏煯壄�+%娝�遍荻w�簕.n�+壏{炳G珴�妠ay�蕠跈�,jf"穐殢飦�戧鐉_璁(殠娸"濟�m���G珴�⒏?櫒璀�&x忈秈O曟瑉窔v豝�m����鹅�⒏?朓�