diff options
Diffstat (limited to 'include/linux/gfp.h')
| -rw-r--r-- | include/linux/gfp.h | 56 | 
1 files changed, 43 insertions, 13 deletions
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 4c6656f1fee7..bcfb9f7c46f5 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -25,7 +25,7 @@ struct vm_area_struct;  #define ___GFP_FS		0x80u  #define ___GFP_COLD		0x100u  #define ___GFP_NOWARN		0x200u -#define ___GFP_REPEAT		0x400u +#define ___GFP_RETRY_MAYFAIL	0x400u  #define ___GFP_NOFAIL		0x800u  #define ___GFP_NORETRY		0x1000u  #define ___GFP_MEMALLOC		0x2000u @@ -136,26 +136,56 @@ struct vm_area_struct;   *   * __GFP_RECLAIM is shorthand to allow/forbid both direct and kswapd reclaim.   * - * __GFP_REPEAT: Try hard to allocate the memory, but the allocation attempt - *   _might_ fail.  This depends upon the particular VM implementation. + * The default allocator behavior depends on the request size. We have a concept + * of so called costly allocations (with order > PAGE_ALLOC_COSTLY_ORDER). + * !costly allocations are too essential to fail so they are implicitly + * non-failing by default (with some exceptions like OOM victims might fail so + * the caller still has to check for failures) while costly requests try to be + * not disruptive and back off even without invoking the OOM killer. + * The following three modifiers might be used to override some of these + * implicit rules   * - * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller - *   cannot handle allocation failures. New users should be evaluated carefully - *   (and the flag should be used only when there is no reasonable failure - *   policy) but it is definitely preferable to use the flag rather than - *   opencode endless loop around allocator. + * __GFP_NORETRY: The VM implementation will try only very lightweight + *   memory direct reclaim to get some memory under memory pressure (thus + *   it can sleep). It will avoid disruptive actions like OOM killer. The + *   caller must handle the failure which is quite likely to happen under + *   heavy memory pressure. The flag is suitable when failure can easily be + *   handled at small cost, such as reduced throughput + * + * __GFP_RETRY_MAYFAIL: The VM implementation will retry memory reclaim + *   procedures that have previously failed if there is some indication + *   that progress has been made else where.  It can wait for other + *   tasks to attempt high level approaches to freeing memory such as + *   compaction (which removes fragmentation) and page-out. + *   There is still a definite limit to the number of retries, but it is + *   a larger limit than with __GFP_NORETRY. + *   Allocations with this flag may fail, but only when there is + *   genuinely little unused memory. While these allocations do not + *   directly trigger the OOM killer, their failure indicates that + *   the system is likely to need to use the OOM killer soon.  The + *   caller must handle failure, but can reasonably do so by failing + *   a higher-level request, or completing it only in a much less + *   efficient manner. + *   If the allocation does fail, and the caller is in a position to + *   free some non-essential memory, doing so could benefit the system + *   as a whole.   * - * __GFP_NORETRY: The VM implementation must not retry indefinitely and will - *   return NULL when direct reclaim and memory compaction have failed to allow - *   the allocation to succeed.  The OOM killer is not called with the current - *   implementation. + * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller + *   cannot handle allocation failures. The allocation could block + *   indefinitely but will never return with failure. Testing for + *   failure is pointless. + *   New users should be evaluated carefully (and the flag should be + *   used only when there is no reasonable failure policy) but it is + *   definitely preferable to use the flag rather than opencode endless + *   loop around allocator. + *   Using this flag for costly allocations is _highly_ discouraged.   */  #define __GFP_IO	((__force gfp_t)___GFP_IO)  #define __GFP_FS	((__force gfp_t)___GFP_FS)  #define __GFP_DIRECT_RECLAIM	((__force gfp_t)___GFP_DIRECT_RECLAIM) /* Caller can reclaim */  #define __GFP_KSWAPD_RECLAIM	((__force gfp_t)___GFP_KSWAPD_RECLAIM) /* kswapd can wake */  #define __GFP_RECLAIM ((__force gfp_t)(___GFP_DIRECT_RECLAIM|___GFP_KSWAPD_RECLAIM)) -#define __GFP_REPEAT	((__force gfp_t)___GFP_REPEAT) +#define __GFP_RETRY_MAYFAIL	((__force gfp_t)___GFP_RETRY_MAYFAIL)  #define __GFP_NOFAIL	((__force gfp_t)___GFP_NOFAIL)  #define __GFP_NORETRY	((__force gfp_t)___GFP_NORETRY)  | 
