#include <sys/vmmeter.h>
#include <sys/vnode.h>
#include <sys/xio.h>
-#include <sys/sfbuf.h>
+
+#include <cpu/lwbuf.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
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_flags = xflags;
xio->xio_offset = 0;
- xio->xio_bytes = 0;
+ xio->xio_bytes = npages * PAGE_SIZE;
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 error;
int offset;
vm_page_t m;
- struct sf_buf *sf;
+ struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (uoffset + bytes > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
- error = copyout((char *)sf_buf_kva(sf) + offset, uptr, n);
- sf_buf_free(sf);
+ lwb = lwbuf_alloc(m, &lwb_cache);
+ error = copyout((char *)lwbuf_kva(lwb) + offset, uptr, n);
+ lwbuf_free(lwb);
if (error)
break;
bytes -= n;
int error;
int offset;
vm_page_t m;
- struct sf_buf *sf;
+ struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (bytes + uoffset > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
- bcopy((char *)sf_buf_kva(sf) + offset, kptr, n);
- sf_buf_free(sf);
+ lwb = lwbuf_alloc(m, &lwb_cache);
+ bcopy((char *)lwbuf_kva(lwb) + offset, kptr, n);
+ lwbuf_free(lwb);
bytes -= n;
kptr = (char *)kptr + n;
if (bytes == 0)
int error;
int offset;
vm_page_t m;
- struct sf_buf *sf;
+ struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (uoffset + bytes > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
- error = copyin(uptr, (char *)sf_buf_kva(sf) + offset, n);
- sf_buf_free(sf);
+ lwb = lwbuf_alloc(m, &lwb_cache);
+ error = copyin(uptr, (char *)lwbuf_kva(lwb) + offset, n);
+ lwbuf_free(lwb);
if (error)
break;
bytes -= n;
int error;
int offset;
vm_page_t m;
- struct sf_buf *sf;
+ struct lwbuf *lwb;
+ struct lwbuf lwb_cache;
if (uoffset + bytes > xio->xio_bytes)
return(EFAULT);
++i
) {
m = xio->xio_pages[i];
- sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
- bcopy(kptr, (char *)sf_buf_kva(sf) + offset, n);
- sf_buf_free(sf);
+ lwb = lwbuf_alloc(m, &lwb_cache);
+ bcopy(kptr, (char *)lwbuf_kva(lwb) + offset, n);
+ lwbuf_free(lwb);
bytes -= n;
kptr = (const char *)kptr + n;
if (bytes == 0)