diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries/cmm.c')
-rw-r--r-- | arch/powerpc/platforms/pseries/cmm.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/arch/powerpc/platforms/pseries/cmm.c b/arch/powerpc/platforms/pseries/cmm.c index 6567439fe78..bcdcf0ccc8d 100644 --- a/arch/powerpc/platforms/pseries/cmm.c +++ b/arch/powerpc/platforms/pseries/cmm.c | |||
@@ -229,8 +229,9 @@ static void cmm_get_mpp(void) | |||
229 | { | 229 | { |
230 | int rc; | 230 | int rc; |
231 | struct hvcall_mpp_data mpp_data; | 231 | struct hvcall_mpp_data mpp_data; |
232 | unsigned long active_pages_target; | 232 | signed long active_pages_target, page_loan_request, target; |
233 | signed long page_loan_request; | 233 | signed long total_pages = totalram_pages + loaned_pages; |
234 | signed long min_mem_pages = (min_mem_mb * 1024 * 1024) / PAGE_SIZE; | ||
234 | 235 | ||
235 | rc = h_get_mpp(&mpp_data); | 236 | rc = h_get_mpp(&mpp_data); |
236 | 237 | ||
@@ -238,17 +239,25 @@ static void cmm_get_mpp(void) | |||
238 | return; | 239 | return; |
239 | 240 | ||
240 | page_loan_request = div_s64((s64)mpp_data.loan_request, PAGE_SIZE); | 241 | page_loan_request = div_s64((s64)mpp_data.loan_request, PAGE_SIZE); |
241 | loaned_pages_target = page_loan_request + loaned_pages; | 242 | target = page_loan_request + (signed long)loaned_pages; |
242 | if (loaned_pages_target > oom_freed_pages) | 243 | |
243 | loaned_pages_target -= oom_freed_pages; | 244 | if (target < 0 || total_pages < min_mem_pages) |
245 | target = 0; | ||
246 | |||
247 | if (target > oom_freed_pages) | ||
248 | target -= oom_freed_pages; | ||
244 | else | 249 | else |
245 | loaned_pages_target = 0; | 250 | target = 0; |
251 | |||
252 | active_pages_target = total_pages - target; | ||
253 | |||
254 | if (min_mem_pages > active_pages_target) | ||
255 | target = total_pages - min_mem_pages; | ||
246 | 256 | ||
247 | active_pages_target = totalram_pages + loaned_pages - loaned_pages_target; | 257 | if (target < 0) |
258 | target = 0; | ||
248 | 259 | ||
249 | if ((min_mem_mb * 1024 * 1024) > (active_pages_target * PAGE_SIZE)) | 260 | loaned_pages_target = target; |
250 | loaned_pages_target = totalram_pages + loaned_pages - | ||
251 | ((min_mem_mb * 1024 * 1024) / PAGE_SIZE); | ||
252 | 261 | ||
253 | cmm_dbg("delta = %ld, loaned = %lu, target = %lu, oom = %lu, totalram = %lu\n", | 262 | cmm_dbg("delta = %ld, loaned = %lu, target = %lu, oom = %lu, totalram = %lu\n", |
254 | page_loan_request, loaned_pages, loaned_pages_target, | 263 | page_loan_request, loaned_pages, loaned_pages_target, |