提交 d99255d2 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

cacheline-align kmalloc

上级 3bda7e20
...@@ -134,17 +134,10 @@ kalloc(void) ...@@ -134,17 +134,10 @@ kalloc(void)
// Memory allocator by Kernighan and Ritchie, // Memory allocator by Kernighan and Ritchie,
// The C programming Language, 2nd ed. Section 8.7. // The C programming Language, 2nd ed. Section 8.7.
typedef long Align; typedef struct header {
struct header *ptr;
union header { uint size; // in multiples of sizeof(Header)
struct { } __attribute__ ((aligned (CACHELINE))) Header;
union header *ptr;
uint size; // in multiples of sizeof(Header)
} s;
Align x;
};
typedef union header Header;
static struct freelist { static struct freelist {
Header base; Header base;
...@@ -169,19 +162,19 @@ domfree(void *ap) ...@@ -169,19 +162,19 @@ domfree(void *ap)
Header *bp, *p; Header *bp, *p;
bp = (Header*)ap - 1; bp = (Header*)ap - 1;
for(p = freelists[cpu->id].freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) for(p = freelists[cpu->id].freep; !(bp > p && bp < p->ptr); p = p->ptr)
if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) if(p >= p->ptr && (bp > p || bp < p->ptr))
break; break;
if(bp + bp->s.size == p->s.ptr){ if(bp + bp->size == p->ptr){
bp->s.size += p->s.ptr->s.size; bp->size += p->ptr->size;
bp->s.ptr = p->s.ptr->s.ptr; bp->ptr = p->ptr->ptr;
} else } else
bp->s.ptr = p->s.ptr; bp->ptr = p->ptr;
if(p + p->s.size == bp){ if(p + p->size == bp){
p->s.size += bp->s.size; p->size += bp->size;
p->s.ptr = bp->s.ptr; p->ptr = bp->ptr;
} else } else
p->s.ptr = bp; p->ptr = bp;
freelists[cpu->id].freep = p; freelists[cpu->id].freep = p;
} }
...@@ -205,17 +198,18 @@ morecore(uint nu) ...@@ -205,17 +198,18 @@ morecore(uint nu)
{ {
char *p; char *p;
Header *hp; Header *hp;
static uint units_per_page = PGSIZE / sizeof(Header);
if(nu != 512) { if(nu != units_per_page) {
if (nu > 512) if (nu > units_per_page)
panic("morecore"); panic("morecore");
nu = 512; // we allocate nu * sizeof(Header) nu = units_per_page; // we allocate nu * sizeof(Header)
} }
p = kalloc(); p = kalloc();
if(p == 0) if(p == 0)
return 0; return 0;
hp = (Header*)p; hp = (Header*)p;
hp->s.size = nu; hp->size = nu;
domfree((void*)(hp + 1)); domfree((void*)(hp + 1));
return freelists[cpu->id].freep; return freelists[cpu->id].freep;
} }
...@@ -230,17 +224,17 @@ kmalloc(uint nbytes) ...@@ -230,17 +224,17 @@ kmalloc(uint nbytes)
acquire(&freelists[cpu->id].lock); acquire(&freelists[cpu->id].lock);
nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
if((prevp = freelists[cpu->id].freep) == 0){ if((prevp = freelists[cpu->id].freep) == 0){
freelists[cpu->id].base.s.ptr = freelists[cpu->id].freep = prevp = &freelists[cpu->id].base; freelists[cpu->id].base.ptr = freelists[cpu->id].freep = prevp = &freelists[cpu->id].base;
freelists[cpu->id].base.s.size = 0; freelists[cpu->id].base.size = 0;
} }
for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ for(p = prevp->ptr; ; prevp = p, p = p->ptr){
if(p->s.size >= nunits){ if(p->size >= nunits){
if(p->s.size == nunits) if(p->size == nunits)
prevp->s.ptr = p->s.ptr; prevp->ptr = p->ptr;
else { else {
p->s.size -= nunits; p->size -= nunits;
p += p->s.size; p += p->size;
p->s.size = nunits; p->size = nunits;
} }
freelists[cpu->id].freep = prevp; freelists[cpu->id].freep = prevp;
r = (void*)(p + 1); r = (void*)(p + 1);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论