Ejemplo n.º 1
0
static int ipv4_tcp_mem(struct ctl_table *ctl, int write,
			   void __user *buffer, size_t *lenp,
			   loff_t *ppos)
{
	int ret;
	unsigned long vec[3];
	struct net *net = current->nsproxy->net_ns;
#ifdef CONFIG_MEMCG_KMEM
	struct mem_cgroup *memcg;
#endif

	struct ctl_table tmp = {
		.data = &vec,
		.maxlen = sizeof(vec),
		.mode = ctl->mode,
	};

	if (!write) {
		ctl->data = &net->ipv4.sysctl_tcp_mem;
		return proc_doulongvec_minmax(ctl, write, buffer, lenp, ppos);
	}

	ret = proc_doulongvec_minmax(&tmp, write, buffer, lenp, ppos);
	if (ret)
		return ret;

#ifdef CONFIG_MEMCG_KMEM
	rcu_read_lock();
	memcg = mem_cgroup_from_task(current);

	tcp_prot_mem(memcg, vec[0], 0);
	tcp_prot_mem(memcg, vec[1], 1);
	tcp_prot_mem(memcg, vec[2], 2);
	rcu_read_unlock();
#endif

	net->ipv4.sysctl_tcp_mem[0] = vec[0];
	net->ipv4.sysctl_tcp_mem[1] = vec[1];
	net->ipv4.sysctl_tcp_mem[2] = vec[2];

	return 0;
}

static int proc_tcp_fastopen_key(struct ctl_table *ctl, int write,
				 void __user *buffer, size_t *lenp,
				 loff_t *ppos)
{
	struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) };
	struct tcp_fastopen_context *ctxt;
	int ret;
	u32  user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */

	tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL);
	if (!tbl.data)
		return -ENOMEM;

	rcu_read_lock();
	ctxt = rcu_dereference(tcp_fastopen_ctx);
	if (ctxt)
		memcpy(user_key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH);
	else
		memset(user_key, 0, sizeof(user_key));
	rcu_read_unlock();

	snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x",
		user_key[0], user_key[1], user_key[2], user_key[3]);
	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);

	if (write && ret == 0) {
		if (sscanf(tbl.data, "%x-%x-%x-%x", user_key, user_key + 1,
			   user_key + 2, user_key + 3) != 4) {
			ret = -EINVAL;
			goto bad_key;
		}
		tcp_fastopen_reset_cipher(user_key, TCP_FASTOPEN_KEY_LENGTH);
	}

bad_key:
	pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n",
	       user_key[0], user_key[1], user_key[2], user_key[3],
	       (char *)tbl.data, ret);
	kfree(tbl.data);
	return ret;
}

