mm_init_cpumask()

 

mm_init_cpumask()

include/linux/mm_types.h

static inline void mm_init_cpumask(struct mm_struct *mm)
{       
#ifdef CONFIG_CPUMASK_OFFSTACK
        mm->cpu_vm_mask_var = &mm->cpumask_allocation;
#endif
        cpumask_clear(mm->cpu_vm_mask_var);
}

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

  • mm->cpu_vm_mask_var = &mm->cpumask_allocation;
    • CONFIG_CPUMASK_OFFSTACK 커널 옵션을 상용하는 경우 할당 받은 메모리의 주소 cpumask_allocation을 사용해야 한다.
  • cpumask_clear(mm->cpu_vm_mask_var);
    • 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를 피할 수 있다.

 

참고

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.