[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: UVM (Re: MNN)
>> bzero をちゃんと書き直すのが筋ですね。
ということでちょっと試してみました。すぐに思いつくようなコードですが
今の for (...) *p++ = 0; よりはずっと速いはずです(最後につけときます)。
これでカーネルをコンパイルする時間を測定してみたら、やっぱり5%ぐらい
速くなってました。ってことで bzero に関しては pmap_zero_page が主要な
寄与となっているみたいです。
# つまりこんなことしなくても pmap_zero_page だけおきかえりゃいいと。
# なんだかなー。
userland はどうなるでしょうねえ…。(めんどうなのでやってません:-)
void
bzero(from, len)
void *from;
size_t len;
{
int count;
union {
int i;
int *ip;
char *cp;
} addr;
addr.ip = from;
count = (-addr.i) & 0x03; /* 4n までの残り */
if (len > count) {
len -= count;
while (count-- > 0)
*addr.cp++ = 0;
/*** ここで 4n ***/
count = (-addr.i) & 0x1f; /* 32n までの残り */
if (len > count) {
len -= count;
count /= 4;
while (count-- > 0)
*addr.ip++ = 0;
/*** ここで 32n ***/
count = len / 32;
len -= 32 * count;
while (count-- > 0) {
__asm __volatile ("dcbz 0,%0" :: "r"(addr.ip));
addr.i += 32;
}
}
count = len / 4;
len -= 4 * count;
while (count-- > 0)
*addr.ip++ = 0;
}
while (len-- > 0)
*addr.cp++ = 0;
}
ここには書いていませんが、dcbz は cold == 1 では使わないようにしないと
うごかないかもしれません。