cpu masks: optimize and clean up cpumask_of_cpu()

Previous thread: cpumask: change cpumask_of_cpu_ptr to use new cpumask_of_cpu by Linux Kernel Mailing List on Monday, July 28, 2008 - 3:59 pm. (1 message)

Next thread: exec: include pagemap.h again to fix build by Linux Kernel Mailing List on Monday, July 28, 2008 - 7:59 pm. (1 message)
From: Linux Kernel Mailing List
Date: Monday, July 28, 2008 - 3:59 pm

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e56b3b...
Commit:     e56b3bc7942982ac2589c942fb345e38bc7a341a
Parent:     414f746d232d41ed6ae8632c4495ae795373c44b
Author:     Linus Torvalds <torvalds@linux-foundation.org>
AuthorDate: Mon Jul 28 11:32:33 2008 -0700
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Mon Jul 28 22:20:41 2008 +0200

    cpu masks: optimize and clean up cpumask_of_cpu()
    
    Clean up and optimize cpumask_of_cpu(), by sharing all the zero words.
    
    Instead of stupidly generating all possible i=0...NR_CPUS 2^i patterns
    creating a huge array of constant bitmasks, realize that the zero words
    can be shared.
    
    In other words, on a 64-bit architecture, we only ever need 64 of these
    arrays - with a different bit set in one single world (with enough zero
    words around it so that we can create any bitmask by just offsetting in
    that big array). And then we just put enough zeroes around it that we
    can point every single cpumask to be one of those things.
    
    So when we have 4k CPU's, instead of having 4k arrays (of 4k bits each,
    with one bit set in each array - 2MB memory total), we have exactly 64
    arrays instead, each 8k bits in size (64kB total).
    
    And then we just point cpumask(n) to the right position (which we can
    calculate dynamically). Once we have the right arrays, getting
    "cpumask(n)" ends up being:
    
      static inline const cpumask_t *get_cpu_mask(unsigned int cpu)
      {
              const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG];
              p -= cpu / BITS_PER_LONG;
              return (const cpumask_t *)p;
      }
    
    This brings other advantages and simplifications as well:
    
     - we are not wasting memory that is just filled with a single bit in
       various different places
    
     - we don't need all those games to re-create the arrays in some ...
Previous thread: cpumask: change cpumask_of_cpu_ptr to use new cpumask_of_cpu by Linux Kernel Mailing List on Monday, July 28, 2008 - 3:59 pm. (1 message)

Next thread: exec: include pagemap.h again to fix build by Linux Kernel Mailing List on Monday, July 28, 2008 - 7:59 pm. (1 message)