/* * Return the pfn of the last free page of memory on a node. */ pfn_t node_getmaxclick(cnodeid_t node) { pfn_t slot_psize; int slot; /* * Start at the top slot. When we find a slot with memory in it, * that's the winner. */ for (slot = (node_getnumslots(node) - 1); slot >= 0; slot--) { if ((slot_psize = slot_getsize(node, slot))) { if (slot_psize == SLOT_IGNORED) continue; /* Return the basepfn + the slot size, minus 1. */ return slot_getbasepfn(node, slot) + slot_psize - 1; } } /* * If there's no memory on the node, return 0. This is likely * to cause problems. */ return (pfn_t)0; }
/* ARGSUSED */ int mem_refcnt_ioctl(devfs_handle_t dev, int cmd, void *arg, int mode, cred_t *cred_p, int *rvalp) { cnodeid_t node; int errcode; extern int numnodes; ASSERT( (hubspc_subdevice_t)(ulong)device_info_get(dev) == HUBSPC_REFCOUNTERS ); node = master_node_get(dev); ASSERT( (node >= 0) && (node < numnodes) ); ASSERT( NODEPDA(node)->migr_refcnt_counterbuffer != NULL); ASSERT( NODEPDA(node)->migr_refcnt_counterbase != NULL ); ASSERT( NODEPDA(node)->migr_refcnt_cbsize != 0 ); errcode = 0; switch (cmd) { case RCB_INFO_GET: { rcb_info_t rcb; rcb.rcb_len = NODEPDA(node)->migr_refcnt_cbsize; rcb.rcb_sw_sets = NODEPDA(node)->migr_refcnt_numsets; rcb.rcb_sw_counters_per_set = numnodes; rcb.rcb_sw_counter_size = sizeof(refcnt_t); rcb.rcb_base_pages = NODEPDA(node)->migr_refcnt_numsets / NUM_OF_HW_PAGES_PER_SW_PAGE(); rcb.rcb_base_page_size = NBPP; rcb.rcb_base_paddr = ctob(slot_getbasepfn(node, 0)); rcb.rcb_cnodeid = node; rcb.rcb_granularity = MD_PAGE_SIZE; #ifdef notyet rcb.rcb_hw_counter_max = MIGR_COUNTER_MAX_GET(node); rcb.rcb_diff_threshold = MIGR_THRESHOLD_DIFF_GET(node); #endif rcb.rcb_abs_threshold = MIGR_THRESHOLD_ABS_GET(node); rcb.rcb_num_slots = node_getnumslots(node); if (COPYOUT(&rcb, arg, sizeof(rcb_info_t))) { errcode = EFAULT; } break; } case RCB_SLOT_GET: { rcb_slot_t slot[MAX_MEM_SLOTS]; int s; int nslots; nslots = node_getnumslots(node); ASSERT(nslots <= MAX_MEM_SLOTS); for (s = 0; s < nslots; s++) { slot[s].base = (uint64_t)ctob(slot_getbasepfn(node, s)); #ifdef notyet slot[s].size = (uint64_t)ctob(slot_getsize(node, s)); #else slot[s].size = (uint64_t)1; #endif } if (COPYOUT(&slot[0], arg, nslots * sizeof(rcb_slot_t))) { errcode = EFAULT; } *rvalp = nslots; break; } default: errcode = EINVAL; break; } return errcode; }