Print this page
const-ify make segment ops structures
There is no reason to keep the segment ops structures writable.
segop_getpolicy already checks for a NULL op
seg_inherit_notsup is redundant since segop_inherit checks for NULL properly
no need for bad-op segment op functions
The segment drivers have a number of bad-op functions that simply panic.
Keeping the function pointer NULL will accomplish the same thing in most
cases.  In other cases, keeping the function pointer NULL will result in
proper error code being returned.
patch lower-case-segops
use C99 initializers in segment ops structures
remove whole-process swapping
Long before Unix supported paging, it used process swapping to reclaim
memory.  The code is there and in theory it runs when we get *extremely* low
on memory.  In practice, it never runs since the definition of low-on-memory
is antiquated. (XXX: define what antiquated means)
You can check the number of swapout/swapin events with kstats:
$ kstat -p ::vm:swapin ::vm:swapout

*** 426,443 **** #endif boot_mapin((caddr_t)addr, size); return (addr); } - static void - segkmem_badop() - { - panic("segkmem_badop"); - } - - #define SEGKMEM_BADOP(t) (t(*)())segkmem_badop - /*ARGSUSED*/ static faultcode_t segkmem_fault(struct hat *hat, struct seg *seg, caddr_t addr, size_t size, enum fault_type type, enum seg_rw rw) { --- 426,435 ----
*** 455,465 **** /* * If it is one of segkp pages, call segkp_fault. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (SEGOP_FAULT(hat, segkp, addr, size, type, rw)); if (rw != S_READ && rw != S_WRITE && rw != S_OTHER) return (FC_NOSUPPORT); npages = btopr(size); --- 447,457 ---- /* * If it is one of segkp pages, call segkp_fault. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (segop_fault(hat, segkp, addr, size, type, rw)); if (rw != S_READ && rw != S_WRITE && rw != S_OTHER) return (FC_NOSUPPORT); npages = btopr(size);
*** 517,527 **** /* * If it is one of segkp pages, call segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (SEGOP_SETPROT(segkp, addr, size, prot)); if (prot == 0) hat_unload(kas.a_hat, addr, size, HAT_UNLOAD); else hat_chgprot(kas.a_hat, addr, size, prot); --- 509,519 ---- /* * If it is one of segkp pages, call segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (segop_setprot(segkp, addr, size, prot)); if (prot == 0) hat_unload(kas.a_hat, addr, size, HAT_UNLOAD); else hat_chgprot(kas.a_hat, addr, size, prot);
*** 537,556 **** segkmem_checkprot(struct seg *seg, caddr_t addr, size_t size, uint_t prot) { ASSERT(RW_LOCK_HELD(&seg->s_as->a_lock)); if (seg->s_as != &kas) ! segkmem_badop(); /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (SEGOP_CHECKPROT(segkp, addr, size, prot)); ! segkmem_badop(); return (0); } /* * This is a dummy segkmem function overloaded to call segkp --- 529,548 ---- segkmem_checkprot(struct seg *seg, caddr_t addr, size_t size, uint_t prot) { ASSERT(RW_LOCK_HELD(&seg->s_as->a_lock)); if (seg->s_as != &kas) ! panic("segkmem badop"); /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (segop_checkprot(segkp, addr, size, prot)); ! panic("segkmem badop"); return (0); } /* * This is a dummy segkmem function overloaded to call segkp
*** 561,580 **** segkmem_kluster(struct seg *seg, caddr_t addr, ssize_t delta) { ASSERT(RW_LOCK_HELD(&seg->s_as->a_lock)); if (seg->s_as != &kas) ! segkmem_badop(); /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (SEGOP_KLUSTER(segkp, addr, delta)); ! segkmem_badop(); return (0); } static void segkmem_xdump_range(void *arg, void *start, size_t size) --- 553,572 ---- segkmem_kluster(struct seg *seg, caddr_t addr, ssize_t delta) { ASSERT(RW_LOCK_HELD(&seg->s_as->a_lock)); if (seg->s_as != &kas) ! panic("segkmem badop"); /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (segop_kluster(segkp, addr, delta)); ! panic("segkmem badop"); return (0); } static void segkmem_xdump_range(void *arg, void *start, size_t size)
*** 689,699 **** /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (SEGOP_PAGELOCK(segkp, addr, len, ppp, type, rw)); npages = btopr(len); nb = sizeof (page_t *) * npages; if (type == L_PAGEUNLOCK) { --- 681,691 ---- /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (segop_pagelock(segkp, addr, len, ppp, type, rw)); npages = btopr(len); nb = sizeof (page_t *) * npages; if (type == L_PAGEUNLOCK) {
*** 742,805 **** segkmem_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp) { ASSERT(RW_LOCK_HELD(&seg->s_as->a_lock)); if (seg->s_as != &kas) ! segkmem_badop(); /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (SEGOP_GETMEMID(segkp, addr, memidp)); ! segkmem_badop(); return (0); } /*ARGSUSED*/ - static lgrp_mem_policy_info_t * - segkmem_getpolicy(struct seg *seg, caddr_t addr) - { - return (NULL); - } - - /*ARGSUSED*/ static int segkmem_capable(struct seg *seg, segcapability_t capability) { if (capability == S_CAPABILITY_NOMINFLT) return (1); return (0); } ! static struct seg_ops segkmem_ops = { ! SEGKMEM_BADOP(int), /* dup */ ! SEGKMEM_BADOP(int), /* unmap */ ! SEGKMEM_BADOP(void), /* free */ ! segkmem_fault, ! SEGKMEM_BADOP(faultcode_t), /* faulta */ ! segkmem_setprot, ! segkmem_checkprot, ! segkmem_kluster, ! SEGKMEM_BADOP(size_t), /* swapout */ ! SEGKMEM_BADOP(int), /* sync */ ! SEGKMEM_BADOP(size_t), /* incore */ ! SEGKMEM_BADOP(int), /* lockop */ ! SEGKMEM_BADOP(int), /* getprot */ ! SEGKMEM_BADOP(u_offset_t), /* getoffset */ ! SEGKMEM_BADOP(int), /* gettype */ ! SEGKMEM_BADOP(int), /* getvp */ ! SEGKMEM_BADOP(int), /* advise */ ! segkmem_dump, ! segkmem_pagelock, ! SEGKMEM_BADOP(int), /* setpgsz */ ! segkmem_getmemid, ! segkmem_getpolicy, /* getpolicy */ ! segkmem_capable, /* capable */ ! seg_inherit_notsup /* inherit */ }; int segkmem_zio_create(struct seg *seg) { --- 734,774 ---- segkmem_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp) { ASSERT(RW_LOCK_HELD(&seg->s_as->a_lock)); if (seg->s_as != &kas) ! panic("segkmem badop"); /* * If it is one of segkp pages, call into segkp. */ if (segkp_bitmap && seg == &kvseg && BT_TEST(segkp_bitmap, btop((uintptr_t)(addr - seg->s_base)))) ! return (segop_getmemid(segkp, addr, memidp)); ! panic("segkmem badop"); return (0); } /*ARGSUSED*/ static int segkmem_capable(struct seg *seg, segcapability_t capability) { if (capability == S_CAPABILITY_NOMINFLT) return (1); return (0); } ! static const struct seg_ops segkmem_ops = { ! .fault = segkmem_fault, ! .setprot = segkmem_setprot, ! .checkprot = segkmem_checkprot, ! .kluster = segkmem_kluster, ! .dump = segkmem_dump, ! .pagelock = segkmem_pagelock, ! .getmemid = segkmem_getmemid, ! .capable = segkmem_capable, }; int segkmem_zio_create(struct seg *seg) {