lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <fe7a4739-556f-69b1-fe30-f4b6e1b31e64@yandex-team.ru>
Date:   Thu, 20 Jun 2019 15:40:16 +0300
From:   Konstantin Khlebnikov <khlebnikov@...dex-team.ru>
To:     Vlastimil Babka <vbabka@...e.cz>, linux-mm@...ck.org,
        linux-kernel@...r.kernel.org, netdev@...r.kernel.org
Subject: Re: [PATCH RFC] proc/meminfo: add NetBuffers counter for socket
 buffers

On 20.06.2019 15:03, Vlastimil Babka wrote:
> On 5/15/19 1:55 PM, Konstantin Khlebnikov wrote:
>> Socket buffers always were dark-matter that lives by its own rules.
> 
> Is the information even exported somewhere e.g. in sysfs or via netlink yet?

in /proc/self/net/protocols

protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re sp bi br ha uh gp em
PACKET    1408      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
PINGv6    1088      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAWv6     1088      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
UDPLITEv6 1080      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  y  n
UDPv6     1080     21     111   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  n  n  y  y  y  y  n
TCPv6     2048  49297  442697   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
UNIX      1024    158      -1   NI       0   yes  kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
UDP-Lite   920      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  n  y  y  y  y  n
PING       880      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAW        888      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
UDP        920      0     111   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  y  n  y  y  y  y  n
TCP       1888      0  442697   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
NETLINK   1040      1      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n

column 'sockets' is virtualized, while 'memory' is not

> 
>> This patch adds line NetBuffers that exposes most common kinds of them.
> 
> Did you encounter a situation where the number was significant and this
> would help finding out why memory is occupied?

Might be. In example above tcp buffers are 1,7G.
This is real server, with 0.5T ram though.

> 
>> TCP and UDP are most important species.
>> SCTP is added as example of modular protocol.
>> UNIX have no memory counter for now, should be easy to add.
>>
>> Signed-off-by: Konstantin Khlebnikov <khlebnikov@...dex-team.ru>
> 
> Right now it's a sum of a few values, which should be fine wrt
> /proc/meminfo overhead. But I guess netdev guys should have a say in
> this. Also you should update the corresponding Documentation/ file.

Later I send another proposal: even bigger sum - "MemKernel".
https://lore.kernel.org/linux-mm/155853600919.381.8172097084053782598.stgit@buzz/
Which gives estimation for all kinds of 'kernel' memory. It seems more useful for me.

