Skip to content
Snippets Groups Projects
slub.c 138 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kenneth Johansson's avatar
    Kenneth Johansson committed
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
    /*
     * SLUB: A slab allocator that limits cache line use instead of queuing
     * objects in per cpu and per node lists.
     *
     * The allocator synchronizes using per slab locks or atomic operatios
     * and only uses a centralized lock to manage a pool of partial slabs.
     *
     * (C) 2007 SGI, Christoph Lameter
     * (C) 2011 Linux Foundation, Christoph Lameter
     */
    
    #include <linux/mm.h>
    #include <linux/swap.h> /* struct reclaim_state */
    #include <linux/module.h>
    #include <linux/bit_spinlock.h>
    #include <linux/interrupt.h>
    #include <linux/bitops.h>
    #include <linux/slab.h>
    #include "slab.h"
    #include <linux/proc_fs.h>
    #include <linux/notifier.h>
    #include <linux/seq_file.h>
    #include <linux/kasan.h>
    #include <linux/kmemcheck.h>
    #include <linux/cpu.h>
    #include <linux/cpuset.h>
    #include <linux/mempolicy.h>
    #include <linux/ctype.h>
    #include <linux/debugobjects.h>
    #include <linux/kallsyms.h>
    #include <linux/memory.h>
    #include <linux/math64.h>
    #include <linux/fault-inject.h>
    #include <linux/stacktrace.h>
    #include <linux/prefetch.h>
    #include <linux/memcontrol.h>
    
    #include <trace/events/kmem.h>
    
    #include "internal.h"
    
    /*
     * Lock order:
     *   1. slab_mutex (Global Mutex)
     *   2. node->list_lock
     *   3. slab_lock(page) (Only on some arches and for debugging)
     *
     *   slab_mutex
     *
     *   The role of the slab_mutex is to protect the list of all the slabs
     *   and to synchronize major metadata changes to slab cache structures.
     *
     *   The slab_lock is only used for debugging and on arches that do not
     *   have the ability to do a cmpxchg_double. It only protects the second
     *   double word in the page struct. Meaning
     *	A. page->freelist	-> List of object free in a page
     *	B. page->counters	-> Counters of objects
     *	C. page->frozen		-> frozen state
     *
     *   If a slab is frozen then it is exempt from list management. It is not
     *   on any list. The processor that froze the slab is the one who can
     *   perform list operations on the page. Other processors may put objects
     *   onto the freelist but the processor that froze the slab is the only
     *   one that can retrieve the objects from the page's freelist.
     *
     *   The list_lock protects the partial and full list on each node and
     *   the partial slab counter. If taken then no new slabs may be added or
     *   removed from the lists nor make the number of partial slabs be modified.
     *   (Note that the total number of slabs is an atomic value that may be
     *   modified without taking the list lock).
     *
     *   The list_lock is a centralized lock and thus we avoid taking it as
     *   much as possible. As long as SLUB does not have to handle partial
     *   slabs, operations can continue without any centralized lock. F.e.
     *   allocating a long series of objects that fill up slabs does not require
     *   the list lock.
     *   Interrupts are disabled during allocation and deallocation in order to
     *   make the slab allocator safe to use in the context of an irq. In addition
     *   interrupts are disabled to ensure that the processor does not change
     *   while handling per_cpu slabs, due to kernel preemption.
     *
     * SLUB assigns one slab for allocation to each processor.
     * Allocations only occur from these slabs called cpu slabs.
     *
     * Slabs with free elements are kept on a partial list and during regular
     * operations no list for full slabs is used. If an object in a full slab is
     * freed then the slab will show up again on the partial lists.
     * We track full slabs for debugging purposes though because otherwise we
     * cannot scan all objects.
     *
     * Slabs are freed when they become empty. Teardown and setup is
     * minimal so we rely on the page allocators per cpu caches for
     * fast frees and allocs.
     *
     * Overloading of page flags that are otherwise used for LRU management.
     *
     * PageActive 		The slab is frozen and exempt from list processing.
     * 			This means that the slab is dedicated to a purpose
     * 			such as satisfying allocations for a specific
     * 			processor. Objects may be freed in the slab while
     * 			it is frozen but slab_free will then skip the usual
     * 			list operations. It is up to the processor holding
     * 			the slab to integrate the slab into the slab lists
     * 			when the slab is no longer needed.
     *
     * 			One use of this flag is to mark slabs that are
     * 			used for allocations. Then such a slab becomes a cpu
     * 			slab. The cpu slab may be equipped with an additional
     * 			freelist that allows lockless access to
     * 			free objects in addition to the regular freelist
     * 			that requires the slab lock.
     *
     * PageError		Slab requires special handling due to debug
     * 			options set. This moves	slab handling out of
     * 			the fast path and disables lockless freelists.
     */
    
    static inline int kmem_cache_debug(struct kmem_cache *s)
    {
    #ifdef CONFIG_SLUB_DEBUG
    	return unlikely(s->flags & SLAB_DEBUG_FLAGS);
    #else
    	return 0;
    #endif
    }
    
    void *fixup_red_left(struct kmem_cache *s, void *p)
    {
    	if (kmem_cache_debug(s) && s->flags & SLAB_RED_ZONE)
    		p += s->red_left_pad;
    
    	return p;
    }
    
    static inline bool kmem_cache_has_cpu_partial(struct kmem_cache *s)
    {
    #ifdef CONFIG_SLUB_CPU_PARTIAL
    	return !kmem_cache_debug(s);
    #else
    	return false;
    #endif
    }
    
    /*
     * Issues still to be resolved:
     *
     * - Support PAGE_ALLOC_DEBUG. Should be easy to do.
     *
     * - Variable sizing of the per node arrays
     */
    
    /* Enable to test recovery from slab corruption on boot */
    #undef SLUB_RESILIENCY_TEST
    
    /* Enable to log cmpxchg failures */
    #undef SLUB_DEBUG_CMPXCHG
    
    /*
     * Mininum number of partial slabs. These will be left on the partial
     * lists even if they are empty. kmem_cache_shrink may reclaim them.
     */
    #define MIN_PARTIAL 5
    
    /*
     * Maximum number of desirable partial slabs.
     * The existence of more partial slabs makes kmem_cache_shrink
     * sort the partial list by the number of objects in use.
     */
    #define MAX_PARTIAL 10
    
    #define DEBUG_DEFAULT_FLAGS (SLAB_CONSISTENCY_CHECKS | SLAB_RED_ZONE | \
    				SLAB_POISON | SLAB_STORE_USER)
    
    /*
     * These debug flags cannot use CMPXCHG because there might be consistency
     * issues when checking or reading debug information
     */
    #define SLAB_NO_CMPXCHG (SLAB_CONSISTENCY_CHECKS | SLAB_STORE_USER | \
    				SLAB_TRACE)
    
    
    /*
     * Debugging flags that require metadata to be stored in the slab.  These get
     * disabled when slub_debug=O is used and a cache's min order increases with
     * metadata.
     */
    #define DEBUG_METADATA_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER)
    
    #define OO_SHIFT	16
    #define OO_MASK		((1 << OO_SHIFT) - 1)
    #define MAX_OBJS_PER_PAGE	32767 /* since page.objects is u15 */
    
    /* Internal SLUB flags */
    #define __OBJECT_POISON		0x80000000UL /* Poison object */
    #define __CMPXCHG_DOUBLE	0x40000000UL /* Use cmpxchg_double */
    
    /*
     * Tracking user of a slab.
     */
    #define TRACK_ADDRS_COUNT 16
    struct track {
    	unsigned long addr;	/* Called from address */
    #ifdef CONFIG_STACKTRACE
    	unsigned long addrs[TRACK_ADDRS_COUNT];	/* Called from address */
    #endif
    	int cpu;		/* Was running on cpu */
    	int pid;		/* Pid context */
    	unsigned long when;	/* When did the operation occur */
    };
    
    enum track_item { TRACK_ALLOC, TRACK_FREE };
    
    #ifdef CONFIG_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);
    #else
    static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; }
    static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p)
    							{ return 0; }
    static inline void memcg_propagate_slab_attrs(struct kmem_cache *s) { }
    #endif
    
    static inline void stat(const struct kmem_cache *s, enum stat_item si)
    {
    #ifdef CONFIG_SLUB_STATS
    	/*
    	 * The rmw is racy on a preemptible kernel but this is acceptable, so
    	 * avoid this_cpu_add()'s irq-disable overhead.
    	 */
    	raw_cpu_inc(s->cpu_slab->stat[si]);
    #endif
    }
    
    /********************************************************************
     * 			Core slab cache functions
     *******************************************************************/
    
    static inline void *get_freepointer(struct kmem_cache *s, void *object)
    {
    	return *(void **)(object + s->offset);
    }
    
    static void prefetch_freepointer(const struct kmem_cache *s, void *object)
    {
    	prefetch(object + s->offset);
    }
    
    static inline void *get_freepointer_safe(struct kmem_cache *s, void *object)
    {
    	void *p;
    
    	if (!debug_pagealloc_enabled())
    		return get_freepointer(s, object);
    
    	probe_kernel_read(&p, (void **)(object + s->offset), sizeof(p));
    	return p;
    }
    
    static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp)
    {
    	*(void **)(object + s->offset) = fp;
    }
    
    /* Loop over all objects in a slab */
    #define for_each_object(__p, __s, __addr, __objects) \
    	for (__p = fixup_red_left(__s, __addr); \
    		__p < (__addr) + (__objects) * (__s)->size; \
    		__p += (__s)->size)
    
    #define for_each_object_idx(__p, __idx, __s, __addr, __objects) \
    	for (__p = fixup_red_left(__s, __addr), __idx = 1; \
    		__idx <= __objects; \
    		__p += (__s)->size, __idx++)
    
    /* Determine object index from a given position */
    static inline int slab_index(void *p, struct kmem_cache *s, void *addr)
    {
    	return (p - addr) / s->size;
    }
    
    static inline int order_objects(int order, unsigned long size, int reserved)
    {
    	return ((PAGE_SIZE << order) - reserved) / size;
    }
    
    static inline struct kmem_cache_order_objects oo_make(int order,
    		unsigned long size, int reserved)
    {
    	struct kmem_cache_order_objects x = {
    		(order << OO_SHIFT) + order_objects(order, size, reserved)
    	};
    
    	return x;
    }
    
    static inline int oo_order(struct kmem_cache_order_objects x)
    {
    	return x.x >> OO_SHIFT;
    }
    
    static inline int oo_objects(struct kmem_cache_order_objects x)
    {
    	return x.x & OO_MASK;
    }
    
    /*
     * Per slab locking using the pagelock
     */
    static __always_inline void slab_lock(struct page *page)
    {
    	VM_BUG_ON_PAGE(PageTail(page), page);
    	bit_spin_lock(PG_locked, &page->flags);
    }
    
    static __always_inline void slab_unlock(struct page *page)
    {
    	VM_BUG_ON_PAGE(PageTail(page), page);
    	__bit_spin_unlock(PG_locked, &page->flags);
    }
    
    static inline void set_page_slub_counters(struct page *page, unsigned long counters_new)
    {
    	struct page tmp;
    	tmp.counters = counters_new;
    	/*
    	 * page->counters can cover frozen/inuse/objects as well
    	 * as page->_refcount.  If we assign to ->counters directly
    	 * we run the risk of losing updates to page->_refcount, so
    	 * be careful and only assign to the fields we need.
    	 */
    	page->frozen  = tmp.frozen;
    	page->inuse   = tmp.inuse;
    	page->objects = tmp.objects;
    }
    
    /* Interrupts must be disabled (for the fallback code to work right) */
    static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
    		void *freelist_old, unsigned long counters_old,
    		void *freelist_new, unsigned long counters_new,
    		const char *n)
    {
    	VM_BUG_ON(!irqs_disabled());
    #if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \
        defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
    	if (s->flags & __CMPXCHG_DOUBLE) {
    		if (cmpxchg_double(&page->freelist, &page->counters,
    				   freelist_old, counters_old,
    				   freelist_new, counters_new))
    			return true;
    	} else
    #endif
    	{
    		slab_lock(page);
    		if (page->freelist == freelist_old &&
    					page->counters == counters_old) {
    			page->freelist = freelist_new;
    			set_page_slub_counters(page, counters_new);
    			slab_unlock(page);
    			return true;
    		}
    		slab_unlock(page);
    	}
    
    	cpu_relax();
    	stat(s, CMPXCHG_DOUBLE_FAIL);
    
    #ifdef SLUB_DEBUG_CMPXCHG
    	pr_info("%s %s: cmpxchg double redo ", n, s->name);
    #endif
    
    	return false;
    }
    
    static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
    		void *freelist_old, unsigned long counters_old,
    		void *freelist_new, unsigned long counters_new,
    		const char *n)
    {
    #if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \
        defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
    	if (s->flags & __CMPXCHG_DOUBLE) {
    		if (cmpxchg_double(&page->freelist, &page->counters,
    				   freelist_old, counters_old,
    				   freelist_new, counters_new))
    			return true;
    	} else
    #endif
    	{
    		unsigned long flags;
    
    		local_irq_save(flags);
    		slab_lock(page);
    		if (page->freelist == freelist_old &&
    					page->counters == counters_old) {
    			page->freelist = freelist_new;
    			set_page_slub_counters(page, counters_new);
    			slab_unlock(page);
    			local_irq_restore(flags);
    			return true;
    		}
    		slab_unlock(page);
    		local_irq_restore(flags);
    	}
    
    	cpu_relax();
    	stat(s, CMPXCHG_DOUBLE_FAIL);
    
    #ifdef SLUB_DEBUG_CMPXCHG
    	pr_info("%s %s: cmpxchg double redo ", n, s->name);
    #endif
    
    	return false;
    }
    
    #ifdef CONFIG_SLUB_DEBUG
    /*
     * Determine a map of object in use on a page.
     *
     * Node listlock must be held to guarantee that the page does
     * not vanish from under us.
     */
    static void get_map(struct kmem_cache *s, struct page *page, unsigned long *map)
    {
    	void *p;
    	void *addr = page_address(page);
    
    	for (p = page->freelist; p; p = get_freepointer(s, p))
    		set_bit(slab_index(p, s, addr), map);
    }
    
    static inline int size_from_object(struct kmem_cache *s)
    {
    	if (s->flags & SLAB_RED_ZONE)
    		return s->size - s->red_left_pad;
    
    	return s->size;
    }
    
    static inline void *restore_red_left(struct kmem_cache *s, void *p)
    {
    	if (s->flags & SLAB_RED_ZONE)
    		p -= s->red_left_pad;
    
    	return p;
    }
    
    /*
     * Debug settings:
     */
    #if defined(CONFIG_SLUB_DEBUG_ON)
    static int slub_debug = DEBUG_DEFAULT_FLAGS;
    #else
    static int slub_debug;
    #endif
    
    static char *slub_debug_slabs;
    static int disable_higher_order_debug;
    
    /*
     * slub is about to manipulate internal object metadata.  This memory lies
     * outside the range of the allocated object, so accessing it would normally
     * be reported by kasan as a bounds error.  metadata_access_enable() is used
     * to tell kasan that these accesses are OK.
     */
    static inline void metadata_access_enable(void)
    {
    	kasan_disable_current();
    }
    
    static inline void metadata_access_disable(void)
    {
    	kasan_enable_current();
    }
    
    /*
     * Object debugging
     */
    
    /* Verify that a pointer has an address that is valid within a slab page */
    static inline int check_valid_pointer(struct kmem_cache *s,
    				struct page *page, void *object)
    {
    	void *base;
    
    	if (!object)
    		return 1;
    
    	base = page_address(page);
    	object = restore_red_left(s, object);
    	if (object < base || object >= base + page->objects * s->size ||
    		(object - base) % s->size) {
    		return 0;
    	}
    
    	return 1;
    }
    
    static void print_section(char *level, char *text, u8 *addr,
    			  unsigned int length)
    {
    	metadata_access_enable();
    	print_hex_dump(level, text, DUMP_PREFIX_ADDRESS, 16, 1, addr,
    			length, 1);
    	metadata_access_disable();
    }
    
    static struct track *get_track(struct kmem_cache *s, void *object,
    	enum track_item alloc)
    {
    	struct track *p;
    
    	if (s->offset)
    		p = object + s->offset + sizeof(void *);
    	else
    		p = object + s->inuse;
    
    	return p + alloc;
    }
    
    static void set_track(struct kmem_cache *s, void *object,
    			enum track_item alloc, unsigned long addr)
    {
    	struct track *p = get_track(s, object, alloc);
    
    	if (addr) {
    #ifdef CONFIG_STACKTRACE
    		struct stack_trace trace;
    		int i;
    
    		trace.nr_entries = 0;
    		trace.max_entries = TRACK_ADDRS_COUNT;
    		trace.entries = p->addrs;
    		trace.skip = 3;
    		metadata_access_enable();
    		save_stack_trace(&trace);
    		metadata_access_disable();
    
    		/* See rant in lockdep.c */
    		if (trace.nr_entries != 0 &&
    		    trace.entries[trace.nr_entries - 1] == ULONG_MAX)
    			trace.nr_entries--;
    
    		for (i = trace.nr_entries; i < TRACK_ADDRS_COUNT; i++)
    			p->addrs[i] = 0;
    #endif
    		p->addr = addr;
    		p->cpu = smp_processor_id();
    		p->pid = current->pid;
    		p->when = jiffies;
    	} else
    		memset(p, 0, sizeof(struct track));
    }
    
    static void init_tracking(struct kmem_cache *s, void *object)
    {
    	if (!(s->flags & SLAB_STORE_USER))
    		return;
    
    	set_track(s, object, TRACK_FREE, 0UL);
    	set_track(s, object, TRACK_ALLOC, 0UL);
    }
    
    static void print_track(const char *s, struct track *t)
    {
    	if (!t->addr)
    		return;
    
    	pr_err("INFO: %s in %pS age=%lu cpu=%u pid=%d\n",
    	       s, (void *)t->addr, jiffies - t->when, t->cpu, t->pid);
    #ifdef CONFIG_STACKTRACE
    	{
    		int i;
    		for (i = 0; i < TRACK_ADDRS_COUNT; i++)
    			if (t->addrs[i])
    				pr_err("\t%pS\n", (void *)t->addrs[i]);
    			else
    				break;
    	}
    #endif
    }
    
    static void print_tracking(struct kmem_cache *s, void *object)
    {
    	if (!(s->flags & SLAB_STORE_USER))
    		return;
    
    	print_track("Allocated", get_track(s, object, TRACK_ALLOC));
    	print_track("Freed", get_track(s, object, TRACK_FREE));
    }
    
    static void print_page_info(struct page *page)
    {
    	pr_err("INFO: Slab 0x%p objects=%u used=%u fp=0x%p flags=0x%04lx\n",
    	       page, page->objects, page->inuse, page->freelist, page->flags);
    
    }
    
    static void slab_bug(struct kmem_cache *s, char *fmt, ...)
    {
    	struct va_format vaf;
    	va_list args;
    
    	va_start(args, fmt);
    	vaf.fmt = fmt;
    	vaf.va = &args;
    	pr_err("=============================================================================\n");
    	pr_err("BUG %s (%s): %pV\n", s->name, print_tainted(), &vaf);
    	pr_err("-----------------------------------------------------------------------------\n\n");
    
    	add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
    	va_end(args);
    }
    
    static void slab_fix(struct kmem_cache *s, char *fmt, ...)
    {
    	struct va_format vaf;
    	va_list args;
    
    	va_start(args, fmt);
    	vaf.fmt = fmt;
    	vaf.va = &args;
    	pr_err("FIX %s: %pV\n", s->name, &vaf);
    	va_end(args);
    }
    
    static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p)
    {
    	unsigned int off;	/* Offset of last byte */
    	u8 *addr = page_address(page);
    
    	print_tracking(s, p);
    
    	print_page_info(page);
    
    	pr_err("INFO: Object 0x%p @offset=%tu fp=0x%p\n\n",
    	       p, p - addr, get_freepointer(s, p));
    
    	if (s->flags & SLAB_RED_ZONE)
    		print_section(KERN_ERR, "Redzone ", p - s->red_left_pad,
    			      s->red_left_pad);
    	else if (p > addr + 16)
    		print_section(KERN_ERR, "Bytes b4 ", p - 16, 16);
    
    	print_section(KERN_ERR, "Object ", p,
    		      min_t(unsigned long, s->object_size, PAGE_SIZE));
    	if (s->flags & SLAB_RED_ZONE)
    		print_section(KERN_ERR, "Redzone ", p + s->object_size,
    			s->inuse - s->object_size);
    
    	if (s->offset)
    		off = s->offset + sizeof(void *);
    	else
    		off = s->inuse;
    
    	if (s->flags & SLAB_STORE_USER)
    		off += 2 * sizeof(struct track);
    
    	off += kasan_metadata_size(s);
    
    	if (off != size_from_object(s))
    		/* Beginning of the filler is the free pointer */
    		print_section(KERN_ERR, "Padding ", p + off,
    			      size_from_object(s) - off);
    
    	dump_stack();
    }
    
    void object_err(struct kmem_cache *s, struct page *page,
    			u8 *object, char *reason)
    {
    	slab_bug(s, "%s", reason);
    	print_trailer(s, page, object);
    }
    
    static void slab_err(struct kmem_cache *s, struct page *page,
    			const char *fmt, ...)
    {
    	va_list args;
    	char buf[100];
    
    	va_start(args, fmt);
    	vsnprintf(buf, sizeof(buf), fmt, args);
    	va_end(args);
    	slab_bug(s, "%s", buf);
    	print_page_info(page);
    	dump_stack();
    }
    
    static void init_object(struct kmem_cache *s, void *object, u8 val)
    {
    	u8 *p = object;
    
    	if (s->flags & SLAB_RED_ZONE)
    		memset(p - s->red_left_pad, val, s->red_left_pad);
    
    	if (s->flags & __OBJECT_POISON) {
    		memset(p, POISON_FREE, s->object_size - 1);
    		p[s->object_size - 1] = POISON_END;
    	}
    
    	if (s->flags & SLAB_RED_ZONE)
    		memset(p + s->object_size, val, s->inuse - s->object_size);
    }
    
    static void restore_bytes(struct kmem_cache *s, char *message, u8 data,
    						void *from, void *to)
    {
    	slab_fix(s, "Restoring 0x%p-0x%p=0x%x\n", from, to - 1, data);
    	memset(from, data, to - from);
    }
    
    static int check_bytes_and_report(struct kmem_cache *s, struct page *page,
    			u8 *object, char *what,
    			u8 *start, unsigned int value, unsigned int bytes)
    {
    	u8 *fault;
    	u8 *end;
    
    	metadata_access_enable();
    	fault = memchr_inv(start, value, bytes);
    	metadata_access_disable();
    	if (!fault)
    		return 1;
    
    	end = start + bytes;
    	while (end > fault && end[-1] == value)
    		end--;
    
    	slab_bug(s, "%s overwritten", what);
    	pr_err("INFO: 0x%p-0x%p. First byte 0x%x instead of 0x%x\n",
    					fault, end - 1, fault[0], value);
    	print_trailer(s, page, object);
    
    	restore_bytes(s, what, value, fault, end);
    	return 0;
    }
    
    /*
     * Object layout:
     *
     * object address
     * 	Bytes of the object to be managed.
     * 	If the freepointer may overlay the object then the free
     * 	pointer is the first word of the object.
     *
     * 	Poisoning uses 0x6b (POISON_FREE) and the last byte is
     * 	0xa5 (POISON_END)
     *
     * object + s->object_size
     * 	Padding to reach word boundary. This is also used for Redzoning.
     * 	Padding is extended by another word if Redzoning is enabled and
     * 	object_size == inuse.
     *
     * 	We fill with 0xbb (RED_INACTIVE) for inactive objects and with
     * 	0xcc (RED_ACTIVE) for objects in use.
     *
     * object + s->inuse
     * 	Meta data starts here.
     *
     * 	A. Free pointer (if we cannot overwrite object on free)
     * 	B. Tracking data for SLAB_STORE_USER
     * 	C. Padding to reach required alignment boundary or at mininum
     * 		one word if debugging is on to be able to detect writes
     * 		before the word boundary.
     *
     *	Padding is done using 0x5a (POISON_INUSE)
     *
     * object + s->size
     * 	Nothing is used beyond s->size.
     *
     * If slabcaches are merged then the object_size and inuse boundaries are mostly
     * ignored. And therefore no slab options that rely on these boundaries
     * may be used with merged slabcaches.
     */
    
    static int check_pad_bytes(struct kmem_cache *s, struct page *page, u8 *p)
    {
    	unsigned long off = s->inuse;	/* The end of info */
    
    	if (s->offset)
    		/* Freepointer is placed after the object. */
    		off += sizeof(void *);
    
    	if (s->flags & SLAB_STORE_USER)
    		/* We also have user information there */
    		off += 2 * sizeof(struct track);
    
    	off += kasan_metadata_size(s);
    
    	if (size_from_object(s) == off)
    		return 1;
    
    	return check_bytes_and_report(s, page, p, "Object padding",
    			p + off, POISON_INUSE, size_from_object(s) - off);
    }
    
    /* Check the pad bytes at the end of a slab page */
    static int slab_pad_check(struct kmem_cache *s, struct page *page)
    {
    	u8 *start;
    	u8 *fault;
    	u8 *end;
    	int length;
    	int remainder;
    
    	if (!(s->flags & SLAB_POISON))
    		return 1;
    
    	start = page_address(page);
    	length = (PAGE_SIZE << compound_order(page)) - s->reserved;
    	end = start + length;
    	remainder = length % s->size;
    	if (!remainder)
    		return 1;
    
    	metadata_access_enable();
    	fault = memchr_inv(end - remainder, POISON_INUSE, remainder);
    	metadata_access_disable();
    	if (!fault)
    		return 1;
    	while (end > fault && end[-1] == POISON_INUSE)
    		end--;
    
    	slab_err(s, page, "Padding overwritten. 0x%p-0x%p", fault, end - 1);
    	print_section(KERN_ERR, "Padding ", end - remainder, remainder);
    
    	restore_bytes(s, "slab padding", POISON_INUSE, end - remainder, end);
    	return 0;
    }
    
    static int check_object(struct kmem_cache *s, struct page *page,
    					void *object, u8 val)
    {
    	u8 *p = object;
    	u8 *endobject = object + s->object_size;
    
    	if (s->flags & SLAB_RED_ZONE) {
    		if (!check_bytes_and_report(s, page, object, "Redzone",
    			object - s->red_left_pad, val, s->red_left_pad))
    			return 0;
    
    		if (!check_bytes_and_report(s, page, object, "Redzone",
    			endobject, val, s->inuse - s->object_size))
    			return 0;
    	} else {
    		if ((s->flags & SLAB_POISON) && s->object_size < s->inuse) {
    			check_bytes_and_report(s, page, p, "Alignment padding",
    				endobject, POISON_INUSE,
    				s->inuse - s->object_size);
    		}
    	}
    
    	if (s->flags & SLAB_POISON) {
    		if (val != SLUB_RED_ACTIVE && (s->flags & __OBJECT_POISON) &&
    			(!check_bytes_and_report(s, page, p, "Poison", p,
    					POISON_FREE, s->object_size - 1) ||
    			 !check_bytes_and_report(s, page, p, "Poison",
    				p + s->object_size - 1, POISON_END, 1)))
    			return 0;
    		/*
    		 * check_pad_bytes cleans up on its own.
    		 */
    		check_pad_bytes(s, page, p);
    	}
    
    	if (!s->offset && val == SLUB_RED_ACTIVE)
    		/*
    		 * Object and freepointer overlap. Cannot check
    		 * freepointer while object is allocated.
    		 */
    		return 1;
    
    	/* Check free pointer validity */
    	if (!check_valid_pointer(s, page, get_freepointer(s, p))) {
    		object_err(s, page, p, "Freepointer corrupt");
    		/*
    		 * No choice but to zap it and thus lose the remainder
    		 * of the free objects in this slab. May cause
    		 * another error because the object count is now wrong.
    		 */
    		set_freepointer(s, p, NULL);
    		return 0;
    	}
    	return 1;
    }
    
    static int check_slab(struct kmem_cache *s, struct page *page)
    {
    	int maxobj;
    
    	VM_BUG_ON(!irqs_disabled());
    
    	if (!PageSlab(page)) {
    		slab_err(s, page, "Not a valid slab page");
    		return 0;
    	}
    
    	maxobj = order_objects(compound_order(page), s->size, s->reserved);
    	if (page->objects > maxobj) {
    		slab_err(s, page, "objects %u > max %u",
    			page->objects, maxobj);
    		return 0;
    	}
    	if (page->inuse > page->objects) {
    		slab_err(s, page, "inuse %u > max %u",
    			page->inuse, page->objects);
    		return 0;
    	}
    	/* Slab_pad_check fixes things up after itself */
    	slab_pad_check(s, page);
    	return 1;
    }
    
    /*
     * Determine if a certain object on a page is on the freelist. Must hold the
     * slab lock to guarantee that the chains are in a consistent state.
     */
    static int on_freelist(struct kmem_cache *s, struct page *page, void *search)
    {
    	int nr = 0;
    	void *fp;
    	void *object = NULL;
    	int max_objects;
    
    	fp = page->freelist;
    	while (fp && nr <= page->objects) {
    		if (fp == search)
    			return 1;
    		if (!check_valid_pointer(s, page, fp)) {
    			if (object) {
    				object_err(s, page, object,
    					"Freechain corrupt");
    				set_freepointer(s, object, NULL);
    			} else {
    				slab_err(s, page, "Freepointer corrupt");
    				page->freelist = NULL;
    				page->inuse = page->objects;
    				slab_fix(s, "Freelist cleared");
    				return 0;
    			}
    			break;
    		}
    		object = fp;
    		fp = get_freepointer(s, object);
    		nr++;
    	}
    
    	max_objects = order_objects(compound_order(page), s->size, s->reserved);
    	if (max_objects > MAX_OBJS_PER_PAGE)
    		max_objects = MAX_OBJS_PER_PAGE;
    
    	if (page->objects != max_objects) {
    		slab_err(s, page, "Wrong number of objects. Found %d but should be %d",
    			 page->objects, max_objects);
    		page->objects = max_objects;
    		slab_fix(s, "Number of objects adjusted.");
    	}
    	if (page->inuse != page->objects - nr) {
    		slab_err(s, page, "Wrong object count. Counter is %d but counted were %d",
    			 page->inuse, page->objects - nr);
    		page->inuse = page->objects - nr;
    		slab_fix(s, "Object count adjusted.");
    	}
    	return search == NULL;
    }
    
    static void trace(struct kmem_cache *s, struct page *page, void *object,
    								int alloc)
    {
    	if (s->flags & SLAB_TRACE) {
    		pr_info("TRACE %s %s 0x%p inuse=%d fp=0x%p\n",
    			s->name,
    			alloc ? "alloc" : "free",
    			object, page->inuse,
    			page->freelist);
    
    		if (!alloc)
    			print_section(KERN_INFO, "Object ", (void *)object,
    					s->object_size);
    
    		dump_stack();
    	}
    }
    
    /*
     * Tracking of fully allocated slabs for debugging purposes.
     */
    static void add_full(struct kmem_cache *s,
    	struct kmem_cache_node *n, struct page *page)
    {
    	if (!(s->flags & SLAB_STORE_USER))
    		return;
    
    	lockdep_assert_held(&n->list_lock);
    	list_add(&page->lru, &n->full);
    }
    
    static void remove_full(struct kmem_cache *s, struct kmem_cache_node *n, struct page *page)
    {