Whamcloud - gitweb
- configurable stack size fo x86_64
[fs/lustre-release.git] / lustre / kernel_patches / patches / kmem_cache_validate_2.4.20-rh.patch
1
2
3
4  arch/i386/mm/init.c  |    6 +++++
5  arch/ia64/mm/init.c  |    6 +++++
6  include/linux/slab.h |    1 
7  kernel/ksyms.c       |    1 
8  mm/slab.c            |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++
9  5 files changed, 67 insertions(+)
10
11 --- rh-2.4.20/arch/i386/mm/init.c~kmem_cache_validate_2.4.20-rh 2003-04-11 14:05:09.000000000 +0800
12 +++ rh-2.4.20-root/arch/i386/mm/init.c  2003-04-13 10:51:58.000000000 +0800
13 @@ -43,6 +43,12 @@ unsigned long highstart_pfn, highend_pfn
14  static unsigned long totalram_pages;
15  static unsigned long totalhigh_pages;
16  
17 +struct page *check_get_page(unsigned long kaddr)
18 +{
19 +#warning FIXME: Lustre team, is this solid?
20 +       return virt_to_page(kaddr);
21 +}
22 +
23  int do_check_pgt_cache(int low, int high)
24  {
25         return 0;       /* FIXME! */
26 --- rh-2.4.20/arch/ia64/mm/init.c~kmem_cache_validate_2.4.20-rh 2003-04-11 14:04:43.000000000 +0800
27 +++ rh-2.4.20-root/arch/ia64/mm/init.c  2003-04-13 10:51:58.000000000 +0800
28 @@ -45,6 +45,12 @@ unsigned long vmalloc_end = VMALLOC_END_
29  static struct page *vmem_map;
30  static unsigned long num_dma_physpages;
31  
32 +struct page *check_get_page(unsigned long kaddr)
33 +{
34 +#warning FIXME: Lustre team, is this solid?
35 +       return virt_to_page(kaddr);
36 +}
37 +
38  int
39  do_check_pgt_cache (int low, int high)
40  {
41 --- rh-2.4.20/include/linux/slab.h~kmem_cache_validate_2.4.20-rh        2003-04-12 15:46:39.000000000 +0800
42 +++ rh-2.4.20-root/include/linux/slab.h 2003-04-13 10:53:00.000000000 +0800
43 @@ -57,6 +57,7 @@ extern int kmem_cache_destroy(kmem_cache
44  extern int kmem_cache_shrink(kmem_cache_t *);
45  extern void *kmem_cache_alloc(kmem_cache_t *, int);
46  extern void kmem_cache_free(kmem_cache_t *, void *);
47 +extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp);
48  extern unsigned int kmem_cache_size(kmem_cache_t *);
49  
50  extern void *kmalloc(size_t, int);
51 --- rh-2.4.20/kernel/ksyms.c~kmem_cache_validate_2.4.20-rh      2003-04-12 16:15:26.000000000 +0800
52 +++ rh-2.4.20-root/kernel/ksyms.c       2003-04-13 10:54:10.000000000 +0800
53 @@ -123,6 +123,7 @@ EXPORT_SYMBOL(kmem_cache_destroy);
54  EXPORT_SYMBOL(kmem_cache_shrink);
55  EXPORT_SYMBOL(kmem_cache_alloc);
56  EXPORT_SYMBOL(kmem_cache_free);
57 +EXPORT_SYMBOL(kmem_cache_validate);
58  EXPORT_SYMBOL(kmem_cache_size);
59  EXPORT_SYMBOL(kmalloc);
60  EXPORT_SYMBOL(kfree);
61 --- rh-2.4.20/mm/slab.c~kmem_cache_validate_2.4.20-rh   2003-04-11 14:04:56.000000000 +0800
62 +++ rh-2.4.20-root/mm/slab.c    2003-04-13 10:51:58.000000000 +0800
63 @@ -1208,6 +1208,59 @@ failed:
64   * Called with the cache-lock held.
65   */
66  
67 +extern struct page *check_get_page(unsigned long kaddr);
68 +struct page *page_mem_map(struct page *page);
69 +static int kmem_check_cache_obj (kmem_cache_t * cachep,
70 +                                slab_t *slabp, void * objp)
71 +{
72 +       int i;
73 +       unsigned int objnr;
74 +
75 +#if DEBUG
76 +       if (cachep->flags & SLAB_RED_ZONE) {
77 +               objp -= BYTES_PER_WORD;
78 +               if ( *(unsigned long *)objp != RED_MAGIC2)
79 +                       /* Either write before start, or a double free. */
80 +                       return 0;
81 +               if (*(unsigned long *)(objp+cachep->objsize -
82 +                               BYTES_PER_WORD) != RED_MAGIC2)
83 +                       /* Either write past end, or a double free. */
84 +                       return 0;
85 +       }
86 +#endif
87 +
88 +       objnr = (objp-slabp->s_mem)/cachep->objsize;
89 +       if (objnr >= cachep->num)
90 +               return 0;
91 +       if (objp != slabp->s_mem + objnr*cachep->objsize)
92 +               return 0;
93 +
94 +       /* Check slab's freelist to see if this obj is there. */
95 +       for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) {
96 +               if (i == objnr)
97 +                       return 0;
98 +       }
99 +       return 1;
100 +}
101 +
102 +
103 +int kmem_cache_validate(kmem_cache_t *cachep, void *objp)
104 +{
105 +       struct page *page = check_get_page((unsigned long)objp);
106 +
107 +       if (!VALID_PAGE(page))
108 +               return 0;
109 +
110 +       if (!PageSlab(page))
111 +               return 0;
112 +
113 +       /* XXX check for freed slab objects ? */
114 +       if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp))
115 +               return 0;
116 +
117 +       return (cachep == GET_PAGE_CACHE(page));
118 +}
119 +
120  #if DEBUG
121  static int kmem_extra_free_checks (kmem_cache_t * cachep,
122                         slab_t *slabp, void * objp)
123
124 _