Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/md/md.c
Show First 20 Lines • Show All 225 Lines • ▼ Show 20 Lines | |||||
static LIST_HEAD(, md_s) md_softc_list = LIST_HEAD_INITIALIZER(md_softc_list); | static LIST_HEAD(, md_s) md_softc_list = LIST_HEAD_INITIALIZER(md_softc_list); | ||||
#define NINDIR (PAGE_SIZE / sizeof(uintptr_t)) | #define NINDIR (PAGE_SIZE / sizeof(uintptr_t)) | ||||
#define NMASK (NINDIR-1) | #define NMASK (NINDIR-1) | ||||
static int nshift; | static int nshift; | ||||
static int md_vnode_pbuf_freecnt; | static uma_zone_t md_pbuf_zone; | ||||
struct indir { | struct indir { | ||||
uintptr_t *array; | uintptr_t *array; | ||||
u_int total; | u_int total; | ||||
u_int used; | u_int used; | ||||
u_int shift; | u_int shift; | ||||
}; | }; | ||||
▲ Show 20 Lines • Show All 714 Lines • ▼ Show 20 Lines | while (len > 0) { | ||||
len -= piov->iov_len; | len -= piov->iov_len; | ||||
ma_offs = 0; | ma_offs = 0; | ||||
vlist++; | vlist++; | ||||
piov++; | piov++; | ||||
} | } | ||||
auio.uio_iovcnt = piov - auio.uio_iov; | auio.uio_iovcnt = piov - auio.uio_iov; | ||||
piov = auio.uio_iov; | piov = auio.uio_iov; | ||||
} else if ((bp->bio_flags & BIO_UNMAPPED) != 0) { | } else if ((bp->bio_flags & BIO_UNMAPPED) != 0) { | ||||
pb = getpbuf(&md_vnode_pbuf_freecnt); | pb = uma_zalloc(md_pbuf_zone, M_WAITOK); | ||||
bp->bio_resid = len; | bp->bio_resid = len; | ||||
unmapped_step: | unmapped_step: | ||||
npages = atop(min(MAXPHYS, round_page(len + (ma_offs & | npages = atop(min(MAXPHYS, round_page(len + (ma_offs & | ||||
PAGE_MASK)))); | PAGE_MASK)))); | ||||
iolen = min(ptoa(npages) - (ma_offs & PAGE_MASK), len); | iolen = min(ptoa(npages) - (ma_offs & PAGE_MASK), len); | ||||
KASSERT(iolen > 0, ("zero iolen")); | KASSERT(iolen > 0, ("zero iolen")); | ||||
pmap_qenter((vm_offset_t)pb->b_data, | pmap_qenter((vm_offset_t)pb->b_data, | ||||
&bp->bio_ma[atop(ma_offs)], npages); | &bp->bio_ma[atop(ma_offs)], npages); | ||||
Show All 32 Lines | if (pb != NULL) { | ||||
pmap_qremove((vm_offset_t)pb->b_data, npages); | pmap_qremove((vm_offset_t)pb->b_data, npages); | ||||
if (error == 0) { | if (error == 0) { | ||||
len -= iolen; | len -= iolen; | ||||
bp->bio_resid -= iolen; | bp->bio_resid -= iolen; | ||||
ma_offs += iolen; | ma_offs += iolen; | ||||
if (len > 0) | if (len > 0) | ||||
goto unmapped_step; | goto unmapped_step; | ||||
} | } | ||||
relpbuf(pb, &md_vnode_pbuf_freecnt); | uma_zfree(md_pbuf_zone, pb); | ||||
} | } | ||||
free(piov, M_MD); | free(piov, M_MD); | ||||
if (pb == NULL) | if (pb == NULL) | ||||
bp->bio_resid = auio.uio_resid; | bp->bio_resid = auio.uio_resid; | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,077 Lines • ▼ Show 20 Lines | while ((mod = preload_search_next_name(mod)) != NULL) { | ||||
ptr = preload_fetch_addr(mod); | ptr = preload_fetch_addr(mod); | ||||
len = preload_fetch_size(mod); | len = preload_fetch_size(mod); | ||||
if (ptr != NULL && len != 0) { | if (ptr != NULL && len != 0) { | ||||
sx_xlock(&md_sx); | sx_xlock(&md_sx); | ||||
md_preloaded(ptr, len, name); | md_preloaded(ptr, len, name); | ||||
sx_xunlock(&md_sx); | sx_xunlock(&md_sx); | ||||
} | } | ||||
} | } | ||||
md_vnode_pbuf_freecnt = nswbuf / 10; | md_pbuf_zone = uma_zsecond_create("mdpbuf", pbuf_ctor, pbuf_dtor, | ||||
pbuf_init, NULL, pbuf_zone); | |||||
uma_zone_set_max(md_pbuf_zone, nswbuf / 10); | |||||
status_dev = make_dev(&mdctl_cdevsw, INT_MAX, UID_ROOT, GID_WHEEL, | status_dev = make_dev(&mdctl_cdevsw, INT_MAX, UID_ROOT, GID_WHEEL, | ||||
0600, MDCTL_NAME); | 0600, MDCTL_NAME); | ||||
g_topology_lock(); | g_topology_lock(); | ||||
} | } | ||||
static void | static void | ||||
g_md_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, | g_md_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, | ||||
struct g_consumer *cp __unused, struct g_provider *pp) | struct g_consumer *cp __unused, struct g_provider *pp) | ||||
▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
g_md_fini(struct g_class *mp __unused) | g_md_fini(struct g_class *mp __unused) | ||||
{ | { | ||||
sx_destroy(&md_sx); | sx_destroy(&md_sx); | ||||
if (status_dev != NULL) | if (status_dev != NULL) | ||||
destroy_dev(status_dev); | destroy_dev(status_dev); | ||||
uma_zdestroy(md_pbuf_zone); | |||||
delete_unrhdr(md_uh); | delete_unrhdr(md_uh); | ||||
} | } |