mm_init_cpumask()

<kernel v5.0>

mm_init_cpumask()

include/linux/mm_types.h

/* Pointer magic because the dynamic array size confuses some compilers. */
static inline void mm_init_cpumask(struct mm_struct *mm)
{
        unsigned long cpu_bitmap = (unsigned long)mm;

        cpu_bitmap += offsetof(struct mm_struct, cpu_bitmap);
        cpumask_clear((struct cpumask *)cpu_bitmap);
}

cpu mask 비트맵을 cpu 수만큼 비트 clear한다.

 

cpumask_clear()

include/linux/cpumask.h

/**
 * cpumask_clear - clear all cpus (< nr_cpu_ids) in a cpumask
 * @dstp: the cpumask pointer 
 */
static inline void cpumask_clear(struct cpumask *dstp)
{       
        bitmap_zero(cpumask_bits(dstp), nr_cpumask_bits);
}

nr_cpumask_bits 수 만큼 비트를 dstp->bits를 clear 한다.

 

CONFIG_CPUMASK_OFFSTACK

config CPUMASK_OFFSTACK
        bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS
        help
          Use dynamic allocation for cpumask_var_t, instead of putting
          them on the stack.  This is a bit more expensive, but avoids
          stack overflow.
  • CONFIG_CPUMASK_OFFSTACK 커널 옵션을 사용하면 cpu 수가 많은 경우 cpu 수 만큼 비트맵으로 처리되는 cpumask의 크기가 커진다. 이의 처리를 스택을 통해 처리하지 않도록 별도의 메모리를 할당받아 사용하는 방법으로 stack overflow를 피할 수 있다.

 

참고

댓글 남기기