diff options
-rw-r--r-- | include/net/sock.h | 5 | ||||
-rw-r--r-- | net/core/sock.c | 22 |
2 files changed, 26 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 | ||
661 | static inline gfp_t sk_gfp_atomic(struct sock *sk, gfp_t gfp_mask) | 662 | static 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 | ||
666 | static inline void sk_acceptq_removed(struct sock *sk) | 667 | static inline void sk_acceptq_removed(struct sock *sk) |
@@ -803,6 +804,8 @@ extern int sk_stream_wait_memory(struct sock *sk, long *timeo_p); | |||
803 | extern void sk_stream_wait_close(struct sock *sk, long timeo_p); | 804 | extern void sk_stream_wait_close(struct sock *sk, long timeo_p); |
804 | extern int sk_stream_error(struct sock *sk, int flags, int err); | 805 | extern int sk_stream_error(struct sock *sk, int flags, int err); |
805 | extern void sk_stream_kill_queues(struct sock *sk); | 806 | extern void sk_stream_kill_queues(struct sock *sk); |
807 | extern void sk_set_memalloc(struct sock *sk); | ||
808 | extern void sk_clear_memalloc(struct sock *sk); | ||
806 | 809 | ||
807 | extern int sk_wait_data(struct sock *sk, long *timeo); | 810 | extern int sk_wait_data(struct sock *sk, long *timeo); |
808 | 811 | ||
diff --git a/net/core/sock.c b/net/core/sock.c index a67b06280e4c..3617f652f6b0 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -271,6 +271,28 @@ __u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX; | |||
271 | int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); | 271 | int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); |
272 | EXPORT_SYMBOL(sysctl_optmem_max); | 272 | EXPORT_SYMBOL(sysctl_optmem_max); |
273 | 273 | ||
274 | /** | ||
275 | * sk_set_memalloc - sets %SOCK_MEMALLOC | ||
276 | * @sk: socket to set it on | ||
277 | * | ||
278 | * Set %SOCK_MEMALLOC on a socket for access to emergency reserves. | ||
279 | * It's the responsibility of the admin to adjust min_free_kbytes | ||
280 | * to meet the requirements | ||
281 | */ | ||
282 | void sk_set_memalloc(struct sock *sk) | ||
283 | { | ||
284 | sock_set_flag(sk, SOCK_MEMALLOC); | ||
285 | sk->sk_allocation |= __GFP_MEMALLOC; | ||
286 | } | ||
287 | EXPORT_SYMBOL_GPL(sk_set_memalloc); | ||
288 | |||
289 | void sk_clear_memalloc(struct sock *sk) | ||
290 | { | ||
291 | sock_reset_flag(sk, SOCK_MEMALLOC); | ||
292 | sk->sk_allocation &= ~__GFP_MEMALLOC; | ||
293 | } | ||
294 | EXPORT_SYMBOL_GPL(sk_clear_memalloc); | ||
295 | |||
274 | #if defined(CONFIG_CGROUPS) | 296 | #if defined(CONFIG_CGROUPS) |
275 | #if !defined(CONFIG_NET_CLS_CGROUP) | 297 | #if !defined(CONFIG_NET_CLS_CGROUP) |
276 | int net_cls_subsys_id = -1; | 298 | int net_cls_subsys_id = -1; |