|
@@ -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_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_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 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.
|
|
|
+ * 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)
|
|
|
|