1919#include <linux/slab.h>
2020#include <linux/hash.h>
2121#include <linux/kmemleak.h>
22+ #include <linux/cpu.h>
2223
2324#define ODEBUG_HASH_BITS 14
2425#define ODEBUG_HASH_SIZE (1 << ODEBUG_HASH_BITS)
@@ -90,7 +91,7 @@ static int debug_objects_pool_size __read_mostly
9091 = ODEBUG_POOL_SIZE ;
9192static int debug_objects_pool_min_level __read_mostly
9293 = ODEBUG_POOL_MIN_LEVEL ;
93- static struct debug_obj_descr * descr_test __read_mostly ;
94+ static const struct debug_obj_descr * descr_test __read_mostly ;
9495static struct kmem_cache * obj_cache __read_mostly ;
9596
9697/*
@@ -223,7 +224,7 @@ static struct debug_obj *__alloc_object(struct hlist_head *list)
223224 * Must be called with interrupts disabled.
224225 */
225226static struct debug_obj *
226- alloc_object (void * addr , struct debug_bucket * b , struct debug_obj_descr * descr )
227+ alloc_object (void * addr , struct debug_bucket * b , const struct debug_obj_descr * descr )
227228{
228229 struct debug_percpu_free * percpu_pool = this_cpu_ptr (& percpu_obj_pool );
229230 struct debug_obj * obj ;
@@ -433,6 +434,25 @@ static void free_object(struct debug_obj *obj)
433434 }
434435}
435436
437+ #ifdef CONFIG_HOTPLUG_CPU
438+ static int object_cpu_offline (unsigned int cpu )
439+ {
440+ struct debug_percpu_free * percpu_pool ;
441+ struct hlist_node * tmp ;
442+ struct debug_obj * obj ;
443+
444+ /* Remote access is safe as the CPU is dead already */
445+ percpu_pool = per_cpu_ptr (& percpu_obj_pool , cpu );
446+ hlist_for_each_entry_safe (obj , tmp , & percpu_pool -> free_objs , node ) {
447+ hlist_del (& obj -> node );
448+ kmem_cache_free (obj_cache , obj );
449+ }
450+ percpu_pool -> obj_free = 0 ;
451+
452+ return 0 ;
453+ }
454+ #endif
455+
436456/*
437457 * We run out of memory. That means we probably have tons of objects
438458 * allocated.
@@ -475,7 +495,7 @@ static struct debug_bucket *get_bucket(unsigned long addr)
475495
476496static void debug_print_object (struct debug_obj * obj , char * msg )
477497{
478- struct debug_obj_descr * descr = obj -> descr ;
498+ const struct debug_obj_descr * descr = obj -> descr ;
479499 static int limit ;
480500
481501 if (limit < 5 && descr != descr_test ) {
@@ -529,7 +549,7 @@ static void debug_object_is_on_stack(void *addr, int onstack)
529549}
530550
531551static void
532- __debug_object_init (void * addr , struct debug_obj_descr * descr , int onstack )
552+ __debug_object_init (void * addr , const struct debug_obj_descr * descr , int onstack )
533553{
534554 enum debug_obj_state state ;
535555 bool check_stack = false;
@@ -587,7 +607,7 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack)
587607 * @addr: address of the object
588608 * @descr: pointer to an object specific debug description structure
589609 */
590- void debug_object_init (void * addr , struct debug_obj_descr * descr )
610+ void debug_object_init (void * addr , const struct debug_obj_descr * descr )
591611{
592612 if (!debug_objects_enabled )
593613 return ;
@@ -602,7 +622,7 @@ EXPORT_SYMBOL_GPL(debug_object_init);
602622 * @addr: address of the object
603623 * @descr: pointer to an object specific debug description structure
604624 */
605- void debug_object_init_on_stack (void * addr , struct debug_obj_descr * descr )
625+ void debug_object_init_on_stack (void * addr , const struct debug_obj_descr * descr )
606626{
607627 if (!debug_objects_enabled )
608628 return ;
@@ -617,7 +637,7 @@ EXPORT_SYMBOL_GPL(debug_object_init_on_stack);
617637 * @descr: pointer to an object specific debug description structure
618638 * Returns 0 for success, -EINVAL for check failed.
619639 */
620- int debug_object_activate (void * addr , struct debug_obj_descr * descr )
640+ int debug_object_activate (void * addr , const struct debug_obj_descr * descr )
621641{
622642 enum debug_obj_state state ;
623643 struct debug_bucket * db ;
@@ -695,7 +715,7 @@ EXPORT_SYMBOL_GPL(debug_object_activate);
695715 * @addr: address of the object
696716 * @descr: pointer to an object specific debug description structure
697717 */
698- void debug_object_deactivate (void * addr , struct debug_obj_descr * descr )
718+ void debug_object_deactivate (void * addr , const struct debug_obj_descr * descr )
699719{
700720 struct debug_bucket * db ;
701721 struct debug_obj * obj ;
@@ -747,7 +767,7 @@ EXPORT_SYMBOL_GPL(debug_object_deactivate);
747767 * @addr: address of the object
748768 * @descr: pointer to an object specific debug description structure
749769 */
750- void debug_object_destroy (void * addr , struct debug_obj_descr * descr )
770+ void debug_object_destroy (void * addr , const struct debug_obj_descr * descr )
751771{
752772 enum debug_obj_state state ;
753773 struct debug_bucket * db ;
@@ -797,7 +817,7 @@ EXPORT_SYMBOL_GPL(debug_object_destroy);
797817 * @addr: address of the object
798818 * @descr: pointer to an object specific debug description structure
799819 */
800- void debug_object_free (void * addr , struct debug_obj_descr * descr )
820+ void debug_object_free (void * addr , const struct debug_obj_descr * descr )
801821{
802822 enum debug_obj_state state ;
803823 struct debug_bucket * db ;
@@ -838,7 +858,7 @@ EXPORT_SYMBOL_GPL(debug_object_free);
838858 * @addr: address of the object
839859 * @descr: pointer to an object specific debug description structure
840860 */
841- void debug_object_assert_init (void * addr , struct debug_obj_descr * descr )
861+ void debug_object_assert_init (void * addr , const struct debug_obj_descr * descr )
842862{
843863 struct debug_bucket * db ;
844864 struct debug_obj * obj ;
@@ -886,7 +906,7 @@ EXPORT_SYMBOL_GPL(debug_object_assert_init);
886906 * @next: state to move to if expected state is found
887907 */
888908void
889- debug_object_active_state (void * addr , struct debug_obj_descr * descr ,
909+ debug_object_active_state (void * addr , const struct debug_obj_descr * descr ,
890910 unsigned int expect , unsigned int next )
891911{
892912 struct debug_bucket * db ;
@@ -934,7 +954,7 @@ EXPORT_SYMBOL_GPL(debug_object_active_state);
934954static void __debug_check_no_obj_freed (const void * address , unsigned long size )
935955{
936956 unsigned long flags , oaddr , saddr , eaddr , paddr , chunks ;
937- struct debug_obj_descr * descr ;
957+ const struct debug_obj_descr * descr ;
938958 enum debug_obj_state state ;
939959 struct debug_bucket * db ;
940960 struct hlist_node * tmp ;
@@ -1052,7 +1072,7 @@ struct self_test {
10521072 unsigned long dummy2 [3 ];
10531073};
10541074
1055- static __initdata struct debug_obj_descr descr_type_test ;
1075+ static __initconst const struct debug_obj_descr descr_type_test ;
10561076
10571077static bool __init is_static_object (void * addr )
10581078{
@@ -1177,7 +1197,7 @@ check_results(void *addr, enum debug_obj_state state, int fixups, int warnings)
11771197 return res ;
11781198}
11791199
1180- static __initdata struct debug_obj_descr descr_type_test = {
1200+ static __initconst const struct debug_obj_descr descr_type_test = {
11811201 .name = "selftest" ,
11821202 .is_static_object = is_static_object ,
11831203 .fixup_init = fixup_init ,
@@ -1367,6 +1387,11 @@ void __init debug_objects_mem_init(void)
13671387 } else
13681388 debug_objects_selftest ();
13691389
1390+ #ifdef CONFIG_HOTPLUG_CPU
1391+ cpuhp_setup_state_nocalls (CPUHP_DEBUG_OBJ_DEAD , "object:offline" , NULL ,
1392+ object_cpu_offline );
1393+ #endif
1394+
13701395 /*
13711396 * Increase the thresholds for allocating and freeing objects
13721397 * according to the number of possible CPUs available in the system.
0 commit comments