diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-31 19:25:39 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-31 19:25:39 -0700 | 
| commit | ac694dbdbc403c00e2c14d10bc7b8412cc378259 (patch) | |
| tree | e37328cfbeaf43716dd5914cad9179e57e84df76 /include/net/sock.h | |
| parent | a40a1d3d0a2fd613fdec6d89d3c053268ced76ed (diff) | |
| parent | 437ea90cc3afdca5229b41c6b1d38c4842756cb9 (diff) | |
| download | olio-linux-3.10-ac694dbdbc403c00e2c14d10bc7b8412cc378259.tar.xz olio-linux-3.10-ac694dbdbc403c00e2c14d10bc7b8412cc378259.zip  | |
Merge branch 'akpm' (Andrew's patch-bomb)
Merge Andrew's second set of patches:
 - MM
 - a few random fixes
 - a couple of RTC leftovers
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (120 commits)
  rtc/rtc-88pm80x: remove unneed devm_kfree
  rtc/rtc-88pm80x: assign ret only when rtc_register_driver fails
  mm: hugetlbfs: close race during teardown of hugetlbfs shared page tables
  tmpfs: distribute interleave better across nodes
  mm: remove redundant initialization
  mm: warn if pg_data_t isn't initialized with zero
  mips: zero out pg_data_t when it's allocated
  memcg: gix memory accounting scalability in shrink_page_list
  mm/sparse: remove index_init_lock
  mm/sparse: more checks on mem_section number
  mm/sparse: optimize sparse_index_alloc
  memcg: add mem_cgroup_from_css() helper
  memcg: further prevent OOM with too many dirty pages
  memcg: prevent OOM with too many dirty pages
  mm: mmu_notifier: fix freed page still mapped in secondary MMU
  mm: memcg: only check anon swapin page charges for swap cache
  mm: memcg: only check swap cache pages for repeated charging
  mm: memcg: split swapin charge function into private and public part
  mm: memcg: remove needless !mm fixup to init_mm when charging
  mm: memcg: remove unneeded shmem charge type
  ...
Diffstat (limited to 'include/net/sock.h')
| -rw-r--r-- | include/net/sock.h | 40 | 
1 files changed, 35 insertions, 5 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index e067f8c18f8..b3730239bf1 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -621,6 +621,7 @@ enum sock_flags {  	SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */  	SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */  	SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ +	SOCK_MEMALLOC, /* VM depends on this socket for swapping */  	SOCK_TIMESTAMPING_TX_HARDWARE,  /* %SOF_TIMESTAMPING_TX_HARDWARE */  	SOCK_TIMESTAMPING_TX_SOFTWARE,  /* %SOF_TIMESTAMPING_TX_SOFTWARE */  	SOCK_TIMESTAMPING_RX_HARDWARE,  /* %SOF_TIMESTAMPING_RX_HARDWARE */ @@ -658,6 +659,26 @@ static inline bool sock_flag(const struct sock *sk, enum sock_flags flag)  	return test_bit(flag, &sk->sk_flags);  } +#ifdef CONFIG_NET +extern struct static_key memalloc_socks; +static inline int sk_memalloc_socks(void) +{ +	return static_key_false(&memalloc_socks); +} +#else + +static inline int sk_memalloc_socks(void) +{ +	return 0; +} + +#endif + +static inline gfp_t sk_gfp_atomic(struct sock *sk, gfp_t gfp_mask) +{ +	return GFP_ATOMIC | (sk->sk_allocation & __GFP_MEMALLOC); +} +  static inline void sk_acceptq_removed(struct sock *sk)  {  	sk->sk_ack_backlog--; @@ -733,8 +754,13 @@ static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *s  	return 0;  } +extern int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb); +  static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)  { +	if (sk_memalloc_socks() && skb_pfmemalloc(skb)) +		return __sk_backlog_rcv(sk, skb); +  	return sk->sk_backlog_rcv(sk, skb);  } @@ -798,6 +824,8 @@ extern int sk_stream_wait_memory(struct sock *sk, long *timeo_p);  extern void sk_stream_wait_close(struct sock *sk, long timeo_p);  extern int sk_stream_error(struct sock *sk, int flags, int err);  extern void sk_stream_kill_queues(struct sock *sk); +extern void sk_set_memalloc(struct sock *sk); +extern void sk_clear_memalloc(struct sock *sk);  extern int sk_wait_data(struct sock *sk, long *timeo); @@ -913,7 +941,7 @@ struct proto {  #ifdef SOCK_REFCNT_DEBUG  	atomic_t		socks;  #endif -#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM +#ifdef CONFIG_MEMCG_KMEM  	/*  	 * cgroup specific init/deinit functions. Called once for all  	 * protocols that implement it, from cgroups populate function. @@ -994,7 +1022,7 @@ inline void sk_refcnt_debug_release(const struct sock *sk)  #define sk_refcnt_debug_release(sk) do { } while (0)  #endif /* SOCK_REFCNT_DEBUG */ -#if defined(CONFIG_CGROUP_MEM_RES_CTLR_KMEM) && defined(CONFIG_NET) +#if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_NET)  extern struct static_key memcg_socket_limit_enabled;  static inline struct cg_proto *parent_cg_proto(struct proto *proto,  					       struct cg_proto *cg_proto) @@ -1301,12 +1329,14 @@ static inline bool sk_wmem_schedule(struct sock *sk, int size)  		__sk_mem_schedule(sk, size, SK_MEM_SEND);  } -static inline bool sk_rmem_schedule(struct sock *sk, int size) +static inline bool +sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, unsigned int size)  {  	if (!sk_has_account(sk))  		return true; -	return size <= sk->sk_forward_alloc || -		__sk_mem_schedule(sk, size, SK_MEM_RECV); +	return size<= sk->sk_forward_alloc || +		__sk_mem_schedule(sk, size, SK_MEM_RECV) || +		skb_pfmemalloc(skb);  }  static inline void sk_mem_reclaim(struct sock *sk)  |