> 
> Thanks,
> Vlastimil
> 
>> ---
>>   fs/proc/meminfo.c  |    5 ++++-
>>   include/linux/mm.h |    6 ++++++
>>   mm/page_alloc.c    |    3 ++-
>>   net/core/sock.c    |   20 ++++++++++++++++++++
>>   net/sctp/socket.c  |    2 +-
>>   5 files changed, 33 insertions(+), 3 deletions(-)
>>
>> diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
>> index 7bc14716fc5d..0ee2300a916d 100644
>> --- a/fs/proc/meminfo.c
>> +++ b/fs/proc/meminfo.c
>> @@ -41,6 +41,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
>>   	unsigned long sreclaimable, sunreclaim, misc_reclaimable;
>>   	unsigned long kernel_stack_kb, page_tables, percpu_pages;
>>   	unsigned long anon_pages, file_pages, swap_cached;
>> +	unsigned long net_buffers;
>>   	long kernel_misc;
>>   	int lru;
>>   
>> @@ -66,12 +67,13 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
>>   	kernel_stack_kb = global_zone_page_state(NR_KERNEL_STACK_KB);
>>   	page_tables = global_zone_page_state(NR_PAGETABLE);
>>   	percpu_pages = pcpu_nr_pages();
>> +	net_buffers = total_netbuffer_pages();
>>   
>>   	/* all other kinds of kernel memory allocations */
>>   	kernel_misc = i.totalram - i.freeram - anon_pages - file_pages
>>   		      - sreclaimable - sunreclaim - misc_reclaimable
>>   		      - (kernel_stack_kb >> (PAGE_SHIFT - 10))
>> -		      - page_tables - percpu_pages;
>> +		      - page_tables - percpu_pages - net_buffers;
>>   	if (kernel_misc < 0)
>>   		kernel_misc = 0;
>>   
>> @@ -137,6 +139,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
>>   	show_val_kb(m, "VmallocUsed:    ", 0ul);
>>   	show_val_kb(m, "VmallocChunk:   ", 0ul);
>>   	show_val_kb(m, "Percpu:         ", percpu_pages);
>> +	show_val_kb(m, "NetBuffers:     ", net_buffers);
>>   	show_val_kb(m, "KernelMisc:     ", kernel_misc);
>>   
>>   #ifdef CONFIG_MEMORY_FAILURE
>> diff --git a/include/linux/mm.h b/include/linux/mm.h
>> index 0e8834ac32b7..d0a58355bfb7 100644
>> --- a/include/linux/mm.h
>> +++ b/include/linux/mm.h
>> @@ -2254,6 +2254,12 @@ extern void si_meminfo_node(struct sysinfo *val, int nid);
>>   extern unsigned long arch_reserved_kernel_pages(void);
>>   #endif
>>   
>> +#ifdef CONFIG_NET
>> +extern unsigned long total_netbuffer_pages(void);
>> +#else
>> +static inline unsigned long total_netbuffer_pages(void) { return 0; }
>> +#endif
>> +
>>   extern __printf(3, 4)
>>   void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...);
>>   
>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>> index 3b13d3914176..fcdd7c6e72b9 100644
>> --- a/mm/page_alloc.c
>> +++ b/mm/page_alloc.c
>> @@ -5166,7 +5166,7 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
>>   		" active_file:%lu inactive_file:%lu isolated_file:%lu\n"
>>   		" unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n"
>>   		" slab_reclaimable:%lu slab_unreclaimable:%lu\n"
>> -		" mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n"
>> +		" mapped:%lu shmem:%lu pagetables:%lu bounce:%lu net_buffers:%lu\n"
>>   		" free:%lu free_pcp:%lu free_cma:%lu\n",
>>   		global_node_page_state(NR_ACTIVE_ANON),
>>   		global_node_page_state(NR_INACTIVE_ANON),
>> @@ -5184,6 +5184,7 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
>>   		global_node_page_state(NR_SHMEM),
>>   		global_zone_page_state(NR_PAGETABLE),
>>   		global_zone_page_state(NR_BOUNCE),
>> +		total_netbuffer_pages(),
>>   		global_zone_page_state(NR_FREE_PAGES),
>>   		free_pcp,
>>   		global_zone_page_state(NR_FREE_CMA_PAGES));
>> diff --git a/net/core/sock.c b/net/core/sock.c
>> index 75b1c950b49f..dfca4e024b74 100644
>> --- a/net/core/sock.c
>> +++ b/net/core/sock.c
>> @@ -142,6 +142,7 @@
>>   #include <trace/events/sock.h>
>>   
>>   #include <net/tcp.h>
>> +#include <net/udp.h>
>>   #include <net/busy_poll.h>
>>   
>>   static DEFINE_MUTEX(proto_list_mutex);
>> @@ -3573,3 +3574,22 @@ bool sk_busy_loop_end(void *p, unsigned long start_time)
>>   }
>>   EXPORT_SYMBOL(sk_busy_loop_end);
>>   #endif /* CONFIG_NET_RX_BUSY_POLL */
>> +
>> +#if IS_ENABLED(CONFIG_IP_SCTP)
>> +atomic_long_t sctp_memory_allocated;
>> +EXPORT_SYMBOL_GPL(sctp_memory_allocated);
>> +#endif
>> +
>> +unsigned long total_netbuffer_pages(void)
>> +{
>> +	unsigned long ret = 0;
>> +
>> +#if IS_ENABLED(CONFIG_IP_SCTP)
>> +	ret += atomic_long_read(&sctp_memory_allocated);
>> +#endif
>> +#ifdef CONFIG_INET
>> +	ret += atomic_long_read(&tcp_memory_allocated);
>> +	ret += atomic_long_read(&udp_memory_allocated);
>> +#endif
>> +	return ret;
>> +}
>> diff --git a/net/sctp/socket.c b/net/sctp/socket.c
>> index e4e892cc5644..9d11afdeeae4 100644
>> --- a/net/sctp/socket.c
>> +++ b/net/sctp/socket.c
>> @@ -107,7 +107,7 @@ static int sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
>>   			     enum sctp_socket_type type);
>>   
>>   static unsigned long sctp_memory_pressure;
>> -static atomic_long_t sctp_memory_allocated;
>> +extern atomic_long_t sctp_memory_allocated;
>>   struct percpu_counter sctp_sockets_allocated;
>>   
>>   static void sctp_enter_memory_pressure(struct sock *sk)
>>
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