int mfs_ramdir_remove( VNODE_T *dvp, char *nm, VNODE_T **vpp, CALL_DATA_T *cd ) { register mfs_mnode_t *mnp; register int vnum; int error; ASSERT(MFS_ISVIEWDIR(VTOM(dvp))); mnp = VTOM(dvp); MLOCK(mnp); error = ENOENT; for (vnum=0; vnum < mnp->mn_ramdir.hwm; vnum++) { if (mnp->mn_ramdir.ents[vnum].nm == NULL) continue; if (STRCMP(mnp->mn_ramdir.ents[vnum].nm, nm) == 0) { if (MVFS_ISVTYPE(mnp->mn_ramdir.ents[vnum].vp, VDIR)) mnp->mn_ramdir.lnk_cnt--; *vpp = mnp->mn_ramdir.ents[vnum].vp; /* return vnode */ mnp->mn_ramdir.ents[vnum].vp = NULL; STRFREE(mnp->mn_ramdir.ents[vnum].nm); mnp->mn_ramdir.mtime.tv_sec = MDKI_CTIME(); /* Update high water mark if required */ if (vnum == mnp->mn_ramdir.hwm-1) { while (mnp->mn_ramdir.ents[--vnum].nm == NULL) {} mnp->mn_ramdir.hwm = vnum+1; } error = 0; MVFS_WRAP_UPDATE_ATTRS(dvp, cd); break; } } MUNLOCK(mnp); if (error) *vpp = NULL; else MVFS_RM_DCACHE(*vpp); return(error); }
void mfs_ramdir_purge( VNODE_T *dvp, int release, CALL_DATA_T *cd ) { register mfs_mnode_t *mnp; register int vnum; mnp = VTOM(dvp); ASSERT(MFS_ISVIEWDIR(mnp)); /* No need to lock. This is only called from cleanup code. */ if (mnp->mn_ramdir.ents == NULL) return; for (vnum=0; vnum < mnp->mn_ramdir.max; vnum++) { if (mnp->mn_ramdir.ents[vnum].vp != NULL) { ASSERT(mnp->mn_ramdir.ents[vnum].nm); STRFREE(mnp->mn_ramdir.ents[vnum].nm); MVFS_DECREMENT_LINK(mnp->mn_ramdir.ents[vnum].vp); if (MVFS_ISVTYPE(mnp->mn_ramdir.ents[vnum].vp, VDIR)) mnp->mn_ramdir.lnk_cnt--; if (release) ATRIA_VN_RELE(mnp->mn_ramdir.ents[vnum].vp, cd); mnp->mn_ramdir.ents[vnum].vp = NULL; } } }
void mfs_ramdir_purgevp( VNODE_T *dvp, VNODE_T *vp, CALL_DATA_T *cd ) { register mfs_mnode_t *mnp; register int vnum; int hwm; ASSERT(MFS_ISVIEWDIR(VTOM(dvp))); mnp = VTOM(dvp); MLOCK(mnp); /* Must continue scan to remove multiple links to same object. */ for (vnum=0; vnum < mnp->mn_ramdir.hwm; vnum++) { if (mnp->mn_ramdir.ents[vnum].vp == vp) { if (MVFS_ISVTYPE(vp, VDIR)) mnp->mn_ramdir.lnk_cnt--; ATRIA_VN_RELE(vp, cd); mnp->mn_ramdir.ents[vnum].vp = NULL; ASSERT(mnp->mn_ramdir.ents[vnum].nm); STRFREE(mnp->mn_ramdir.ents[vnum].nm); mnp->mn_ramdir.mtime.tv_sec = MDKI_CTIME(); /* Update high water mark if releasing the highest slot */ if (vnum == mnp->mn_ramdir.hwm-1) { hwm = vnum; while (mnp->mn_ramdir.ents[--hwm].nm == NULL) {} mnp->mn_ramdir.hwm = hwm+1; } } } MUNLOCK(mnp); }
int start_all_aps(void) { int x,apic_id, cpu; struct pcpu *pc; mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN); /* set up temporary P==V mapping for AP boot */ /* XXX this is a hack, we should boot the AP on its own stack/PTD */ /* start each AP */ for (cpu = 1; cpu < mp_ncpus; cpu++) { apic_id = cpu_apic_ids[cpu]; bootAP = cpu; bootAPgdt = gdt + (512*cpu); /* Get per-cpu data */ pc = &__pcpu[bootAP]; pcpu_init(pc, bootAP, sizeof(struct pcpu)); dpcpu_init((void *)kmem_alloc(kernel_map, DPCPU_SIZE), bootAP); pc->pc_apic_id = cpu_apic_ids[bootAP]; pc->pc_prvspace = pc; pc->pc_curthread = 0; gdt_segs[GPRIV_SEL].ssd_base = (int) pc; gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss; PT_SET_MA(bootAPgdt, VTOM(bootAPgdt) | PG_V | PG_RW); bzero(bootAPgdt, PAGE_SIZE); for (x = 0; x < NGDT; x++) ssdtosd(&gdt_segs[x], &bootAPgdt[x].sd); PT_SET_MA(bootAPgdt, vtomach(bootAPgdt) | PG_V); #ifdef notyet if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_id) == 0) { apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id); acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id); #ifdef CONFIG_ACPI if (acpiid != 0xff) x86_acpiid_to_apicid[acpiid] = apicid; #endif } #endif /* attempt to start the Application Processor */ if (!start_ap(cpu)) { printf("AP #%d (PHY# %d) failed!\n", cpu, apic_id); /* better panic as the AP may be running loose */ printf("panic y/n? [y] "); if (cngetc() != 'n') panic("bye-bye"); } CPU_SET(cpu, &all_cpus); /* record AP in CPU map */ } pmap_invalidate_range(kernel_pmap, 0, NKPT * NBPDR - 1); /* number of APs actually started */ return mp_naps; }
int mfs_ramdir_add( VNODE_T *dvp, char *nm, VNODE_T *vp, int *num, /* returned slot used */ CALL_DATA_T *cd ) { register mfs_mnode_t *mnp; register int vnum; int freevnum; int error; ASSERT(MFS_ISVIEWDIR(VTOM(dvp))); mnp = VTOM(dvp); MLOCK(mnp); *num = 0; /* Must scan for duplicates and first hole to put element into */ freevnum = -1; for (vnum=0; vnum < mnp->mn_ramdir.hwm; vnum++) { if (mnp->mn_ramdir.ents[vnum].nm == NULL) { if (freevnum == -1) freevnum = vnum; continue; } if (STRCMP(mnp->mn_ramdir.ents[vnum].nm, nm) == 0) { MUNLOCK(mnp); return(EEXIST); } } /* If no free slot found, try pushing the highwater mark */ if (freevnum == -1 && (mnp->mn_ramdir.hwm < mnp->mn_ramdir.max)) freevnum = mnp->mn_ramdir.hwm++; /* If have a slot, fill it in. Otherwise return an error */ if (freevnum != -1) { mnp->mn_ramdir.ents[freevnum].nm = STRDUP(nm); if (mnp->mn_ramdir.ents[freevnum].nm == NULL) error = ENOMEM; else { mnp->mn_ramdir.ents[freevnum].vp = vp; mnp->mn_ramdir.mtime.tv_sec = MDKI_CTIME(); if (MVFS_ISVTYPE(vp, VDIR)) mnp->mn_ramdir.lnk_cnt++; *num = freevnum; /* Return slot number used */ error = 0; MVFS_WRAP_UPDATE_ATTRS(dvp, cd); } } else { error = ENOSPC; } MUNLOCK(mnp); return(error); }