* [mmotm:master 45/283] mm/kasan/common.c:238:7: error: 'struct kmem_cache' has no member named 'kasan_info'
@ 2018-12-05 7:08 kbuild test robot
2018-12-06 10:18 ` Andrey Konovalov
0 siblings, 1 reply; 2+ messages in thread
From: kbuild test robot @ 2018-12-05 7:08 UTC (permalink / raw)
To: Andrey Konovalov
Cc: kbuild-all, Johannes Weiner, Andrey Ryabinin, Dmitry Vyukov,
Andrew Morton, Linux Memory Management List
[-- Attachment #1: Type: text/plain, Size: 14147 bytes --]
Hi Andrey,
First bad commit (maybe != root cause):
tree: git://git.cmpxchg.org/linux-mmotm.git master
head: 1b1ce5151f3dd9a5bc989207ac56e96dcb84bef4
commit: 60e8d1374609a0f5846f0c8ac1c7907501b58c7e [45/283] kasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS
config: x86_64-randconfig-x007-12051024 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
git checkout 60e8d1374609a0f5846f0c8ac1c7907501b58c7e
# save the attached .config to linux build tree
make ARCH=x86_64
All error/warnings (new ones prefixed by >>):
mm/kasan/common.c: In function 'kasan_cache_create':
>> mm/kasan/common.c:238:7: error: 'struct kmem_cache' has no member named 'kasan_info'
cache->kasan_info.alloc_meta_offset = *size;
^~
mm/kasan/common.c:244:8: error: 'struct kmem_cache' has no member named 'kasan_info'
cache->kasan_info.free_meta_offset = *size;
^~
mm/kasan/common.c:260:20: error: 'struct kmem_cache' has no member named 'kasan_info'
if (*size <= cache->kasan_info.alloc_meta_offset ||
^~
mm/kasan/common.c:261:18: error: 'struct kmem_cache' has no member named 'kasan_info'
*size <= cache->kasan_info.free_meta_offset) {
^~
mm/kasan/common.c:262:8: error: 'struct kmem_cache' has no member named 'kasan_info'
cache->kasan_info.alloc_meta_offset = 0;
^~
mm/kasan/common.c:263:8: error: 'struct kmem_cache' has no member named 'kasan_info'
cache->kasan_info.free_meta_offset = 0;
^~
mm/kasan/common.c: In function 'kasan_metadata_size':
mm/kasan/common.c:273:15: error: 'struct kmem_cache' has no member named 'kasan_info'
return (cache->kasan_info.alloc_meta_offset ?
^~
mm/kasan/common.c:275:9: error: 'struct kmem_cache' has no member named 'kasan_info'
(cache->kasan_info.free_meta_offset ?
^~
mm/kasan/common.c: In function 'get_alloc_info':
mm/kasan/common.c:283:31: error: 'struct kmem_cache' has no member named 'kasan_info'
return (void *)object + cache->kasan_info.alloc_meta_offset;
^~
mm/kasan/common.c: In function 'get_free_info':
mm/kasan/common.c:290:31: error: 'struct kmem_cache' has no member named 'kasan_info'
return (void *)object + cache->kasan_info.free_meta_offset;
^~
In file included from include/linux/export.h:45:0,
from mm/kasan/common.c:16:
mm/kasan/common.c: In function '__kasan_slab_free':
>> mm/kasan/common.c:336:15: error: implicit declaration of function 'nearest_obj' [-Werror=implicit-function-declaration]
if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
^
include/linux/compiler.h:77:42: note: in definition of macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
>> mm/kasan/common.c:336:69: warning: comparison between pointer and integer
if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
^
include/linux/compiler.h:77:42: note: in definition of macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
mm/kasan/common.c: In function 'kasan_metadata_size':
>> mm/kasan/common.c:277:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
mm/kasan/common.c: In function 'get_alloc_info':
mm/kasan/common.c:284:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
mm/kasan/common.c: In function 'get_free_info':
mm/kasan/common.c:291:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cc1: some warnings being treated as errors
--
mm/kasan/report.c: In function 'print_address_description':
>> mm/kasan/report.c:261:18: error: implicit declaration of function 'nearest_obj' [-Werror=implicit-function-declaration]
void *object = nearest_obj(cache, page, addr);
^~~~~~~~~~~
>> mm/kasan/report.c:261:18: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
cc1: some warnings being treated as errors
vim +238 mm/kasan/common.c
6d7b7611 Andrey Konovalov 2018-11-29 230
6d7b7611 Andrey Konovalov 2018-11-29 231 void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
6d7b7611 Andrey Konovalov 2018-11-29 232 slab_flags_t *flags)
6d7b7611 Andrey Konovalov 2018-11-29 233 {
6d7b7611 Andrey Konovalov 2018-11-29 234 unsigned int orig_size = *size;
6d7b7611 Andrey Konovalov 2018-11-29 235 int redzone_adjust;
6d7b7611 Andrey Konovalov 2018-11-29 236
6d7b7611 Andrey Konovalov 2018-11-29 237 /* Add alloc meta. */
6d7b7611 Andrey Konovalov 2018-11-29 @238 cache->kasan_info.alloc_meta_offset = *size;
6d7b7611 Andrey Konovalov 2018-11-29 239 *size += sizeof(struct kasan_alloc_meta);
6d7b7611 Andrey Konovalov 2018-11-29 240
6d7b7611 Andrey Konovalov 2018-11-29 241 /* Add free meta. */
6d7b7611 Andrey Konovalov 2018-11-29 242 if (cache->flags & SLAB_TYPESAFE_BY_RCU || cache->ctor ||
6d7b7611 Andrey Konovalov 2018-11-29 243 cache->object_size < sizeof(struct kasan_free_meta)) {
6d7b7611 Andrey Konovalov 2018-11-29 244 cache->kasan_info.free_meta_offset = *size;
6d7b7611 Andrey Konovalov 2018-11-29 245 *size += sizeof(struct kasan_free_meta);
6d7b7611 Andrey Konovalov 2018-11-29 246 }
6d7b7611 Andrey Konovalov 2018-11-29 247 redzone_adjust = optimal_redzone(cache->object_size) -
6d7b7611 Andrey Konovalov 2018-11-29 248 (*size - cache->object_size);
6d7b7611 Andrey Konovalov 2018-11-29 249
6d7b7611 Andrey Konovalov 2018-11-29 250 if (redzone_adjust > 0)
6d7b7611 Andrey Konovalov 2018-11-29 251 *size += redzone_adjust;
6d7b7611 Andrey Konovalov 2018-11-29 252
6d7b7611 Andrey Konovalov 2018-11-29 253 *size = min_t(unsigned int, KMALLOC_MAX_SIZE,
6d7b7611 Andrey Konovalov 2018-11-29 254 max(*size, cache->object_size +
6d7b7611 Andrey Konovalov 2018-11-29 255 optimal_redzone(cache->object_size)));
6d7b7611 Andrey Konovalov 2018-11-29 256
6d7b7611 Andrey Konovalov 2018-11-29 257 /*
6d7b7611 Andrey Konovalov 2018-11-29 258 * If the metadata doesn't fit, don't enable KASAN at all.
6d7b7611 Andrey Konovalov 2018-11-29 259 */
6d7b7611 Andrey Konovalov 2018-11-29 260 if (*size <= cache->kasan_info.alloc_meta_offset ||
6d7b7611 Andrey Konovalov 2018-11-29 261 *size <= cache->kasan_info.free_meta_offset) {
6d7b7611 Andrey Konovalov 2018-11-29 262 cache->kasan_info.alloc_meta_offset = 0;
6d7b7611 Andrey Konovalov 2018-11-29 263 cache->kasan_info.free_meta_offset = 0;
6d7b7611 Andrey Konovalov 2018-11-29 264 *size = orig_size;
6d7b7611 Andrey Konovalov 2018-11-29 265 return;
6d7b7611 Andrey Konovalov 2018-11-29 266 }
6d7b7611 Andrey Konovalov 2018-11-29 267
6d7b7611 Andrey Konovalov 2018-11-29 268 *flags |= SLAB_KASAN;
6d7b7611 Andrey Konovalov 2018-11-29 269 }
6d7b7611 Andrey Konovalov 2018-11-29 270
6d7b7611 Andrey Konovalov 2018-11-29 271 size_t kasan_metadata_size(struct kmem_cache *cache)
6d7b7611 Andrey Konovalov 2018-11-29 272 {
6d7b7611 Andrey Konovalov 2018-11-29 273 return (cache->kasan_info.alloc_meta_offset ?
6d7b7611 Andrey Konovalov 2018-11-29 274 sizeof(struct kasan_alloc_meta) : 0) +
6d7b7611 Andrey Konovalov 2018-11-29 275 (cache->kasan_info.free_meta_offset ?
6d7b7611 Andrey Konovalov 2018-11-29 276 sizeof(struct kasan_free_meta) : 0);
6d7b7611 Andrey Konovalov 2018-11-29 @277 }
6d7b7611 Andrey Konovalov 2018-11-29 278
6d7b7611 Andrey Konovalov 2018-11-29 279 struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
6d7b7611 Andrey Konovalov 2018-11-29 280 const void *object)
6d7b7611 Andrey Konovalov 2018-11-29 281 {
6d7b7611 Andrey Konovalov 2018-11-29 282 BUILD_BUG_ON(sizeof(struct kasan_alloc_meta) > 32);
6d7b7611 Andrey Konovalov 2018-11-29 283 return (void *)object + cache->kasan_info.alloc_meta_offset;
6d7b7611 Andrey Konovalov 2018-11-29 284 }
6d7b7611 Andrey Konovalov 2018-11-29 285
6d7b7611 Andrey Konovalov 2018-11-29 286 struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
6d7b7611 Andrey Konovalov 2018-11-29 287 const void *object)
6d7b7611 Andrey Konovalov 2018-11-29 288 {
6d7b7611 Andrey Konovalov 2018-11-29 289 BUILD_BUG_ON(sizeof(struct kasan_free_meta) > 32);
6d7b7611 Andrey Konovalov 2018-11-29 @290 return (void *)object + cache->kasan_info.free_meta_offset;
6d7b7611 Andrey Konovalov 2018-11-29 291 }
6d7b7611 Andrey Konovalov 2018-11-29 292
6d7b7611 Andrey Konovalov 2018-11-29 293 void kasan_poison_slab(struct page *page)
6d7b7611 Andrey Konovalov 2018-11-29 294 {
6d7b7611 Andrey Konovalov 2018-11-29 295 kasan_poison_shadow(page_address(page),
6d7b7611 Andrey Konovalov 2018-11-29 296 PAGE_SIZE << compound_order(page),
6d7b7611 Andrey Konovalov 2018-11-29 297 KASAN_KMALLOC_REDZONE);
6d7b7611 Andrey Konovalov 2018-11-29 298 }
6d7b7611 Andrey Konovalov 2018-11-29 299
6d7b7611 Andrey Konovalov 2018-11-29 300 void kasan_unpoison_object_data(struct kmem_cache *cache, void *object)
6d7b7611 Andrey Konovalov 2018-11-29 301 {
6d7b7611 Andrey Konovalov 2018-11-29 302 kasan_unpoison_shadow(object, cache->object_size);
6d7b7611 Andrey Konovalov 2018-11-29 303 }
6d7b7611 Andrey Konovalov 2018-11-29 304
6d7b7611 Andrey Konovalov 2018-11-29 305 void kasan_poison_object_data(struct kmem_cache *cache, void *object)
6d7b7611 Andrey Konovalov 2018-11-29 306 {
6d7b7611 Andrey Konovalov 2018-11-29 307 kasan_poison_shadow(object,
6d7b7611 Andrey Konovalov 2018-11-29 308 round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE),
6d7b7611 Andrey Konovalov 2018-11-29 309 KASAN_KMALLOC_REDZONE);
6d7b7611 Andrey Konovalov 2018-11-29 310 }
6d7b7611 Andrey Konovalov 2018-11-29 311
6d7b7611 Andrey Konovalov 2018-11-29 312 void *kasan_init_slab_obj(struct kmem_cache *cache, const void *object)
6d7b7611 Andrey Konovalov 2018-11-29 313 {
6d7b7611 Andrey Konovalov 2018-11-29 314 struct kasan_alloc_meta *alloc_info;
6d7b7611 Andrey Konovalov 2018-11-29 315
6d7b7611 Andrey Konovalov 2018-11-29 316 if (!(cache->flags & SLAB_KASAN))
6d7b7611 Andrey Konovalov 2018-11-29 317 return (void *)object;
6d7b7611 Andrey Konovalov 2018-11-29 318
6d7b7611 Andrey Konovalov 2018-11-29 319 alloc_info = get_alloc_info(cache, object);
6d7b7611 Andrey Konovalov 2018-11-29 320 __memset(alloc_info, 0, sizeof(*alloc_info));
6d7b7611 Andrey Konovalov 2018-11-29 321
6d7b7611 Andrey Konovalov 2018-11-29 322 return (void *)object;
6d7b7611 Andrey Konovalov 2018-11-29 323 }
6d7b7611 Andrey Konovalov 2018-11-29 324
6d7b7611 Andrey Konovalov 2018-11-29 325 void *kasan_slab_alloc(struct kmem_cache *cache, void *object, gfp_t flags)
6d7b7611 Andrey Konovalov 2018-11-29 326 {
6d7b7611 Andrey Konovalov 2018-11-29 327 return kasan_kmalloc(cache, object, cache->object_size, flags);
6d7b7611 Andrey Konovalov 2018-11-29 328 }
6d7b7611 Andrey Konovalov 2018-11-29 329
6d7b7611 Andrey Konovalov 2018-11-29 330 static bool __kasan_slab_free(struct kmem_cache *cache, void *object,
6d7b7611 Andrey Konovalov 2018-11-29 331 unsigned long ip, bool quarantine)
6d7b7611 Andrey Konovalov 2018-11-29 332 {
6d7b7611 Andrey Konovalov 2018-11-29 333 s8 shadow_byte;
6d7b7611 Andrey Konovalov 2018-11-29 334 unsigned long rounded_up_size;
6d7b7611 Andrey Konovalov 2018-11-29 335
6d7b7611 Andrey Konovalov 2018-11-29 @336 if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
6d7b7611 Andrey Konovalov 2018-11-29 337 object)) {
6d7b7611 Andrey Konovalov 2018-11-29 338 kasan_report_invalid_free(object, ip);
6d7b7611 Andrey Konovalov 2018-11-29 339 return true;
6d7b7611 Andrey Konovalov 2018-11-29 340 }
6d7b7611 Andrey Konovalov 2018-11-29 341
6d7b7611 Andrey Konovalov 2018-11-29 342 /* RCU slabs could be legally used after free within the RCU period */
6d7b7611 Andrey Konovalov 2018-11-29 343 if (unlikely(cache->flags & SLAB_TYPESAFE_BY_RCU))
6d7b7611 Andrey Konovalov 2018-11-29 344 return false;
6d7b7611 Andrey Konovalov 2018-11-29 345
6d7b7611 Andrey Konovalov 2018-11-29 346 shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object));
6d7b7611 Andrey Konovalov 2018-11-29 347 if (shadow_byte < 0 || shadow_byte >= KASAN_SHADOW_SCALE_SIZE) {
6d7b7611 Andrey Konovalov 2018-11-29 348 kasan_report_invalid_free(object, ip);
6d7b7611 Andrey Konovalov 2018-11-29 349 return true;
6d7b7611 Andrey Konovalov 2018-11-29 350 }
6d7b7611 Andrey Konovalov 2018-11-29 351
6d7b7611 Andrey Konovalov 2018-11-29 352 rounded_up_size = round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE);
6d7b7611 Andrey Konovalov 2018-11-29 353 kasan_poison_shadow(object, rounded_up_size, KASAN_KMALLOC_FREE);
6d7b7611 Andrey Konovalov 2018-11-29 354
6d7b7611 Andrey Konovalov 2018-11-29 355 if (!quarantine || unlikely(!(cache->flags & SLAB_KASAN)))
6d7b7611 Andrey Konovalov 2018-11-29 356 return false;
6d7b7611 Andrey Konovalov 2018-11-29 357
6d7b7611 Andrey Konovalov 2018-11-29 358 set_track(&get_alloc_info(cache, object)->free_track, GFP_NOWAIT);
6d7b7611 Andrey Konovalov 2018-11-29 359 quarantine_put(get_free_info(cache, object), cache);
6d7b7611 Andrey Konovalov 2018-11-29 360 return true;
6d7b7611 Andrey Konovalov 2018-11-29 361 }
6d7b7611 Andrey Konovalov 2018-11-29 362
:::::: The code at line 238 was first introduced by commit
:::::: 6d7b7611ded2d230f527485d39a7e74958de415a kasan: move common generic and tag-based code to common.c
:::::: TO: Andrey Konovalov <andreyknvl@google.com>
:::::: CC: Johannes Weiner <hannes@cmpxchg.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 33587 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [mmotm:master 45/283] mm/kasan/common.c:238:7: error: 'struct kmem_cache' has no member named 'kasan_info'
2018-12-05 7:08 [mmotm:master 45/283] mm/kasan/common.c:238:7: error: 'struct kmem_cache' has no member named 'kasan_info' kbuild test robot
@ 2018-12-06 10:18 ` Andrey Konovalov
0 siblings, 0 replies; 2+ messages in thread
From: Andrey Konovalov @ 2018-12-06 10:18 UTC (permalink / raw)
To: kbuild test robot
Cc: kbuild-all, Johannes Weiner, Andrey Ryabinin, Dmitry Vyukov,
Andrew Morton, Linux Memory Management List
On Wed, Dec 5, 2018 at 8:09 AM kbuild test robot <lkp@intel.com> wrote:
>
> Hi Andrey,
>
> First bad commit (maybe != root cause):
>
> tree: git://git.cmpxchg.org/linux-mmotm.git master
> head: 1b1ce5151f3dd9a5bc989207ac56e96dcb84bef4
> commit: 60e8d1374609a0f5846f0c8ac1c7907501b58c7e [45/283] kasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS
> config: x86_64-randconfig-x007-12051024 (attached as .config)
> compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
> reproduce:
> git checkout 60e8d1374609a0f5846f0c8ac1c7907501b58c7e
> # save the attached .config to linux build tree
> make ARCH=x86_64
>
> All error/warnings (new ones prefixed by >>):
Looks like the same issues with configs, will fix in v13.
>
> mm/kasan/common.c: In function 'kasan_cache_create':
> >> mm/kasan/common.c:238:7: error: 'struct kmem_cache' has no member named 'kasan_info'
> cache->kasan_info.alloc_meta_offset = *size;
> ^~
> mm/kasan/common.c:244:8: error: 'struct kmem_cache' has no member named 'kasan_info'
> cache->kasan_info.free_meta_offset = *size;
> ^~
> mm/kasan/common.c:260:20: error: 'struct kmem_cache' has no member named 'kasan_info'
> if (*size <= cache->kasan_info.alloc_meta_offset ||
> ^~
> mm/kasan/common.c:261:18: error: 'struct kmem_cache' has no member named 'kasan_info'
> *size <= cache->kasan_info.free_meta_offset) {
> ^~
> mm/kasan/common.c:262:8: error: 'struct kmem_cache' has no member named 'kasan_info'
> cache->kasan_info.alloc_meta_offset = 0;
> ^~
> mm/kasan/common.c:263:8: error: 'struct kmem_cache' has no member named 'kasan_info'
> cache->kasan_info.free_meta_offset = 0;
> ^~
> mm/kasan/common.c: In function 'kasan_metadata_size':
> mm/kasan/common.c:273:15: error: 'struct kmem_cache' has no member named 'kasan_info'
> return (cache->kasan_info.alloc_meta_offset ?
> ^~
> mm/kasan/common.c:275:9: error: 'struct kmem_cache' has no member named 'kasan_info'
> (cache->kasan_info.free_meta_offset ?
> ^~
> mm/kasan/common.c: In function 'get_alloc_info':
> mm/kasan/common.c:283:31: error: 'struct kmem_cache' has no member named 'kasan_info'
> return (void *)object + cache->kasan_info.alloc_meta_offset;
> ^~
> mm/kasan/common.c: In function 'get_free_info':
> mm/kasan/common.c:290:31: error: 'struct kmem_cache' has no member named 'kasan_info'
> return (void *)object + cache->kasan_info.free_meta_offset;
> ^~
> In file included from include/linux/export.h:45:0,
> from mm/kasan/common.c:16:
> mm/kasan/common.c: In function '__kasan_slab_free':
> >> mm/kasan/common.c:336:15: error: implicit declaration of function 'nearest_obj' [-Werror=implicit-function-declaration]
> if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
> ^
> include/linux/compiler.h:77:42: note: in definition of macro 'unlikely'
> # define unlikely(x) __builtin_expect(!!(x), 0)
> ^
> >> mm/kasan/common.c:336:69: warning: comparison between pointer and integer
> if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
> ^
> include/linux/compiler.h:77:42: note: in definition of macro 'unlikely'
> # define unlikely(x) __builtin_expect(!!(x), 0)
> ^
> mm/kasan/common.c: In function 'kasan_metadata_size':
> >> mm/kasan/common.c:277:1: warning: control reaches end of non-void function [-Wreturn-type]
> }
> ^
> mm/kasan/common.c: In function 'get_alloc_info':
> mm/kasan/common.c:284:1: warning: control reaches end of non-void function [-Wreturn-type]
> }
> ^
> mm/kasan/common.c: In function 'get_free_info':
> mm/kasan/common.c:291:1: warning: control reaches end of non-void function [-Wreturn-type]
> }
> ^
> cc1: some warnings being treated as errors
> --
> mm/kasan/report.c: In function 'print_address_description':
> >> mm/kasan/report.c:261:18: error: implicit declaration of function 'nearest_obj' [-Werror=implicit-function-declaration]
> void *object = nearest_obj(cache, page, addr);
> ^~~~~~~~~~~
> >> mm/kasan/report.c:261:18: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
> cc1: some warnings being treated as errors
>
> vim +238 mm/kasan/common.c
>
> 6d7b7611 Andrey Konovalov 2018-11-29 230
> 6d7b7611 Andrey Konovalov 2018-11-29 231 void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
> 6d7b7611 Andrey Konovalov 2018-11-29 232 slab_flags_t *flags)
> 6d7b7611 Andrey Konovalov 2018-11-29 233 {
> 6d7b7611 Andrey Konovalov 2018-11-29 234 unsigned int orig_size = *size;
> 6d7b7611 Andrey Konovalov 2018-11-29 235 int redzone_adjust;
> 6d7b7611 Andrey Konovalov 2018-11-29 236
> 6d7b7611 Andrey Konovalov 2018-11-29 237 /* Add alloc meta. */
> 6d7b7611 Andrey Konovalov 2018-11-29 @238 cache->kasan_info.alloc_meta_offset = *size;
> 6d7b7611 Andrey Konovalov 2018-11-29 239 *size += sizeof(struct kasan_alloc_meta);
> 6d7b7611 Andrey Konovalov 2018-11-29 240
> 6d7b7611 Andrey Konovalov 2018-11-29 241 /* Add free meta. */
> 6d7b7611 Andrey Konovalov 2018-11-29 242 if (cache->flags & SLAB_TYPESAFE_BY_RCU || cache->ctor ||
> 6d7b7611 Andrey Konovalov 2018-11-29 243 cache->object_size < sizeof(struct kasan_free_meta)) {
> 6d7b7611 Andrey Konovalov 2018-11-29 244 cache->kasan_info.free_meta_offset = *size;
> 6d7b7611 Andrey Konovalov 2018-11-29 245 *size += sizeof(struct kasan_free_meta);
> 6d7b7611 Andrey Konovalov 2018-11-29 246 }
> 6d7b7611 Andrey Konovalov 2018-11-29 247 redzone_adjust = optimal_redzone(cache->object_size) -
> 6d7b7611 Andrey Konovalov 2018-11-29 248 (*size - cache->object_size);
> 6d7b7611 Andrey Konovalov 2018-11-29 249
> 6d7b7611 Andrey Konovalov 2018-11-29 250 if (redzone_adjust > 0)
> 6d7b7611 Andrey Konovalov 2018-11-29 251 *size += redzone_adjust;
> 6d7b7611 Andrey Konovalov 2018-11-29 252
> 6d7b7611 Andrey Konovalov 2018-11-29 253 *size = min_t(unsigned int, KMALLOC_MAX_SIZE,
> 6d7b7611 Andrey Konovalov 2018-11-29 254 max(*size, cache->object_size +
> 6d7b7611 Andrey Konovalov 2018-11-29 255 optimal_redzone(cache->object_size)));
> 6d7b7611 Andrey Konovalov 2018-11-29 256
> 6d7b7611 Andrey Konovalov 2018-11-29 257 /*
> 6d7b7611 Andrey Konovalov 2018-11-29 258 * If the metadata doesn't fit, don't enable KASAN at all.
> 6d7b7611 Andrey Konovalov 2018-11-29 259 */
> 6d7b7611 Andrey Konovalov 2018-11-29 260 if (*size <= cache->kasan_info.alloc_meta_offset ||
> 6d7b7611 Andrey Konovalov 2018-11-29 261 *size <= cache->kasan_info.free_meta_offset) {
> 6d7b7611 Andrey Konovalov 2018-11-29 262 cache->kasan_info.alloc_meta_offset = 0;
> 6d7b7611 Andrey Konovalov 2018-11-29 263 cache->kasan_info.free_meta_offset = 0;
> 6d7b7611 Andrey Konovalov 2018-11-29 264 *size = orig_size;
> 6d7b7611 Andrey Konovalov 2018-11-29 265 return;
> 6d7b7611 Andrey Konovalov 2018-11-29 266 }
> 6d7b7611 Andrey Konovalov 2018-11-29 267
> 6d7b7611 Andrey Konovalov 2018-11-29 268 *flags |= SLAB_KASAN;
> 6d7b7611 Andrey Konovalov 2018-11-29 269 }
> 6d7b7611 Andrey Konovalov 2018-11-29 270
> 6d7b7611 Andrey Konovalov 2018-11-29 271 size_t kasan_metadata_size(struct kmem_cache *cache)
> 6d7b7611 Andrey Konovalov 2018-11-29 272 {
> 6d7b7611 Andrey Konovalov 2018-11-29 273 return (cache->kasan_info.alloc_meta_offset ?
> 6d7b7611 Andrey Konovalov 2018-11-29 274 sizeof(struct kasan_alloc_meta) : 0) +
> 6d7b7611 Andrey Konovalov 2018-11-29 275 (cache->kasan_info.free_meta_offset ?
> 6d7b7611 Andrey Konovalov 2018-11-29 276 sizeof(struct kasan_free_meta) : 0);
> 6d7b7611 Andrey Konovalov 2018-11-29 @277 }
> 6d7b7611 Andrey Konovalov 2018-11-29 278
> 6d7b7611 Andrey Konovalov 2018-11-29 279 struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
> 6d7b7611 Andrey Konovalov 2018-11-29 280 const void *object)
> 6d7b7611 Andrey Konovalov 2018-11-29 281 {
> 6d7b7611 Andrey Konovalov 2018-11-29 282 BUILD_BUG_ON(sizeof(struct kasan_alloc_meta) > 32);
> 6d7b7611 Andrey Konovalov 2018-11-29 283 return (void *)object + cache->kasan_info.alloc_meta_offset;
> 6d7b7611 Andrey Konovalov 2018-11-29 284 }
> 6d7b7611 Andrey Konovalov 2018-11-29 285
> 6d7b7611 Andrey Konovalov 2018-11-29 286 struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
> 6d7b7611 Andrey Konovalov 2018-11-29 287 const void *object)
> 6d7b7611 Andrey Konovalov 2018-11-29 288 {
> 6d7b7611 Andrey Konovalov 2018-11-29 289 BUILD_BUG_ON(sizeof(struct kasan_free_meta) > 32);
> 6d7b7611 Andrey Konovalov 2018-11-29 @290 return (void *)object + cache->kasan_info.free_meta_offset;
> 6d7b7611 Andrey Konovalov 2018-11-29 291 }
> 6d7b7611 Andrey Konovalov 2018-11-29 292
> 6d7b7611 Andrey Konovalov 2018-11-29 293 void kasan_poison_slab(struct page *page)
> 6d7b7611 Andrey Konovalov 2018-11-29 294 {
> 6d7b7611 Andrey Konovalov 2018-11-29 295 kasan_poison_shadow(page_address(page),
> 6d7b7611 Andrey Konovalov 2018-11-29 296 PAGE_SIZE << compound_order(page),
> 6d7b7611 Andrey Konovalov 2018-11-29 297 KASAN_KMALLOC_REDZONE);
> 6d7b7611 Andrey Konovalov 2018-11-29 298 }
> 6d7b7611 Andrey Konovalov 2018-11-29 299
> 6d7b7611 Andrey Konovalov 2018-11-29 300 void kasan_unpoison_object_data(struct kmem_cache *cache, void *object)
> 6d7b7611 Andrey Konovalov 2018-11-29 301 {
> 6d7b7611 Andrey Konovalov 2018-11-29 302 kasan_unpoison_shadow(object, cache->object_size);
> 6d7b7611 Andrey Konovalov 2018-11-29 303 }
> 6d7b7611 Andrey Konovalov 2018-11-29 304
> 6d7b7611 Andrey Konovalov 2018-11-29 305 void kasan_poison_object_data(struct kmem_cache *cache, void *object)
> 6d7b7611 Andrey Konovalov 2018-11-29 306 {
> 6d7b7611 Andrey Konovalov 2018-11-29 307 kasan_poison_shadow(object,
> 6d7b7611 Andrey Konovalov 2018-11-29 308 round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE),
> 6d7b7611 Andrey Konovalov 2018-11-29 309 KASAN_KMALLOC_REDZONE);
> 6d7b7611 Andrey Konovalov 2018-11-29 310 }
> 6d7b7611 Andrey Konovalov 2018-11-29 311
> 6d7b7611 Andrey Konovalov 2018-11-29 312 void *kasan_init_slab_obj(struct kmem_cache *cache, const void *object)
> 6d7b7611 Andrey Konovalov 2018-11-29 313 {
> 6d7b7611 Andrey Konovalov 2018-11-29 314 struct kasan_alloc_meta *alloc_info;
> 6d7b7611 Andrey Konovalov 2018-11-29 315
> 6d7b7611 Andrey Konovalov 2018-11-29 316 if (!(cache->flags & SLAB_KASAN))
> 6d7b7611 Andrey Konovalov 2018-11-29 317 return (void *)object;
> 6d7b7611 Andrey Konovalov 2018-11-29 318
> 6d7b7611 Andrey Konovalov 2018-11-29 319 alloc_info = get_alloc_info(cache, object);
> 6d7b7611 Andrey Konovalov 2018-11-29 320 __memset(alloc_info, 0, sizeof(*alloc_info));
> 6d7b7611 Andrey Konovalov 2018-11-29 321
> 6d7b7611 Andrey Konovalov 2018-11-29 322 return (void *)object;
> 6d7b7611 Andrey Konovalov 2018-11-29 323 }
> 6d7b7611 Andrey Konovalov 2018-11-29 324
> 6d7b7611 Andrey Konovalov 2018-11-29 325 void *kasan_slab_alloc(struct kmem_cache *cache, void *object, gfp_t flags)
> 6d7b7611 Andrey Konovalov 2018-11-29 326 {
> 6d7b7611 Andrey Konovalov 2018-11-29 327 return kasan_kmalloc(cache, object, cache->object_size, flags);
> 6d7b7611 Andrey Konovalov 2018-11-29 328 }
> 6d7b7611 Andrey Konovalov 2018-11-29 329
> 6d7b7611 Andrey Konovalov 2018-11-29 330 static bool __kasan_slab_free(struct kmem_cache *cache, void *object,
> 6d7b7611 Andrey Konovalov 2018-11-29 331 unsigned long ip, bool quarantine)
> 6d7b7611 Andrey Konovalov 2018-11-29 332 {
> 6d7b7611 Andrey Konovalov 2018-11-29 333 s8 shadow_byte;
> 6d7b7611 Andrey Konovalov 2018-11-29 334 unsigned long rounded_up_size;
> 6d7b7611 Andrey Konovalov 2018-11-29 335
> 6d7b7611 Andrey Konovalov 2018-11-29 @336 if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
> 6d7b7611 Andrey Konovalov 2018-11-29 337 object)) {
> 6d7b7611 Andrey Konovalov 2018-11-29 338 kasan_report_invalid_free(object, ip);
> 6d7b7611 Andrey Konovalov 2018-11-29 339 return true;
> 6d7b7611 Andrey Konovalov 2018-11-29 340 }
> 6d7b7611 Andrey Konovalov 2018-11-29 341
> 6d7b7611 Andrey Konovalov 2018-11-29 342 /* RCU slabs could be legally used after free within the RCU period */
> 6d7b7611 Andrey Konovalov 2018-11-29 343 if (unlikely(cache->flags & SLAB_TYPESAFE_BY_RCU))
> 6d7b7611 Andrey Konovalov 2018-11-29 344 return false;
> 6d7b7611 Andrey Konovalov 2018-11-29 345
> 6d7b7611 Andrey Konovalov 2018-11-29 346 shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object));
> 6d7b7611 Andrey Konovalov 2018-11-29 347 if (shadow_byte < 0 || shadow_byte >= KASAN_SHADOW_SCALE_SIZE) {
> 6d7b7611 Andrey Konovalov 2018-11-29 348 kasan_report_invalid_free(object, ip);
> 6d7b7611 Andrey Konovalov 2018-11-29 349 return true;
> 6d7b7611 Andrey Konovalov 2018-11-29 350 }
> 6d7b7611 Andrey Konovalov 2018-11-29 351
> 6d7b7611 Andrey Konovalov 2018-11-29 352 rounded_up_size = round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE);
> 6d7b7611 Andrey Konovalov 2018-11-29 353 kasan_poison_shadow(object, rounded_up_size, KASAN_KMALLOC_FREE);
> 6d7b7611 Andrey Konovalov 2018-11-29 354
> 6d7b7611 Andrey Konovalov 2018-11-29 355 if (!quarantine || unlikely(!(cache->flags & SLAB_KASAN)))
> 6d7b7611 Andrey Konovalov 2018-11-29 356 return false;
> 6d7b7611 Andrey Konovalov 2018-11-29 357
> 6d7b7611 Andrey Konovalov 2018-11-29 358 set_track(&get_alloc_info(cache, object)->free_track, GFP_NOWAIT);
> 6d7b7611 Andrey Konovalov 2018-11-29 359 quarantine_put(get_free_info(cache, object), cache);
> 6d7b7611 Andrey Konovalov 2018-11-29 360 return true;
> 6d7b7611 Andrey Konovalov 2018-11-29 361 }
> 6d7b7611 Andrey Konovalov 2018-11-29 362
>
> :::::: The code at line 238 was first introduced by commit
> :::::: 6d7b7611ded2d230f527485d39a7e74958de415a kasan: move common generic and tag-based code to common.c
>
> :::::: TO: Andrey Konovalov <andreyknvl@google.com>
> :::::: CC: Johannes Weiner <hannes@cmpxchg.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-12-06 10:18 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-05 7:08 [mmotm:master 45/283] mm/kasan/common.c:238:7: error: 'struct kmem_cache' has no member named 'kasan_info' kbuild test robot
2018-12-06 10:18 ` Andrey Konovalov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox