Skip to content
Snippets Groups Projects
  1. Dec 28, 2018
    • Qian Cai's avatar
      debugobjects: call debug_objects_mem_init eariler · a9ee3a63
      Qian Cai authored
      The current value of the early boot static pool size, 1024 is not big
      enough for systems with large number of CPUs with timer or/and workqueue
      objects selected.  As the results, systems have 60+ CPUs with both timer
      and workqueue objects enabled could trigger "ODEBUG: Out of memory.
      ODEBUG disabled".
      
      Some debug objects are allocated during the early boot.  Enabling some
      options like timers or workqueue objects may increase the size required
      significantly with large number of CPUs.  For example,
      
      CONFIG_DEBUG_OBJECTS_TIMERS:
      No. CPUs x 2 (worker pool) objects:
      start_kernel
        workqueue_init_early
          init_worker_pool
            init_timer_key
              debug_object_init
      
      plus No. CPUs objects (CONFIG_HIGH_RES_TIMERS):
      sched_init
        hrtick_rq_init
          hrtimer_init
      
      CONFIG_DEBUG_OBJECTS_WORK:
      No. CPUs objects:
      vmalloc_init
        __init_work
      
      plus No. CPUs x 6 (workqueue) objects:
      workqueue_init_early
        alloc_workqueue
          __alloc_workqueue_key
            alloc_and_link_pwqs
              init_pwq
      
      Also, plus No. CPUs objects:
      perf_event_init
        __init_srcu_struct
          init_srcu_struct_fields
            init_srcu_struct_nodes
              __init_work
      
      However, none of the things are actually used or required before
      debug_objects_mem_init() is invoked, so just move the call right before
      vmalloc_init().
      
      According to tglx, "the reason why the call is at this place in
      start_kernel() is historical.  It's because back in the days when
      debugobjects were added the memory allocator was enabled way later than
      today."
      
      Link: http://lkml.kernel.org/r/20181126102407.1836-1-cai@gmx.us
      
      
      Signed-off-by: default avatarQian Cai <cai@gmx.us>
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: Waiman Long <longman@redhat.com>
      Cc: Yang Shi <yang.shi@linux.alibaba.com>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      a9ee3a63
  2. Nov 30, 2018
  3. Aug 02, 2018
  4. Jul 30, 2018
  5. Mar 14, 2018
  6. Feb 22, 2018
  7. Feb 13, 2018
    • Yang Shi's avatar
      debugobjects: Use global free list in __debug_check_no_obj_freed() · 1ea9b98b
      Yang Shi authored
      
      __debug_check_no_obj_freed() iterates over the to be freed memory region in
      chunks and iterates over the corresponding hash bucket list for each
      chunk. This can accumulate to hundred thousands of checked objects. In the
      worst case this can trigger the soft lockup detector:
      
      NMI watchdog: BUG: soft lockup - CPU#15 stuck for 22s!
      CPU: 15 PID: 110342 Comm: stress-ng-getde
      Call Trace:
        [<ffffffff8141177e>] debug_check_no_obj_freed+0x13e/0x220
        [<ffffffff811f8751>] __free_pages_ok+0x1f1/0x5c0
        [<ffffffff811fa785>] __free_pages+0x25/0x40
        [<ffffffff812638db>] __free_slab+0x19b/0x270
        [<ffffffff812639e9>] discard_slab+0x39/0x50
        [<ffffffff812679f7>] __slab_free+0x207/0x270
        [<ffffffff81269966>] ___cache_free+0xa6/0xb0
        [<ffffffff8126c267>] qlist_free_all+0x47/0x80
        [<ffffffff8126c5a9>] quarantine_reduce+0x159/0x190
        [<ffffffff8126b3bf>] kasan_kmalloc+0xaf/0xc0
        [<ffffffff8126b8a2>] kasan_slab_alloc+0x12/0x20
        [<ffffffff81265e8a>] kmem_cache_alloc+0xfa/0x360
        [<ffffffff812abc8f>] ? getname_flags+0x4f/0x1f0
        [<ffffffff812abc8f>] getname_flags+0x4f/0x1f0
        [<ffffffff812abe42>] getname+0x12/0x20
        [<ffffffff81298da9>] do_sys_open+0xf9/0x210
        [<ffffffff81298ede>] SyS_open+0x1e/0x20
        [<ffffffff817d6e01>] entry_SYSCALL_64_fastpath+0x1f/0xc2
      
      The code path might be called in either atomic or non-atomic context, but
      in_atomic() can't tell if the current context is atomic or not on a
      PREEMPT=n kernel, so cond_resched() can't be used to prevent the
      softlockup.
      
      Utilize the global free list to shorten the loop execution time.
      
      [ tglx: Massaged changelog ]
      
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: longman@redhat.com
      Link: https://lkml.kernel.org/r/1517872708-24207-5-git-send-email-yang.shi@linux.alibaba.com
      1ea9b98b
    • Yang Shi's avatar
      debugobjects: Use global free list in free_object() · 636e1970
      Yang Shi authored
      
      The newly added global free list allows to avoid lengthy pool_list
      iterations in free_obj_work() by putting objects either into the pool list
      when the fill level of the pool is below the maximum or by putting them on
      the global free list immediately.
      
      As the pool is now guaranteed to never exceed the maximum fill level this
      allows to remove the batch removal from pool list in free_obj_work().
      
      Split free_object() into two parts, so the actual queueing function can be
      reused without invoking schedule_work() on every invocation.
      
      [ tglx: Remove the batch removal from pool list and massage changelog ]
      
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: longman@redhat.com
      Link: https://lkml.kernel.org/r/1517872708-24207-4-git-send-email-yang.shi@linux.alibaba.com
      636e1970
    • Yang Shi's avatar
      debugobjects: Add global free list and the counter · 36c4ead6
      Yang Shi authored
      
      free_object() adds objects to the pool list and schedules work when the
      pool list is larger than the pool size.  The worker handles the actual
      kfree() of the object by iterating the pool list until the pool size is
      below the maximum pool size again.
      
      To iterate the pool list, pool_lock has to be held and the objects which
      should be freed() need to be put into temporary storage so pool_lock can be
      dropped for the actual kmem_cache_free() invocation. That's a pointless and
      expensive exercise if there is a large number of objects to free.
      
      In such a case its better to evaulate the fill level of the pool in
      free_objects() and queue the object to free either in the pool list or if
      it's full on a separate global free list.
      
      The worker can then do the following simpler operation:
      
        - Move objects back from the global free list to the pool list if the
          pool list is not longer full.
      
        - Remove the remaining objects in a single list move operation from the
          global free list and do the kmem_cache_free() operation lockless from
          the temporary list head.
      
      In fill_pool() the global free list is checked as well to avoid real
      allocations from the kmem cache.
      
      Add the necessary list head and a counter for the number of objects on the
      global free list and export that counter via sysfs:
      
      max_chain     :79
      max_loops     :8147
      warnings      :0
      fixups        :0
      pool_free     :1697
      pool_min_free :346
      pool_used     :15356
      pool_max_used :23933
      on_free_list  :39
      objs_allocated:32617
      objs_freed    :16588
      
      Nothing queues objects on the global free list yet. This happens in a
      follow up change.
      
      [ tglx: Simplified implementation and massaged changelog ]
      
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: longman@redhat.com
      Link: https://lkml.kernel.org/r/1517872708-24207-3-git-send-email-yang.shi@linux.alibaba.com
      36c4ead6
    • Yang Shi's avatar
      debugobjects: Export max loops counter · bd9dcd04
      Yang Shi authored
      
      __debug_check_no_obj_freed() can be an expensive operation depending on the
      size of memory freed. It already exports the maximum chain walk length via
      debugfs, but this only records the maximum of a single memory chunk.
      
      Though there is no information about the total number of objects inspected
      for a __debug_check_no_obj_freed() operation, which might be significantly
      larger when a huge memory region is freed.
      
      Aggregate the number of objects inspected for a single invocation of
      __debug_check_no_obj_freed() and export it via sysfs.
      
      The resulting output of /sys/kernel/debug/debug_objects/stats looks like:
      
      max_chain     :121
      max_checked   :543267
      warnings      :0
      fixups        :0
      pool_free     :1764
      pool_min_free :341
      pool_used     :86438
      pool_max_used :268887
      objs_allocated:6068254
      objs_freed    :5981076
      
      [ tglx: Renamed the variable to max_checked and adjusted changelog ]
      
      Signed-off-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: longman@redhat.com
      Link: https://lkml.kernel.org/r/1517872708-24207-2-git-send-email-yang.shi@linux.alibaba.com
      bd9dcd04
  8. Aug 14, 2017
    • Waiman Long's avatar
      debugobjects: Make kmemleak ignore debug objects · caba4cbb
      Waiman Long authored
      
      The allocated debug objects are either on the free list or in the
      hashed bucket lists. So they won't get lost. However if both debug
      objects and kmemleak are enabled and kmemleak scanning is done
      while some of the debug objects are transitioning from one list to
      the others, false negative reporting of memory leaks may happen for
      those objects. For example,
      
      [38687.275678] kmemleak: 12 new suspected memory leaks (see
      /sys/kernel/debug/kmemleak)
      unreferenced object 0xffff92e98aabeb68 (size 40):
        comm "ksmtuned", pid 4344, jiffies 4298403600 (age 906.430s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 d0 bc db 92 e9 92 ff ff  ................
          01 00 00 00 00 00 00 00 38 36 8a 61 e9 92 ff ff  ........86.a....
        backtrace:
          [<ffffffff8fa5378a>] kmemleak_alloc+0x4a/0xa0
          [<ffffffff8f47c019>] kmem_cache_alloc+0xe9/0x320
          [<ffffffff8f62ed96>] __debug_object_init+0x3e6/0x400
          [<ffffffff8f62ef01>] debug_object_activate+0x131/0x210
          [<ffffffff8f330d9f>] __call_rcu+0x3f/0x400
          [<ffffffff8f33117d>] call_rcu_sched+0x1d/0x20
          [<ffffffff8f4a183c>] put_object+0x2c/0x40
          [<ffffffff8f4a188c>] __delete_object+0x3c/0x50
          [<ffffffff8f4a18bd>] delete_object_full+0x1d/0x20
          [<ffffffff8fa535c2>] kmemleak_free+0x32/0x80
          [<ffffffff8f47af07>] kmem_cache_free+0x77/0x350
          [<ffffffff8f453912>] unlink_anon_vmas+0x82/0x1e0
          [<ffffffff8f440341>] free_pgtables+0xa1/0x110
          [<ffffffff8f44af91>] exit_mmap+0xc1/0x170
          [<ffffffff8f29db60>] mmput+0x80/0x150
          [<ffffffff8f2a7609>] do_exit+0x2a9/0xd20
      
      The references in the debug objects may also hide a real memory leak.
      
      As there is no point in having kmemleak to track debug object
      allocations, kmemleak checking is now disabled for debug objects.
      
      Signed-off-by: default avatarWaiman Long <longman@redhat.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Link: http://lkml.kernel.org/r/1502718733-8527-1-git-send-email-longman@redhat.com
      caba4cbb
  9. Mar 02, 2017
  10. Feb 10, 2017
  11. Feb 05, 2017
    • Waiman Long's avatar
      debugobjects: Reduce contention on the global pool_lock · 858274b6
      Waiman Long authored
      
      On a large SMP system with many CPUs, the global pool_lock may become
      a performance bottleneck as all the CPUs that need to allocate or
      free debug objects have to take the lock. That can sometimes cause
      soft lockups like:
      
       NMI watchdog: BUG: soft lockup - CPU#35 stuck for 22s! [rcuos/1:21]
       ...
       RIP: 0010:[<ffffffff817c216b>]  [<ffffffff817c216b>]
      	_raw_spin_unlock_irqrestore+0x3b/0x60
       ...
       Call Trace:
        [<ffffffff813f40d1>] free_object+0x81/0xb0
        [<ffffffff813f4f33>] debug_check_no_obj_freed+0x193/0x220
        [<ffffffff81101a59>] ? trace_hardirqs_on_caller+0xf9/0x1c0
        [<ffffffff81284996>] ? file_free_rcu+0x36/0x60
        [<ffffffff81251712>] kmem_cache_free+0xd2/0x380
        [<ffffffff81284960>] ? fput+0x90/0x90
        [<ffffffff81284996>] file_free_rcu+0x36/0x60
        [<ffffffff81124c23>] rcu_nocb_kthread+0x1b3/0x550
        [<ffffffff81124b71>] ? rcu_nocb_kthread+0x101/0x550
        [<ffffffff81124a70>] ? sync_exp_work_done.constprop.63+0x50/0x50
        [<ffffffff810c59d1>] kthread+0x101/0x120
        [<ffffffff81101a59>] ? trace_hardirqs_on_caller+0xf9/0x1c0
        [<ffffffff817c2d32>] ret_from_fork+0x22/0x50
      
      To reduce the amount of contention on the pool_lock, the actual
      kmem_cache_free() of the debug objects will be delayed if the pool_lock
      is busy. This will temporarily increase the amount of free objects
      available at the free pool when the system is busy. As a result,
      the number of kmem_cache allocation and freeing is reduced.
      
      To further reduce the lock operations free debug objects in batches of
      four.
      
      Signed-off-by: default avatarWaiman Long <longman@redhat.com>
      Cc: Christian Borntraeger <borntraeger@de.ibm.com>
      Cc: "Du Changbin" <changbin.du@intel.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Jan Stancek <jstancek@redhat.com>
      Link: http://lkml.kernel.org/r/1483647425-4135-4-git-send-email-longman@redhat.com
      
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      858274b6
  12. Feb 04, 2017
  13. Dec 01, 2016
  14. Sep 17, 2016
  15. May 20, 2016
    • Changbin Du's avatar
      debugobjects: insulate non-fixup logic related to static obj from fixup callbacks · b9fdac7f
      Changbin Du authored
      When activating a static object we need make sure that the object is
      tracked in the object tracker.  If it is a non-static object then the
      activation is illegal.
      
      In previous implementation, each subsystem need take care of this in
      their fixup callbacks.  Actually we can put it into debugobjects core.
      Thus we can save duplicated code, and have *pure* fixup callbacks.
      
      To achieve this, a new callback "is_static_object" is introduced to let
      the type specific code decide whether a object is static or not.  If
      yes, we take it into object tracker, otherwise give warning and invoke
      fixup callback.
      
      This change has paassed debugobjects selftest, and I also do some test
      with all debugobjects supports enabled.
      
      At last, I have a concern about the fixups that can it change the object
      which is in incorrect state on fixup? Because the 'addr' may not point
      to any valid object if a non-static object is not tracked.  Then Change
      such object can overwrite someone's memory and cause unexpected
      behaviour.  For example, the timer_fixup_activate bind timer to function
      stub_timer.
      
      Link: http://lkml.kernel.org/r/1462576157-14539-1-git-send-email-changbin.du@intel.com
      [changbin.du@intel.com: improve code comments where invoke the new is_static_object callback]
        Link: http://lkml.kernel.org/r/1462777431-8171-1-git-send-email-changbin.du@intel.com
      
      
      Signed-off-by: default avatarDu, Changbin <changbin.du@intel.com>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Josh Triplett <josh@kernel.org>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Christian Borntraeger <borntraeger@de.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      b9fdac7f
    • Changbin Du's avatar
      debugobjects: correct the usage of fixup call results · e7a8e78b
      Changbin Du authored
      
      If debug_object_fixup() return non-zero when problem has been fixed.
      But the code got it backwards, it taks 0 as fixup successfully.  So fix
      it.
      
      Signed-off-by: default avatarDu, Changbin <changbin.du@intel.com>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Josh Triplett <josh@kernel.org>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Christian Borntraeger <borntraeger@de.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      e7a8e78b
    • Changbin Du's avatar
      debugobjects: make fixup functions return bool instead of int · b1e4d9d8
      Changbin Du authored
      
      I am going to introduce debugobjects infrastructure to USB subsystem.
      But before this, I found the code of debugobjects could be improved.
      This patchset will make fixup functions return bool type instead of int.
      Because fixup only need report success or no.  boolean is the 'real'
      type.
      
      This patch (of 7):
      
      The object debugging infrastructure core provides some fixup callbacks
      for the subsystem who use it.  These callbacks are called from the debug
      code whenever a problem in debug_object_init is detected.  And
      debugobjects core suppose them returns 1 when the fixup was successful,
      otherwise 0.  So the return type is boolean.
      
      A bad thing is that debug_object_fixup use the return value for
      arithmetic operation.  It confused me that what is the reall return
      type.
      
      Reading over the whole code, I found some place do use the return value
      incorrectly(see next patch).  So why use bool type instead?
      
      Signed-off-by: default avatarDu, Changbin <changbin.du@intel.com>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Josh Triplett <josh@kernel.org>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Christian Borntraeger <borntraeger@de.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      b1e4d9d8
  16. Jan 27, 2016
  17. Jun 04, 2014
  18. Nov 13, 2013
  19. Aug 19, 2013
    • Paul E. McKenney's avatar
      debugobjects: Make debug_object_activate() return status · b778ae25
      Paul E. McKenney authored
      
      In order to better respond to things like duplicate invocations
      of call_rcu(), RCU needs to see the status of a call to
      debug_object_activate().  This would allow RCU to leak the callback in
      order to avoid adding freelist-reuse mischief to the duplicate invoations.
      This commit therefore makes debug_object_activate() return status,
      zero for success and -EINVAL for failure.
      
      Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Cc: Sedat Dilek <sedat.dilek@gmail.com>
      Cc: Davidlohr Bueso <davidlohr.bueso@hp.com>
      Cc: Rik van Riel <riel@surriel.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Tested-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
      Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
      b778ae25
  20. Feb 28, 2013
    • Sasha Levin's avatar
      hlist: drop the node parameter from iterators · b67bfe0d
      Sasha Levin authored
      
      I'm not sure why, but the hlist for each entry iterators were conceived
      
              list_for_each_entry(pos, head, member)
      
      The hlist ones were greedy and wanted an extra parameter:
      
              hlist_for_each_entry(tpos, pos, head, member)
      
      Why did they need an extra pos parameter? I'm not quite sure. Not only
      they don't really need it, it also prevents the iterator from looking
      exactly like the list iterator, which is unfortunate.
      
      Besides the semantic patch, there was some manual work required:
      
       - Fix up the actual hlist iterators in linux/list.h
       - Fix up the declaration of other iterators based on the hlist ones.
       - A very small amount of places were using the 'node' parameter, this
       was modified to use 'obj->member' instead.
       - Coccinelle didn't handle the hlist_for_each_entry_safe iterator
       properly, so those had to be fixed up manually.
      
      The semantic patch which is mostly the work of Peter Senna Tschudin is here:
      
      @@
      iterator name hlist_for_each_entry, hlist_for_each_entry_continue, hlist_for_each_entry_from, hlist_for_each_entry_rcu, hlist_for_each_entry_rcu_bh, hlist_for_each_entry_continue_rcu_bh, for_each_busy_worker, ax25_uid_for_each, ax25_for_each, inet_bind_bucket_for_each, sctp_for_each_hentry, sk_for_each, sk_for_each_rcu, sk_for_each_from, sk_for_each_safe, sk_for_each_bound, hlist_for_each_entry_safe, hlist_for_each_entry_continue_rcu, nr_neigh_for_each, nr_neigh_for_each_safe, nr_node_for_each, nr_node_for_each_safe, for_each_gfn_indirect_valid_sp, for_each_gfn_sp, for_each_host;
      
      type T;
      expression a,c,d,e;
      identifier b;
      statement S;
      @@
      
      -T b;
          <+... when != b
      (
      hlist_for_each_entry(a,
      - b,
      c, d) S
      |
      hlist_for_each_entry_continue(a,
      - b,
      c) S
      |
      hlist_for_each_entry_from(a,
      - b,
      c) S
      |
      hlist_for_each_entry_rcu(a,
      - b,
      c, d) S
      |
      hlist_for_each_entry_rcu_bh(a,
      - b,
      c, d) S
      |
      hlist_for_each_entry_continue_rcu_bh(a,
      - b,
      c) S
      |
      for_each_busy_worker(a, c,
      - b,
      d) S
      |
      ax25_uid_for_each(a,
      - b,
      c) S
      |
      ax25_for_each(a,
      - b,
      c) S
      |
      inet_bind_bucket_for_each(a,
      - b,
      c) S
      |
      sctp_for_each_hentry(a,
      - b,
      c) S
      |
      sk_for_each(a,
      - b,
      c) S
      |
      sk_for_each_rcu(a,
      - b,
      c) S
      |
      sk_for_each_from
      -(a, b)
      +(a)
      S
      + sk_for_each_from(a) S
      |
      sk_for_each_safe(a,
      - b,
      c, d) S
      |
      sk_for_each_bound(a,
      - b,
      c) S
      |
      hlist_for_each_entry_safe(a,
      - b,
      c, d, e) S
      |
      hlist_for_each_entry_continue_rcu(a,
      - b,
      c) S
      |
      nr_neigh_for_each(a,
      - b,
      c) S
      |
      nr_neigh_for_each_safe(a,
      - b,
      c, d) S
      |
      nr_node_for_each(a,
      - b,
      c) S
      |
      nr_node_for_each_safe(a,
      - b,
      c, d) S
      |
      - for_each_gfn_sp(a, c, d, b) S
      + for_each_gfn_sp(a, c, d) S
      |
      - for_each_gfn_indirect_valid_sp(a, c, d, b) S
      + for_each_gfn_indirect_valid_sp(a, c, d) S
      |
      for_each_host(a,
      - b,
      c) S
      |
      for_each_host_safe(a,
      - b,
      c, d) S
      |
      for_each_mesh_entry(a,
      - b,
      c, d) S
      )
          ...+>
      
      [akpm@linux-foundation.org: drop bogus change from net/ipv4/raw.c]
      [akpm@linux-foundation.org: drop bogus hunk from net/ipv6/raw.c]
      [akpm@linux-foundation.org: checkpatch fixes]
      [akpm@linux-foundation.org: fix warnings]
      [akpm@linux-foudnation.org: redo intrusive kvm changes]
      Tested-by: default avatarPeter Senna Tschudin <peter.senna@gmail.com>
      Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
      Cc: Wu Fengguang <fengguang.wu@intel.com>
      Cc: Marcelo Tosatti <mtosatti@redhat.com>
      Cc: Gleb Natapov <gleb@redhat.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      b67bfe0d
  21. Apr 18, 2012
  22. Apr 11, 2012
  23. Mar 05, 2012
  24. Nov 23, 2011
  25. Jun 20, 2011
    • Marcin Slusarz's avatar
      debugobjects: Fix boot crash when kmemleak and debugobjects enabled · 161b6ae0
      Marcin Slusarz authored
      
      Order of initialization look like this:
      ...
      debugobjects
      kmemleak
      ...(lots of other subsystems)...
      workqueues (through early initcall)
      ...
      
      debugobjects use schedule_work for batch freeing of its data and kmemleak
      heavily use debugobjects, so when it comes to freeing and workqueues were
      not initialized yet, kernel crashes:
      
      BUG: unable to handle kernel NULL pointer dereference at           (null)
      IP: [<ffffffff810854d1>] __queue_work+0x29/0x41a
       [<ffffffff81085910>] queue_work_on+0x16/0x1d
       [<ffffffff81085abc>] queue_work+0x29/0x55
       [<ffffffff81085afb>] schedule_work+0x13/0x15
       [<ffffffff81242de1>] free_object+0x90/0x95
       [<ffffffff81242f6d>] debug_check_no_obj_freed+0x187/0x1d3
       [<ffffffff814b6504>] ? _raw_spin_unlock_irqrestore+0x30/0x4d
       [<ffffffff8110bd14>] ? free_object_rcu+0x68/0x6d
       [<ffffffff8110890c>] kmem_cache_free+0x64/0x12c
       [<ffffffff8110bd14>] free_object_rcu+0x68/0x6d
       [<ffffffff810b58bc>] __rcu_process_callbacks+0x1b6/0x2d9
      ...
      
      because system_wq is NULL.
      
      Fix it by checking if workqueues susbystem was initialized before using.
      
      Signed-off-by: default avatarMarcin Slusarz <marcin.slusarz@gmail.com>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Dipankar Sarma <dipankar@in.ibm.com>
      Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
      Cc: stable@kernel.org
      Link: http://lkml.kernel.org/r/20110528112342.GA3068@joi.lan
      
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      161b6ae0
  26. Mar 08, 2011
    • Stanislaw Gruszka's avatar
      debugobjects: Add hint for better object identification · 99777288
      Stanislaw Gruszka authored
      
      In complex subsystems like mac80211 structures can contain several
      timers and work structs, so identifying a specific instance from the
      call trace and object type output of debugobjects can be hard.
      
      Allow the subsystems which support debugobjects to provide a hint
      function. This function returns a pointer to a kernel address
      (preferrably the objects callback function) which is printed along
      with the debugobjects type.
      
      Add hint methods for timer_list, work_struct and hrtimer.
      
      [ tglx: Massaged changelog, made it compile ]
      
      Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
      LKML-Reference: <20110307085809.GA9334@redhat.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      99777288
  27. May 10, 2010
    • Mathieu Desnoyers's avatar
      Debugobjects transition check · a5d8e467
      Mathieu Desnoyers authored
      
      Implement a basic state machine checker in the debugobjects.
      
      This state machine checker detects races and inconsistencies within the "active"
      life of a debugobject. The checker only keeps track of the current state; all
      the state machine logic is kept at the object instance level.
      
      The checker works by adding a supplementary "unsigned int astate" field to the
      debug_obj structure. It keeps track of the current "active state" of the object.
      
      The only constraints that are imposed on the states by the debugobjects system
      is that:
      
      - activation of an object sets the current active state to 0,
      - deactivation of an object expects the current active state to be 0.
      
      For the rest of the states, the state mapping is determined by the specific
      object instance. Therefore, the logic keeping track of the state machine is
      within the specialized instance, without any need to know about it at the
      debugobject level.
      
      The current object active state is changed by calling:
      
      debug_object_active_state(addr, descr, expect, next)
      
      where "expect" is the expected state and "next" is the next state to move to if
      the expected state is found. A warning is generated if the expected is not
      found.
      
      Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
      CC: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
      CC: akpm@linux-foundation.org
      CC: mingo@elte.hu
      CC: laijs@cn.fujitsu.com
      CC: dipankar@in.ibm.com
      CC: josh@joshtriplett.org
      CC: dvhltc@us.ibm.com
      CC: niv@us.ibm.com
      CC: peterz@infradead.org
      CC: rostedt@goodmis.org
      CC: Valdis.Kletnieks@vt.edu
      CC: dhowells@redhat.com
      CC: eric.dumazet@gmail.com
      CC: Alexey Dobriyan <adobriyan@gmail.com>
      Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a5d8e467
  28. Mar 30, 2010
    • Tejun Heo's avatar
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking... · 5a0e3ad6
      Tejun Heo authored
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
      
      percpu.h is included by sched.h and module.h and thus ends up being
      included when building most .c files.  percpu.h includes slab.h which
      in turn includes gfp.h making everything defined by the two files
      universally available and complicating inclusion dependencies.
      
      percpu.h -> slab.h dependency is about to be removed.  Prepare for
      this change by updating users of gfp and slab facilities include those
      headers directly instead of assuming availability.  As this conversion
      needs to touch large number of source files, the following script is
      used as the basis of conversion.
      
        http://userweb.kernel.org/~tj/misc/slabh-sweep.py
      
      
      
      The script does the followings.
      
      * Scan files for gfp and slab usages and update includes such that
        only the necessary includes are there.  ie. if only gfp is used,
        gfp.h, if slab is used, slab.h.
      
      * When the script inserts a new include, it looks at the include
        blocks and try to put the new include such that its order conforms
        to its surrounding.  It's put in the include block which contains
        core kernel includes, in the same order that the rest are ordered -
        alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
        doesn't seem to be any matching order.
      
      * If the script can't find a place to put a new include (mostly
        because the file doesn't have fitting include block), it prints out
        an error message indicating which .h file needs to be added to the
        file.
      
      The conversion was done in the following steps.
      
      1. The initial automatic conversion of all .c files updated slightly
         over 4000 files, deleting around 700 includes and adding ~480 gfp.h
         and ~3000 slab.h inclusions.  The script emitted errors for ~400
         files.
      
      2. Each error was manually checked.  Some didn't need the inclusion,
         some needed manual addition while adding it to implementation .h or
         embedding .c file was more appropriate for others.  This step added
         inclusions to around 150 files.
      
      3. The script was run again and the output was compared to the edits
         from #2 to make sure no file was left behind.
      
      4. Several build tests were done and a couple of problems were fixed.
         e.g. lib/decompress_*.c used malloc/free() wrappers around slab
         APIs requiring slab.h to be added manually.
      
      5. The script was run on all .h files but without automatically
         editing them as sprinkling gfp.h and slab.h inclusions around .h
         files could easily lead to inclusion dependency hell.  Most gfp.h
         inclusion directives were ignored as stuff from gfp.h was usually
         wildly available and often used in preprocessor macros.  Each
         slab.h inclusion directive was examined and added manually as
         necessary.
      
      6. percpu.h was updated not to include slab.h.
      
      7. Build test were done on the following configurations and failures
         were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
         distributed build env didn't work with gcov compiles) and a few
         more options had to be turned off depending on archs to make things
         build (like ipr on powerpc/64 which failed due to missing writeq).
      
         * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
         * powerpc and powerpc64 SMP allmodconfig
         * sparc and sparc64 SMP allmodconfig
         * ia64 SMP allmodconfig
         * s390 SMP allmodconfig
         * alpha SMP allmodconfig
         * um on x86_64 SMP allmodconfig
      
      8. percpu.h modifications were reverted so that it could be applied as
         a separate patch and serve as bisection point.
      
      Given the fact that I had only a couple of failures from tests on step
      6, I'm fairly confident about the coverage of this conversion patch.
      If there is a breakage, it's likely to be something in one of the arch
      headers which should be easily discoverable easily on most builds of
      the specific arch.
      
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Guess-its-ok-by: default avatarChristoph Lameter <cl@linux-foundation.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
      5a0e3ad6
  29. Mar 26, 2010
    • Henrik Kretzschmar's avatar
      debugobjects: Section mismatch cleanup · 1fb2f77c
      Henrik Kretzschmar authored
      
      This patch marks two functions, which only get called at
      initialization, as __init.
      
      Here is also interesting, that modpost doesn't catch here the right
      function name.
      
      WARNING: lib/built-in.o(.text+0x585f): Section mismatch in reference
      from the function T.506() to the variable .init.data:obj
      The function T.506() references the variable __initdata obj.
      This is often because T.506 lacks a __initdata annotation or the 
      annotation of obj is wrong.
      
      Signed-off-by: default avatarHenrik Kretzschmar <henne@nachtwindheim.de>
      LKML-Reference: <1269632315-19403-1-git-send-email-henne@nachtwindheim.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      1fb2f77c
  30. Dec 14, 2009
Loading