for (i = 0; n && i < XIO_INTERNAL_PAGES; ++i) {
if ((paddr = pmap_kextract(addr)) == 0)
break;
- crit_enter();
m = PHYS_TO_VM_PAGE(paddr);
vm_page_hold(m);
- crit_exit();
xio->xio_pages[i] = m;
kbytes -= n;
xio->xio_bytes += n;
xio->xio_pages = xio->xio_internal_pages;
xio->xio_npages = npages;
xio->xio_error = 0;
- crit_enter();
for (i = 0; i < npages; ++i) {
vm_page_hold(mbase[i]);
xio->xio_pages[i] = mbase[i];
}
- crit_exit();
return(0);
}
int i;
vm_page_t m;
- crit_enter();
for (i = 0; i < xio->xio_npages; ++i) {
m = xio->xio_pages[i];
if (xio->xio_flags & XIOF_WRITE)
vm_page_dirty(m);
vm_page_unhold(m);
}
- crit_exit();
xio->xio_offset = 0;
xio->xio_npages = 0;
xio->xio_bytes = 0;
int offset;
vm_page_t m;
struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (uoffset + bytes > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- lwb = lwbuf_alloc(m);
+ lwb = lwbuf_alloc(m, &lwb_cache);
error = copyout((char *)lwbuf_kva(lwb) + offset, uptr, n);
lwbuf_free(lwb);
if (error)
int offset;
vm_page_t m;
struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (bytes + uoffset > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- lwb = lwbuf_alloc(m);
+ lwb = lwbuf_alloc(m, &lwb_cache);
bcopy((char *)lwbuf_kva(lwb) + offset, kptr, n);
lwbuf_free(lwb);
bytes -= n;
int offset;
vm_page_t m;
struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (uoffset + bytes > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- lwb = lwbuf_alloc(m);
+ lwb = lwbuf_alloc(m, &lwb_cache);
error = copyin(uptr, (char *)lwbuf_kva(lwb) + offset, n);
lwbuf_free(lwb);
if (error)
int offset;
vm_page_t m;
struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (uoffset + bytes > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- lwb = lwbuf_alloc(m);
+ lwb = lwbuf_alloc(m, &lwb_cache);
bcopy(kptr, (char *)lwbuf_kva(lwb) + offset, n);
lwbuf_free(lwb);
bytes -= n;