aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/sock.h
diff options
context:
space:
mode:
authorMel Gorman <mgorman@suse.de>2012-07-31 19:44:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-31 21:42:46 -0400
commit7cb0240492caea2f6467f827313478f41877e6ef (patch)
tree4836f7c2c07ed199e3122ea70bedf34f048ecd81 /include/net/sock.h
parent99a1dec70d5acbd8c6b3928cdebb4a2d1da676c8 (diff)
netvm: allow the use of __GFP_MEMALLOC by specific sockets
Allow specific sockets to be tagged SOCK_MEMALLOC and use __GFP_MEMALLOC for their allocations. These sockets will be able to go below watermarks and allocate from the emergency reserve. Such sockets are to be used to service the VM (iow. to swap over). They must be handled kernel side, exposing such a socket to user-space is a bug. There is a risk that the reserves be depleted so for now, the administrator is responsible for increasing min_free_kbytes as necessary to prevent deadlock for their workloads. [a.p.zijlstra@chello.nl: Original patches] Signed-off-by: Mel Gorman <mgorman@suse.de> Acked-by: David S. Miller <davem@davemloft.net> Cc: Neil Brown <neilb@suse.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Mike Christie <michaelc@cs.wisc.edu> Cc: Eric B Munson <emunson@mgebm.net> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> Cc: Mel Gorman <mgorman@suse.de> Cc: Christoph Lameter <cl@linux.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/net/sock.h')
-rw-r--r--include/net/sock.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/include/net/sock.h b/include/net/sock.h
index 11ccde65c4cf..bfa7d20e6646 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -621,6 +621,7 @@ enum sock_flags {
621 SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */ 621 SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */
622 SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ 622 SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
623 SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ 623 SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
624 SOCK_MEMALLOC, /* VM depends on this socket for swapping */
624 SOCK_TIMESTAMPING_TX_HARDWARE, /* %SOF_TIMESTAMPING_TX_HARDWARE */ 625 SOCK_TIMESTAMPING_TX_HARDWARE, /* %SOF_TIMESTAMPING_TX_HARDWARE */
625 SOCK_TIMESTAMPING_TX_SOFTWARE, /* %SOF_TIMESTAMPING_TX_SOFTWARE */ 626 SOCK_TIMESTAMPING_TX_SOFTWARE, /* %SOF_TIMESTAMPING_TX_SOFTWARE */
626 SOCK_TIMESTAMPING_RX_HARDWARE, /* %SOF_TIMESTAMPING_RX_HARDWARE */ 627 SOCK_TIMESTAMPING_RX_HARDWARE, /* %SOF_TIMESTAMPING_RX_HARDWARE */
@@ -660,7 +661,7 @@ static inline bool sock_flag(const struct sock *sk, enum sock_flags flag)
660 661
661static inline gfp_t sk_gfp_atomic(struct sock *sk, gfp_t gfp_mask) 662static inline gfp_t sk_gfp_atomic(struct sock *sk, gfp_t gfp_mask)
662{ 663{
663 return GFP_ATOMIC; 664 return GFP_ATOMIC | (sk->sk_allocation & __GFP_MEMALLOC);
664} 665}
665 666
666static inline void sk_acceptq_removed(struct sock *sk) 667static inline void sk_acceptq_removed(struct sock *sk)
@@ -803,6 +804,8 @@ extern int sk_stream_wait_memory(struct sock *sk, long *timeo_p);
803extern void sk_stream_wait_close(struct sock *sk, long timeo_p); 804extern void sk_stream_wait_close(struct sock *sk, long timeo_p);
804extern int sk_stream_error(struct sock *sk, int flags, int err); 805extern int sk_stream_error(struct sock *sk, int flags, int err);
805extern void sk_stream_kill_queues(struct sock *sk); 806extern void sk_stream_kill_queues(struct sock *sk);
807extern void sk_set_memalloc(struct sock *sk);
808extern void sk_clear_memalloc(struct sock *sk);
806 809
807extern int sk_wait_data(struct sock *sk, long *timeo); 810extern int sk_wait_data(struct sock *sk, long *timeo);
808 811