Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Jun 2000 13:21:01 +0400 (MSD)
From:      Oleg Derevenetz <oleg@oleg.vsi.ru>
To:        freebsd-hackers@freebsd.org
Subject:   vm_fault() problem
Message-ID:  <Pine.BSF.4.21.0006011257530.378-100000@oleg.vsi.ru>

next in thread | raw e-mail | index | archive | help
It seems to be a problem in vm/vm_fault() and 
vnode_pager_generic_putpages() in FreeBSD 3.x & 4.0.

The following code illustrates the problem:

#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>

#define COUNT	1024
#define SIZE	10*1024*1024

int main () {
    int i,j,fd;
    char *fptr, fname [16];
    
    for (i=0;i<COUNT;i++) {
	sprintf (fname, "%d", i);
	printf ("DEBUG: fname: %s\n", fname);
	
	fd=open (fname, O_RDWR|O_CREAT, 644);
	lseek (fd, SIZE, SEEK_SET);
	write (fd, "-", 1);
	
	if ((fptr=mmap (NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0))==MAP_FAILED) {
	    printf ("mmap() failed !\n");
	    return 0;
	}
	
	for (j=0;j<SIZE;j++)
	    fptr[j]='o';
    }
    
    return 0;
}

So, if we haven't required disk space on partition with mmap'ed files,
system deadlock in vm_fault() appears.

This is part of vnode_pager.c/vnode_pager_generic_putpages() :

	aiov.iov_base = (caddr_t) 0;
	aiov.iov_len = maxsize;
	auio.uio_iov = &aiov;
	auio.uio_iovcnt = 1;
	auio.uio_offset = poffset;
	auio.uio_segflg = UIO_NOCOPY;
	auio.uio_rw = UIO_WRITE;
	auio.uio_resid = maxsize;
	auio.uio_procp = (struct proc *) 0;
	error = VOP_WRITE(vp, &auio, ioflags, curproc->p_ucred);
	cnt.v_vnodeout++;
	cnt.v_vnodepgsout += ncount;

	if (error) {
		printf("vnode_pager_putpages: I/O error %d\n", error);
	}
	if (auio.uio_resid) {
		printf("vnode_pager_putpages: residual I/O %d at %lu\n",
		    auio.uio_resid, (u_long)m[0]->pindex);
	}
	for (i = 0; i < ncount; i++) {
		rtvals[i] = VM_PAGER_OK;		/* ???? */
	}
	return rtvals[0];				/* ???? */

So, such errors as I/O errors, are not handled there.

This seems to be a serious problem in FreeBSD VM subsystem, isn't it ?



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0006011257530.378-100000>