Date: Fri, 10 Aug 2012 19:57:50 +0800 From: Paul Ambrose <ambrosehua@gmail.com> To: freebsd-mips@freebsd.org Subject: tlb.c tlb_invalidate_all_user simplified Message-ID: <CAMwoQQ6sFSh3MuPivwszTUOF0tWZRYMxtwEjtbRLE0X%2Bpx_Xfw@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
when I saw this commit,
commit e60abd7cb37fb1b66e8b0c48050aa56732c73e90
Author: alc <alc@FreeBSD.org>
Date: Fri Aug 10 05:00:50 2012 +0000
Merge r134393 from amd64/i386:
The machine-independent parts of the virtual memory system always
pass a
valid pmap to the pmap functions that require one. Remove the checks
for
NULL. (These checks have their origins in the Mach pmap.c that was
integrated into BSD. None of the new code written specifically for
FreeBSD included them.)
according to the description here, pmap should not be null, I think
tlb_invalidate_all_user(struct pmap * pmap), in mips/mips/tlb.c
----------------------------------------------------------------------------------------------------
tlb_invalidate_all_user(struct pmap *pmap)
{
register_t asid;
register_t s;
unsigned i;
s = intr_disable();
asid = mips_rd_entryhi() & TLBHI_ASID_MASK;
for (i = mips_rd_wired(); i < num_tlbentries; i++) {
register_t uasid;
mips_wr_index(i);
tlb_read();
uasid = mips_rd_entryhi() & TLBHI_ASID_MASK;
if (pmap == NULL) {
/*
* Invalidate all non-kernel entries.
*/
if (uasid == 0)
continue;
} else {
/*
* Invalidate this pmap's entries.
*/
if (uasid != pmap_asid(pmap))
continue;
}
tlb_invalidate_one(i);
}
mips_wr_entryhi(asid);
intr_restore(s);
}
---------------------------------------------------------------------------
could be simplified like this:
---------------------------------------------------------------------------
tlb_invalidate_all_user(struct pmap *pmap)
{
register_t asid;
register_t s;
unsigned i;
s = intr_disable();
asid = mips_rd_entryhi() & TLBHI_ASID_MASK;
for (i = mips_rd_wired(); i < num_tlbentries; i++) {
register_t uasid;
mips_wr_index(i);
tlb_read();
uasid = mips_rd_entryhi() & TLBHI_ASID_MASK;
if ((uasid != pmap_asid(pmap)) || (uasid == 0))
continue;
tlb_invalidate_one(i);
}
mips_wr_entryhi(asid);
intr_restore(s);
}
funcntion tlb_invalidate_all_user(struct pmap *pmap) is ONLY called like
this:
pmap_activate -> pmap_alloc_asid -> tlb_invalidate_all_user, I think the
pmap passed
fullfils the assumption. How do you like it ?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAMwoQQ6sFSh3MuPivwszTUOF0tWZRYMxtwEjtbRLE0X%2Bpx_Xfw>
