|
@@ -2233,6 +2233,30 @@ static void khugepaged_alloc_sleep(void)
|
|
|
|
|
|
static int khugepaged_node_load[MAX_NUMNODES];
|
|
|
|
|
|
+static bool khugepaged_scan_abort(int nid)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If zone_reclaim_mode is disabled, then no extra effort is made to
|
|
|
+ * allocate memory locally.
|
|
|
+ */
|
|
|
+ if (!zone_reclaim_mode)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* If there is a count for this node already, it must be acceptable */
|
|
|
+ if (khugepaged_node_load[nid])
|
|
|
+ return false;
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_NUMNODES; i++) {
|
|
|
+ if (!khugepaged_node_load[i])
|
|
|
+ continue;
|
|
|
+ if (node_distance(nid, i) > RECLAIM_DISTANCE)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_NUMA
|
|
|
static int khugepaged_find_target_node(void)
|
|
|
{
|
|
@@ -2545,6 +2569,8 @@ static int khugepaged_scan_pmd(struct mm_struct *mm,
|
|
|
* hit record.
|
|
|
*/
|
|
|
node = page_to_nid(page);
|
|
|
+ if (khugepaged_scan_abort(node))
|
|
|
+ goto out_unmap;
|
|
|
khugepaged_node_load[node]++;
|
|
|
VM_BUG_ON_PAGE(PageCompound(page), page);
|
|
|
if (!PageLRU(page) || PageLocked(page) || !PageAnon(page))
|