aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/sock.h5
-rw-r--r--net/core/sock.c22
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
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
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;
271int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); 271int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512);
272EXPORT_SYMBOL(sysctl_optmem_max); 272EXPORT_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 */
282void sk_set_memalloc(struct sock *sk)
283{
284 sock_set_flag(sk, SOCK_MEMALLOC);
285 sk->sk_allocation |= __GFP_MEMALLOC;
286}
287EXPORT_SYMBOL_GPL(sk_set_memalloc);
288
289void sk_clear_memalloc(struct sock *sk)
290{
291 sock_reset_flag(sk, SOCK_MEMALLOC);
292 sk->sk_allocation &= ~__GFP_MEMALLOC;
293}
294EXPORT_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)
276int net_cls_subsys_id = -1; 298int net_cls_subsys_id = -1;