diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 14d7032c1d12..3974fd81d27c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -806,11 +806,14 @@ __alloc_pages(unsigned int __nocast gfp_mask, unsigned int order, | |||
806 | classzone_idx = zone_idx(zones[0]); | 806 | classzone_idx = zone_idx(zones[0]); |
807 | 807 | ||
808 | restart: | 808 | restart: |
809 | /* Go through the zonelist once, looking for a zone with enough free */ | 809 | /* |
810 | * Go through the zonelist once, looking for a zone with enough free. | ||
811 | * See also cpuset_zone_allowed() comment in kernel/cpuset.c. | ||
812 | */ | ||
810 | for (i = 0; (z = zones[i]) != NULL; i++) { | 813 | for (i = 0; (z = zones[i]) != NULL; i++) { |
811 | int do_reclaim = should_reclaim_zone(z, gfp_mask); | 814 | int do_reclaim = should_reclaim_zone(z, gfp_mask); |
812 | 815 | ||
813 | if (!cpuset_zone_allowed(z)) | 816 | if (!cpuset_zone_allowed(z, __GFP_HARDWALL)) |
814 | continue; | 817 | continue; |
815 | 818 | ||
816 | /* | 819 | /* |
@@ -845,6 +848,7 @@ zone_reclaim_retry: | |||
845 | * | 848 | * |
846 | * This is the last chance, in general, before the goto nopage. | 849 | * This is the last chance, in general, before the goto nopage. |
847 | * Ignore cpuset if GFP_ATOMIC (!wait) rather than fail alloc. | 850 | * Ignore cpuset if GFP_ATOMIC (!wait) rather than fail alloc. |
851 | * See also cpuset_zone_allowed() comment in kernel/cpuset.c. | ||
848 | */ | 852 | */ |
849 | for (i = 0; (z = zones[i]) != NULL; i++) { | 853 | for (i = 0; (z = zones[i]) != NULL; i++) { |
850 | if (!zone_watermark_ok(z, order, z->pages_min, | 854 | if (!zone_watermark_ok(z, order, z->pages_min, |
@@ -852,7 +856,7 @@ zone_reclaim_retry: | |||
852 | gfp_mask & __GFP_HIGH)) | 856 | gfp_mask & __GFP_HIGH)) |
853 | continue; | 857 | continue; |
854 | 858 | ||
855 | if (wait && !cpuset_zone_allowed(z)) | 859 | if (wait && !cpuset_zone_allowed(z, gfp_mask)) |
856 | continue; | 860 | continue; |
857 | 861 | ||
858 | page = buffered_rmqueue(z, order, gfp_mask); | 862 | page = buffered_rmqueue(z, order, gfp_mask); |
@@ -867,7 +871,7 @@ zone_reclaim_retry: | |||
867 | if (!(gfp_mask & __GFP_NOMEMALLOC)) { | 871 | if (!(gfp_mask & __GFP_NOMEMALLOC)) { |
868 | /* go through the zonelist yet again, ignoring mins */ | 872 | /* go through the zonelist yet again, ignoring mins */ |
869 | for (i = 0; (z = zones[i]) != NULL; i++) { | 873 | for (i = 0; (z = zones[i]) != NULL; i++) { |
870 | if (!cpuset_zone_allowed(z)) | 874 | if (!cpuset_zone_allowed(z, gfp_mask)) |
871 | continue; | 875 | continue; |
872 | page = buffered_rmqueue(z, order, gfp_mask); | 876 | page = buffered_rmqueue(z, order, gfp_mask); |
873 | if (page) | 877 | if (page) |
@@ -903,7 +907,7 @@ rebalance: | |||
903 | gfp_mask & __GFP_HIGH)) | 907 | gfp_mask & __GFP_HIGH)) |
904 | continue; | 908 | continue; |
905 | 909 | ||
906 | if (!cpuset_zone_allowed(z)) | 910 | if (!cpuset_zone_allowed(z, gfp_mask)) |
907 | continue; | 911 | continue; |
908 | 912 | ||
909 | page = buffered_rmqueue(z, order, gfp_mask); | 913 | page = buffered_rmqueue(z, order, gfp_mask); |
@@ -922,7 +926,7 @@ rebalance: | |||
922 | classzone_idx, 0, 0)) | 926 | classzone_idx, 0, 0)) |
923 | continue; | 927 | continue; |
924 | 928 | ||
925 | if (!cpuset_zone_allowed(z)) | 929 | if (!cpuset_zone_allowed(z, __GFP_HARDWALL)) |
926 | continue; | 930 | continue; |
927 | 931 | ||
928 | page = buffered_rmqueue(z, order, gfp_mask); | 932 | page = buffered_rmqueue(z, order, gfp_mask); |