From: bellard Date: Wed, 25 Jun 2003 00:08:13 +0000 (+0000) Subject: faster task switch X-Git-Tag: v0.4.0~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7c2d6a781cb806fdb99837015c773398f582caf1;p=thirdparty%2Fqemu.git faster task switch git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@270 c046a42c-6fe2-441c-8c8c-71466251a162 --- diff --git a/exec.c b/exec.c index f7fdc03592f..636fe25b801 100644 --- a/exec.c +++ b/exec.c @@ -585,22 +585,32 @@ void page_unmap(void) { PageDesc *p, *pmap; unsigned long addr; - int i, j, ret; + int i, j, ret, j1; for(i = 0; i < L1_SIZE; i++) { pmap = l1_map[i]; if (pmap) { p = pmap; - for(j = 0;j < L2_SIZE; j++) { + for(j = 0;j < L2_SIZE;) { if (p->flags & PAGE_VALID) { addr = (i << (32 - L1_BITS)) | (j << TARGET_PAGE_BITS); - ret = munmap((void *)addr, TARGET_PAGE_SIZE); + /* we try to find a range to make less syscalls */ + j1 = j; + p++; + j++; + while (j < L2_SIZE && (p->flags & PAGE_VALID)) { + p++; + j++; + } + ret = munmap((void *)addr, (j - j1) << TARGET_PAGE_BITS); if (ret != 0) { fprintf(stderr, "Could not unmap page 0x%08lx\n", addr); exit(1); } + } else { + p++; + j++; } - p++; } free(pmap); l1_map[i] = NULL;