--- zzzz-none-000/linux-4.4.60/mm/slub.c 2017-04-08 07:53:53.000000000 +0000 +++ honeybee-1240e-714/linux-4.4.60/mm/slub.c 2019-07-03 09:21:34.000000000 +0000 @@ -198,7 +198,7 @@ enum track_item { TRACK_ALLOC, TRACK_FREE }; -#ifdef CONFIG_SYSFS +#ifdef SLAB_SUPPORTS_SYSFS static int sysfs_slab_add(struct kmem_cache *); static int sysfs_slab_alias(struct kmem_cache *, const char *); static void memcg_propagate_slab_attrs(struct kmem_cache *s); @@ -2200,7 +2200,7 @@ } #endif /* CONFIG_SLUB_DEBUG */ -#if defined(CONFIG_SLUB_DEBUG) || defined(CONFIG_SYSFS) +#if defined(CONFIG_SLUB_DEBUG) || defined(SLAB_SUPPORTS_SYSFS) static unsigned long count_partial(struct kmem_cache_node *n, int (*get_count)(struct page *)) { @@ -2214,7 +2214,7 @@ spin_unlock_irqrestore(&n->list_lock, flags); return x; } -#endif /* CONFIG_SLUB_DEBUG || CONFIG_SYSFS */ +#endif /* CONFIG_SLUB_DEBUG || SLAB_SUPPORTS_SYSFS */ static noinline void slab_out_of_memory(struct kmem_cache *s, gfp_t gfpflags, int nid) @@ -4072,7 +4072,7 @@ } #endif -#ifdef CONFIG_SYSFS +#ifdef SLAB_SUPPORTS_SYSFS static int count_inuse(struct page *page) { return page->inuse; @@ -4082,9 +4082,7 @@ { return page->objects; } -#endif -#ifdef CONFIG_SLUB_DEBUG static int validate_slab(struct kmem_cache *s, struct page *page, unsigned long *map) { @@ -4451,12 +4449,12 @@ validate_slab_cache(kmalloc_caches[9]); } #else -#ifdef CONFIG_SYSFS +#ifdef SLAB_SUPPORTS_SYSFS static void resiliency_test(void) {}; #endif #endif -#ifdef CONFIG_SYSFS +#ifdef SLAB_SUPPORTS_SYSFS enum slab_stat_type { SL_ALL, /* All slabs */ SL_PARTIAL, /* Only partially allocated slabs */ @@ -5517,7 +5515,7 @@ } __initcall(slab_sysfs_init); -#endif /* CONFIG_SYSFS */ +#endif /* SLAB_SUPPORTS_SYSFS */ /* * The /proc/slabinfo ABI @@ -5555,3 +5553,44 @@ return -EIO; } #endif /* CONFIG_SLABINFO */ + +#if defined(CONFIG_AVM_ENHANCED) +/** + * @brief get kmemalloc-area if addr in range + * attention! function unsaved for cachep - zone-page-spinlock necessary + * @return start (zero if not exist) + */ +unsigned long get_kmemalloc_area(unsigned long addr, unsigned long *caller, const char **cache_name, + unsigned long *size, int *freed){ + unsigned int obj_idx; + void *base; + unsigned long kstart; + struct kmem_cache *cachep; + struct page *page = virt_to_head_page((void *)addr); + + if(!virt_addr_valid(page)) { + return 0; + } + cachep = page->slab_cache; + if(!virt_addr_valid(cachep)) { + return 0; + } +#if 0 + pr_err("%s: %s: %u: %08lx: %s(size=%u objects=%u) page=%p(%p)\n", __FILE__, __func__, __LINE__, addr, cachep->name, + cachep->size, page->objects, + page, page_address(page)); +#endif + base = page_address(page); + if(((void *)addr < base) || ((void *)addr >= (base + page->objects * cachep->size))) { + /*--- pr_err("%s: %s: %u:\n", __FILE__, __func__, __LINE__); ---*/ + return 0; + } + obj_idx = slab_index((void *)addr, cachep, base); + kstart = (unsigned long)base + (cachep->size * obj_idx); + if(caller) *caller = 0; + if(cache_name) *cache_name = cachep->name; + if(size) *size = cachep->size; + if(freed) *freed = 0; + return kstart; +} +#endif /*--- #if defined(CONFIG_AVM_ENHANCED) ---*/