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