スラブの色付け
スラブの色付け。とは如何なる事を言うのでしょうか? なにやらネーミングからして興味が注がれてしまいます。
まずスラブの構造ですが、物理的に連続するメモリーに以下のようになっています。
struct slabはスラブ全体の属性です。struct kmem_bufctl_t[]はオブジェクトのインデックスに対応するunsigned int型の配列で、未使用のオブジェクトに対して意味があり、次の未使用のオブジェクトのインデックスを有しています。従って最後のオブジェクトに対してはBUFCTL_ENDが設定されていて、スラブ内に空きオブジェクトが無い。という判断に使われています。
この空き分を利用して、先頭のstruct slabの位置をスラブ毎にずらして配置しようというものです。このずらすことを色付けと言います。
なぜずらして配置するかと言うのは、CPUのキャッシュとの兼ね合いだそうです。オブジェサイズの同じスラブ内では、どのオブジェクトのオフセットは同じになってしまいます。そうなると下位アドレスでキャシュラインとしている場合、同じスラブを使っている処理では、キャッシュラインを奪い合う率が高くなる。というようなことのようで・・・。 まあ、ハード的に下位のアドレスは同じにしない方がいいというぐらいの理解で。
で、先頭位置をずらす場合もアライメント単位である必要があります。従ってずらすパターンは、空き/アライメント個となります。これがまさしくカラーです。この値は kmem_cache->color値としてセットされています。
kmem_cache->kmem_list3->colour_nextには、追加するスラブの色となります。kmem_cacheにスラブを追加する時、この分配置をずらし、次のスラブのためにインクリメントしていきます。そしてこれがkmem_cache->colorになったら0として、同じような処理で配置すると行った具合です。なお、空きが少なければ、色する絵の具の少ないということのようです。
従って実際のスラブの配置は、上のイメージでなく下記のような構成となります。
空き1=アライメント×kmem_cache->kmem_list3->colour_next
空き2=空き - アライメント×kmem_cache->kmem_list3->colour_next
補足
struct slab|struct kmem_bufctl_t[]をスラブ外に持たせる配置の仕方もあるようです。
まずスラブの構造ですが、物理的に連続するメモリーに以下のようになっています。
struct slab | struct kmem_bufctl_t[] | オブジェクト1 | ・・・ | オブジェクトn | 空き |
struct slabはスラブ全体の属性です。struct kmem_bufctl_t[]はオブジェクトのインデックスに対応するunsigned int型の配列で、未使用のオブジェクトに対して意味があり、次の未使用のオブジェクトのインデックスを有しています。従って最後のオブジェクトに対してはBUFCTL_ENDが設定されていて、スラブ内に空きオブジェクトが無い。という判断に使われています。
struct slab { struct list_head list; unsigned long colouroff; void *s_mem; /* including colour offset */ unsigned int inuse; /* num of objs active in slab */ kmem_bufctl_t free; unsigned short nodeid; }; typedef unsigned int kmem_bufctl_t;メモリーをアクセスはワード単位で行ったほうがパフォーマンスが上がります。従ってスタブのオブジェクトサイズはワード単位に調整されているわけですが、どっちにしてもワード単位での空きが発生いたします。(無い場合もありますが。)
この空き分を利用して、先頭のstruct slabの位置をスラブ毎にずらして配置しようというものです。このずらすことを色付けと言います。
なぜずらして配置するかと言うのは、CPUのキャッシュとの兼ね合いだそうです。オブジェサイズの同じスラブ内では、どのオブジェクトのオフセットは同じになってしまいます。そうなると下位アドレスでキャシュラインとしている場合、同じスラブを使っている処理では、キャッシュラインを奪い合う率が高くなる。というようなことのようで・・・。 まあ、ハード的に下位のアドレスは同じにしない方がいいというぐらいの理解で。
で、先頭位置をずらす場合もアライメント単位である必要があります。従ってずらすパターンは、空き/アライメント個となります。これがまさしくカラーです。この値は kmem_cache->color値としてセットされています。
kmem_cache->kmem_list3->colour_nextには、追加するスラブの色となります。kmem_cacheにスラブを追加する時、この分配置をずらし、次のスラブのためにインクリメントしていきます。そしてこれがkmem_cache->colorになったら0として、同じような処理で配置すると行った具合です。なお、空きが少なければ、色する絵の具の少ないということのようです。
従って実際のスラブの配置は、上のイメージでなく下記のような構成となります。
空き1=アライメント×kmem_cache->kmem_list3->colour_next
空き2=空き - アライメント×kmem_cache->kmem_list3->colour_next
空き1 | struct slab | struct kmem_bufctl_t[] | オブジェクト1 | ・・・ | オブジェクトn | 空き2 |
補足
struct slab|struct kmem_bufctl_t[]をスラブ外に持たせる配置の仕方もあるようです。