Home » Mailing lists » Devel » [PATCH] BC: resource beancounters (v2)
[PATCH 5/6] BC: kernel memory accounting (core) [message #5547 is a reply to message #5542] |
Wed, 23 August 2006 11:04   |
dev
Messages: 1693 Registered: September 2005 Location: Moscow
|
Senior Member |

|
|
Introduce BC_KMEMSIZE resource which accounts kernel
objects allocated by task's request.
Reference to BC is kept on struct page or slab object.
For slabs each struct slab contains a set of pointers
corresponding objects are charged to.
Allocation charge rules:
1. Pages - if allocation is performed with __GFP_BC flag - page
is charged to current's exec_bc.
2. Slabs - kmem_cache may be created with SLAB_BC flag - in this
case each allocation is charged. Caches used by kmalloc are
created with SLAB_BC | SLAB_BC_NOCHARGE flags. In this case
only __GFP_BC allocations are charged.
Signed-off-by: Pavel Emelianov <xemul@sw.ru>
Signed-off-by: Kirill Korotaev <dev@sw.ru>
---
include/linux/gfp.h | 8 ++-
include/linux/mm.h | 6 ++
include/linux/slab.h | 4 +
include/linux/vmalloc.h | 1
include/bc/beancounter.h | 4 +
include/bc/kmem.h | 33 ++++++++++++
kernel/bc/Makefile | 1
kernel/bc/beancounter.c | 3 +
kernel/bc/kmem.c | 89 ++++++++++++++++++++++++++++++++++
mm/mempool.c | 2
mm/page_alloc.c | 11 ++++
mm/slab.c | 121 ++++++++++++++++++++++++++++++++++++++---------
mm/vmalloc.c | 6 ++
13 files changed, 264 insertions(+), 25 deletions(-)
--- ./include/linux/gfp.h.bckmem 2006-07-28 18:43:52.000000000 +0400
+++ ./include/linux/gfp.h 2006-07-31 16:32:22.000000000 +0400
@@ -46,8 +46,10 @@ struct vm_area_struct;
#define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */
#define __GFP_HARDWALL ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */
#define __GFP_THISNODE ((__force gfp_t)0x40000u)/* No fallback, no policies */
+#define __GFP_BC ((__force gfp_t)0x80000u) /* Charge allocation with BC */
+#define __GFP_BC_LIMIT ((__force gfp_t)0x100000u) /* Charge against BC limit */
-#define __GFP_BITS_SHIFT 20 /* Room for 20 __GFP_FOO bits */
+#define __GFP_BITS_SHIFT 21 /* Room for 21 __GFP_FOO bits */
#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
/* if you forget to add the bitmask here kernel will crash, period */
@@ -54,7 +56,8 @@ struct vm_area_struct;
#define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \
__GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \
__GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP| \
- __GFP_NOMEMALLOC|__GFP_HARDWALL|__GFP_THISNODE)
+ __GFP_NOMEMALLOC|__GFP_HARDWALL|__GFP_THISNODE| \
+ __GFP_BC|__GFP_BC_LIMIT)
/* This equals 0, but use constants in case they ever change */
#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH)
@@ -63,6 +66,7 @@ struct vm_area_struct;
#define GFP_NOIO (__GFP_WAIT)
#define GFP_NOFS (__GFP_WAIT | __GFP_IO)
#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS)
+#define GFP_KERNEL_BC (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_BC)
#define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL)
#define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \
__GFP_HIGHMEM)
--- ./include/linux/mm.h.bckmem 2006-07-28 18:43:52.000000000 +0400
+++ ./include/linux/mm.h 2006-07-31 17:50:29.000000000 +0400
@@ -267,8 +267,14 @@ struct page {
unsigned int gfp_mask;
unsigned long trace[8];
#endif
+#ifdef CONFIG_BEANCOUNTERS
+ union {
+ struct beancounter *page_bc;
+ } bc;
+#endif
};
+#define page_bc(page) ((page)->bc.page_bc)
#define page_private(page) ((page)->private)
#define set_page_private(page, v) ((page)->private = (v))
--- ./include/linux/slab.h.bckmem 2006-07-10 12:39:19.000000000 +0400
+++ ./include/linux/slab.h 2006-07-31 17:02:08.000000000 +0400
@@ -46,6 +46,8 @@ typedef struct kmem_cache kmem_cache_t;
#define SLAB_PANIC 0x00040000UL /* panic if kmem_cache_create() fails */
#define SLAB_DESTROY_BY_RCU 0x00080000UL /* defer freeing pages to RCU */
#define SLAB_MEM_SPREAD 0x00100000UL /* Spread some memory over cpuset */
+#define SLAB_BC 0x00200000UL /* Account with BC */
+#define SLAB_BC_NOCHARGE 0x00400000UL /* Explicit accounting */
/* flags passed to a constructor func */
#define SLAB_CTOR_CONSTRUCTOR 0x001UL /* if not set, then deconstructor */
@@ -265,6 +267,8 @@ extern kmem_cache_t *bio_cachep;
extern atomic_t slab_reclaim_pages;
+struct beancounter;
+struct beancounter **kmem_cache_bcp(kmem_cache_t *cachep, void *obj);
#endif /* __KERNEL__ */
#endif /* _LINUX_SLAB_H */
--- ./include/linux/vmalloc.h.bckmem 2006-07-17 17:01:12.000000000 +0400
+++ ./include/linux/vmalloc.h 2006-08-01 13:21:59.000000000 +0400
@@ -36,6 +36,7 @@ struct vm_struct {
* Highlevel APIs for driver use
*/
extern void *vmalloc(unsigned long size);
+extern void *vmalloc_bc(unsigned long size);
extern void *vmalloc_user(unsigned long size);
extern void *vmalloc_node(unsigned long size, int node);
extern void *vmalloc_exec(unsigned long size);
--- ./include/bc/beancounter.h.bckmem 2006-07-28 18:43:52.000000000 +0400
+++ ./include/bc/beancounter.h 2006-08-03 16:03:01.000000000 +0400
@@ -14,7 +14,9 @@
* Resource list.
*/
-#define BC_RESOURCES 0
+#define BC_KMEMSIZE 0
+
+#define BC_RESOURCES 1
struct resource_parm {
/*
--- ./include/bc/kmem.h.bckmem 2006-07-28 18:43:52.000000000 +0400
+++ ./include/bc/kmem.h 2006-07-31 17:37:05.000000000 +0400
@@ -0,0 +1,33 @@
+/*
+ * include/bc/kmem.h
+ *
+ * Copyright (C) 2006 OpenVZ. SWsoft Inc
+ *
+ */
+
+#ifndef __BC_KMEM_H_
+#define __BC_KMEM_H_
+
+#include <linux/config.h>
+
+/*
+ * BC_KMEMSIZE accounting
+ */
+
+struct mm_struct;
+struct page;
+struct beancounter;
+
+#ifdef CONFIG_BEANCOUNTERS
+int bc_page_charge(struct page *page, int order, gfp_t flags);
+void bc_page_uncharge(struct page *page, int order);
+
+int bc_slab_charge(kmem_cache_t *cachep, void *obj, gfp_t flags);
+void bc_slab_uncharge(kmem_cache_t *cachep, void *obj);
+#else
+#define bc_page_charge(pg, o, mask) (0)
+#define bc_page_uncharge(pg, o) do { } while (0)
+#define bc_slab_charge(cachep, o, f) (0)
+#define bc_slab_uncharge(cachep, o) do { } while (0)
+#endif
+#endif /* __BC_SLAB_H_ */
--- ./kernel/bc/Makefile.bcsys 2006-07-28 14:08:37.000000000 +0400
+++ ./kernel/bc/Makefile 2006-08-01 11:08:39.000000000 +0400
@@ -7,3 +7,4 @@
obj-$(CONFIG_BEANCOUNTERS) += beancounter.o
obj-$(CONFIG_BEANCOUNTERS) += misc.o
obj-$(CONFIG_BEANCOUNTERS) += sys.o
+obj-$(CONFIG_BEANCOUNTERS) += kmem.o
--- ./kernel/bc/beancounter.c.bckmem 2006-07-28 18:43:52.000000000 +0400
+++ ./kernel/bc/beancounter.c 2006-08-03 16:14:17.000000000 +0400
@@ -19,6 +19,7 @@ static void init_beancounter_struct(stru
struct beancounter init_bc;
const char *bc_rnames[] = {
+ "kmemsize", /* 0 */
};
#define bc_hash_fun(x) ((((x) >> 8) ^ (x)) & (BC_HASH_SIZE - 1))
@@ -348,6 +378,8 @@ static void init_beancounter_syslimits(s
{
int k;
+ bc->bc_parms[BC_KMEMSIZE].limit = 32 * 1024 * 1024;
+
for (k = 0; k < BC_RESOURCES; k++)
bc->bc_parms[k].barrier = bc->bc_parms[k].limit;
}
--- ./kernel/bc/kmem.c.bckmem 2006-07-31 16:32:22.000000000 +0400
+++ ./kernel/bc/kmem.c 2006-07-31 17:51:27.000000000 +0400
@@ -0,0 +1,89 @@
+/*
+ * kernel/bc/kmem.c
+ *
+ * Copyright (C) 2006 OpenVZ. SWsoft Inc
+ *
+ */
+
+#include <linux/sched.h>
+#include <linux/gfp.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+
+#include <bc/beancounter.h>
+#include <bc/kmem.h>
+#include <bc/task.h>
+
+/*
+ * Slab accounting
+ */
+
+int bc_slab_charge(kmem_cache_t *cachep, void *objp, gfp_t flags)
+{
+ unsigned int size;
+ struct beancounter *bc, **slab_bcp;
+
+ bc = get_exec_bc();
+ if (bc == NULL)
+ return 0;
+
+ size = kmem_cache_size(cachep);
+ if (bc_charge(bc, BC_KMEMSIZE, size,
+ (flags & __GFP_BC_LIMIT ? BC_LIMIT : BC_BARRIER)))
+ return -ENOMEM;
+
+ slab_bcp = kmem_cache_bcp(cachep, objp);
+ *slab_bcp = get_beancounter(bc);
+ return 0;
+}
+
+void bc_slab_uncharge(kmem_cache_t *cachep, void *objp)
+{
+ unsigned int size;
+ struct beancounter *bc, **slab_bcp;
+
+ slab_bcp = kmem_cache_bcp(cachep, objp);
+ if (*slab_bcp == NULL)
+ return;
+
+ bc = *slab_bcp;
+ size = kmem_cache_size(cachep);
+ bc_uncharge(bc, BC_KMEMSIZE, size);
+ put_beancounter(bc);
+ *slab_bcp = NULL;
+}
+
+/*
+ * Pages accounting
+ */
+
+int bc_page_charge(struct page *page, int order, gfp_t flags)
+{
+ struct beancounter *bc;
+
+ BUG_ON(page_bc(page) != NULL);
+
+ bc = get_exec_bc();
+ if (bc == NULL)
+ return 0;
+
+ if (bc_charge(bc, BC_KMEMSIZE, PAGE_SIZE << order,
+ (flags & __GFP_BC_LIMIT ? BC_LIMIT : BC_BARRIER)))
+ return -ENOMEM;
+
+ page_bc(page) = get_beancounter(bc);
+ return 0;
+}
+
+void bc_page_uncharge(struct page *page, int order)
+{
+ struct beancounter *bc;
+
+ bc = page_bc(page);
+ if (bc == NULL)
+ return;
+
+ bc_uncharge(bc, BC_KMEMSIZE, PAGE_SIZE << order);
+ put_beancounter(bc);
+ page_bc(page) = NULL;
+}
--- ./mm/mempool.c.bckmem 2006-04-21 11:59:36.000000000 +0400
+++ ./mm/mempool.c 2006-08-01 13:25:26.000000000 +0400
@@ -119,6 +119,7 @@ int mempool_resize(mempool_t *pool, int
unsigned long flags;
BUG_ON(new_min_nr <= 0);
+ gfp_mask &= ~__GFP_BC;
spin_lock_irqsave(&pool->lock, flags);
if (new_min_nr <= pool->min_nr) {
@@ -212,6 +213,7 @@ void * mempool_alloc(mempool_t *pool, gf
gfp_mask |= __GFP_NOMEMALLOC; /* don't allocate emergency reserves */
gfp_mask |= __GFP_NORETRY; /* don't loop in __alloc_pages */
gfp_mask |= __GFP_NOWARN; /* failures are OK */
+ gfp_mask &= ~__GFP_BC; /* do not charge */
gfp_temp = gfp_mask & ~(__GFP_WAIT|__GFP_IO);
--- ./mm/page_alloc.c.bckmem 2006-07-28 18:43:52.000000000 +0400
+++ ./mm/page_alloc.c 2006-07-31 19:52:08.000000000 +0400
@@ -38,6 +38,8 @@
#include <linux/mempolicy.h>
#include <linux/stop_machine.h>
+#include <bc/kmem.h>
+
#include <asm/tlbflush.h>
#include <asm/div64.h>
#include "internal.h"
@@ -453,6 +455,8 @@ static void __free_pages_ok(st
...
|
|
|
 |
|
[PATCH] BC: resource beancounters (v2)
By: dev on Wed, 23 August 2006 10:44
|
 |
|
[PATCH 1/6] BC: kconfig
By: dev on Wed, 23 August 2006 10:59
|
 |
|
Re: [PATCH 1/6] BC: kconfig
|
 |
|
Re: [PATCH 1/6] BC: kconfig
|
 |
|
Re: [PATCH 1/6] BC: kconfig
|
 |
|
Re: [PATCH 1/6] BC: kconfig
By: dev on Fri, 25 August 2006 11:27
|
 |
|
Re: [PATCH 1/6] BC: kconfig
By: dev on Fri, 25 August 2006 11:31
|
 |
|
Re: [PATCH 1/6] BC: kconfig
By: rdunlap on Wed, 23 August 2006 22:29
|
 |
|
Re: [PATCH 1/6] BC: kconfig
|
 |
|
Re: [PATCH 1/6] BC: kconfig
|
 |
|
Re: [ckrm-tech] [PATCH 1/6] BC: kconfig
By: dev on Thu, 24 August 2006 11:47
|
 |
|
Re: [ckrm-tech] [PATCH 1/6] BC: kconfig
|
 |
|
[PATCH 2/6] BC: beancounters core (API)
By: dev on Wed, 23 August 2006 11:00
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
By: dev on Wed, 23 August 2006 13:25
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
By: dev on Wed, 23 August 2006 13:46
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
By: dev on Thu, 24 August 2006 12:03
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
By: dev on Fri, 25 August 2006 10:51
|
 |
|
Re: [PATCH 2/6] BC: beancounters core (API)
|
 |
|
[PATCH 3/6] BC: context inheriting and changing
By: dev on Wed, 23 August 2006 11:02
|
 |
|
[PATCH 4/6] BC: user interface (syscalls)
By: dev on Wed, 23 August 2006 11:03
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
By: dev on Wed, 23 August 2006 13:40
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
By: Alan Cox on Wed, 23 August 2006 17:08
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
By: Alan Cox on Thu, 24 August 2006 10:42
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
By: dev on Fri, 25 August 2006 10:54
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
|
 |
|
Re: [PATCH 4/6] BC: user interface (syscalls)
|
 |
|
[PATCH 5/6] BC: kernel memory accounting (core)
By: dev on Wed, 23 August 2006 11:04
|
 |
|
Re: [PATCH 5/6] BC: kernel memory accounting (core)
|
 |
|
Re: [PATCH 5/6] BC: kernel memory accounting (core)
|
 |
|
Re: [PATCH 5/6] BC: kernel memory accounting (core)
By: dev on Fri, 25 August 2006 10:06
|
 |
|
[PATCH 6/6] BC: kernel memory accounting (marks)
By: dev on Wed, 23 August 2006 11:05
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
By: dev on Tue, 29 August 2006 09:52
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
By: dev on Tue, 29 August 2006 14:34
|
 |
|
Re: [PATCH 6/6] BC: kernel memory accounting (marks)
By: dev on Tue, 29 August 2006 15:53
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
By: dev on Fri, 25 August 2006 11:47
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
By: dev on Mon, 28 August 2006 08:27
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: BC: resource beancounters (v2)
|
 |
|
Re: BC: resource beancounters (v2)
|
 |
|
Re: BC: resource beancounters (v2)
|
 |
|
Re: BC: resource beancounters (v2)
|
 |
|
Re: BC: resource beancounters (v2)
By: Alan Cox on Sat, 26 August 2006 16:16
|
 |
|
Re: BC: resource beancounters (v2)
|
 |
|
Re: Re: BC: resource beancounters (v2)
By: kir on Mon, 28 August 2006 17:40
|
 |
|
Re: Re: BC: resource beancounters (v2)
|
 |
|
Re: Re: BC: resource beancounters (v2)
By: Alan Cox on Tue, 29 August 2006 10:15
|
 |
|
Re: Re: BC: resource beancounters (v2)
|
 |
|
Re: Re: BC: resource beancounters (v2)
By: Alan Cox on Tue, 29 August 2006 18:46
|
 |
|
Re: Re: BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
By: dev on Tue, 29 August 2006 15:33
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
By: Alan Cox on Thu, 24 August 2006 10:38
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
By: Alan Cox on Fri, 25 August 2006 15:36
|
 |
|
Re: [PATCH] BC: resource beancounters (v2)
|
Goto Forum:
Current Time: Sat Jul 12 05:28:46 GMT 2025
Total time taken to generate the page: 0.01627 seconds
|