static struct ctl_table ipv4_table[] = {
	{
		.procname	= "tcp_timestamps",
		.data		= &sysctl_tcp_timestamps,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_dointvec
	},
	{
		.procname	= "tcp_window_scaling",
		.data		= &sysctl_tcp_window_scaling,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_dointvec
	},
	{
		.procname	= "tcp_sack",
Ejemplo n.º 2
0
static int meminfo_proc_show(struct seq_file *m, void *v)
{
    struct sysinfo i;
    unsigned long committed;
    unsigned long allowed;
    struct vmalloc_info vmi;
    long cached;
    unsigned long pages[NR_LRU_LISTS];
    int lru;
    bool instance_view = false;
    struct mem_cgroup *memcg = NULL;

    if (in_noninit_pid_ns(current->nsproxy->pid_ns) &&
            !mem_cgroup_disabled()) {
        instance_view = true;
        memcg = mem_cgroup_from_task(current);
    }

    /*
     * display in kilobytes.
     */
#define K(x) ((x) << (PAGE_SHIFT - 10))
    if (!instance_view) {
        si_meminfo(&i);
        si_swapinfo(&i);
        cached = global_page_state(NR_FILE_PAGES) -
                 total_swapcache_pages - i.bufferram;
        if (cached < 0)
            cached = 0;
        for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
            pages[lru] = global_page_state(NR_LRU_BASE + lru);
    } else {
        cgroup_mem_sw_info(&i, memcg, &cached, pages);
    }
    committed = percpu_counter_read_positive(&vm_committed_as);
    allowed = ((totalram_pages - hugetlb_total_pages())
               * sysctl_overcommit_ratio / 100) + total_swap_pages;

    get_vmalloc_info(&vmi);


    /*
     * Tagged format, for easy grepping and expansion.
     */
    seq_printf(m,
               "MemTotal:       %8lu kB\n"
               "MemFree:        %8lu kB\n"
               "Buffers:        %8lu kB\n"
               "Cached:         %8lu kB\n"
               "SwapCached:     %8lu kB\n"
               "Active:         %8lu kB\n"
               "Inactive:       %8lu kB\n"
               "Active(anon):   %8lu kB\n"
               "Inactive(anon): %8lu kB\n"
               "Active(file):   %8lu kB\n"
               "Inactive(file): %8lu kB\n"
               "Unevictable:    %8lu kB\n"
               "Mlocked:        %8lu kB\n"
#ifdef CONFIG_HIGHMEM
               "HighTotal:      %8lu kB\n"
               "HighFree:       %8lu kB\n"
               "LowTotal:       %8lu kB\n"
               "LowFree:        %8lu kB\n"
#endif
#ifndef CONFIG_MMU
               "MmapCopy:       %8lu kB\n"
#endif
               "SwapTotal:      %8lu kB\n"
               "SwapFree:       %8lu kB\n"
               "Dirty:          %8lu kB\n"
               "Writeback:      %8lu kB\n"
               "AnonPages:      %8lu kB\n"
               "Mapped:         %8lu kB\n"
               "Shmem:          %8lu kB\n"
               "Slab:           %8lu kB\n"
               "SReclaimable:   %8lu kB\n"
               "SUnreclaim:     %8lu kB\n"
               "KernelStack:    %8lu kB\n"
               "PageTables:     %8lu kB\n"
#ifdef CONFIG_QUICKLIST
               "Quicklists:     %8lu kB\n"
#endif
               "NFS_Unstable:   %8lu kB\n"
               "Bounce:         %8lu kB\n"
               "WritebackTmp:   %8lu kB\n"
               "CommitLimit:    %8lu kB\n"
               "Committed_AS:   %8lu kB\n"
               "VmallocTotal:   %8lu kB\n"
               "VmallocUsed:    %8lu kB\n"
               "VmallocChunk:   %8lu kB\n"
#ifdef CONFIG_MEMORY_FAILURE
               "HardwareCorrupted: %5lu kB\n"
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
               "AnonHugePages:  %8lu kB\n"
#endif
               ,
               K(i.totalram),
               K(i.freeram),
               K(i.bufferram),
               K(cached),
               K(total_swapcache_pages),
               K(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE]),
               K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
               K(pages[LRU_ACTIVE_ANON]),
               K(pages[LRU_INACTIVE_ANON]),
               K(pages[LRU_ACTIVE_FILE]),
               K(pages[LRU_INACTIVE_FILE]),
               K(pages[LRU_UNEVICTABLE]),
               K(global_page_state(NR_MLOCK)),
#ifdef CONFIG_HIGHMEM
               K(i.totalhigh),
               K(i.freehigh),
               K(i.totalram-i.totalhigh),
               K(i.freeram-i.freehigh),
#endif
#ifndef CONFIG_MMU
               K((unsigned long) atomic_long_read(&mmap_pages_allocated)),
#endif
               K(i.totalswap),
               K(i.freeswap),
               K(global_page_state(NR_FILE_DIRTY)),
               K(global_page_state(NR_WRITEBACK)),
               K(global_page_state(NR_ANON_PAGES)
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
                 + global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) *
                 HPAGE_PMD_NR
#endif
                ),
               K(global_page_state(NR_FILE_MAPPED)),
               K(global_page_state(NR_SHMEM)),
               K(global_page_state(NR_SLAB_RECLAIMABLE) +
                 global_page_state(NR_SLAB_UNRECLAIMABLE)),
               K(global_page_state(NR_SLAB_RECLAIMABLE)),
               K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
               global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024,
               K(global_page_state(NR_PAGETABLE)),
#ifdef CONFIG_QUICKLIST
               K(quicklist_total_size()),
#endif
               K(global_page_state(NR_UNSTABLE_NFS)),
               K(global_page_state(NR_BOUNCE)),
               K(global_page_state(NR_WRITEBACK_TEMP)),
               K(allowed),
               K(committed),
               (unsigned long)VMALLOC_TOTAL >> 10,
               vmi.used >> 10,
               vmi.largest_chunk >> 10
#ifdef CONFIG_MEMORY_FAILURE
               ,atomic_long_read(&mce_bad_pages) << (PAGE_SHIFT - 10)
#endif
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
               ,K(global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) *
                  HPAGE_PMD_NR)
#endif
              );

    hugetlb_report_meminfo(m);

    arch_report_meminfo(m);

    return 0;
#undef K
}