Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Mar 2005 19:48:32 +0000
From:      Kris Kennaway <kris@FreeBSD.org>
To:        dg@FreeBSD.org, current@FreeBSD.org, alc@FreeBSD.org
Subject:   SIGABRT under load (tracked to vm_map_find() returning KERN_NO_SPACE)
Message-ID:  <20050308194832.GD30165@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
I finally found a good way to reproduce the SIGABRT errors I've been
seeing off and on for a long time (buildworld -j18 on a 12-processor
sparc64 running RELENG_5).

The error is originating here in kern/imgact_elf.c in the __CONCAT()
function:

                        if ((error = __elfN(load_section)(imgp->proc, vmspace,
                            imgp->vp, imgp->object, phdr[i].p_offset,
                            (caddr_t)(uintptr_t)phdr[i].p_vaddr,
                            phdr[i].p_memsz, phdr[i].p_filesz, prot,
                            sv->sv_pagesize)) != 0) {
                                printf("__elfN(load_section) %d\n",error);
                                goto fail;
                        }

On the console:

__elfN(load_section) 22
*(execsw[i]->ex_imgact)(imgp) error 22
Fell through to exec_fail
Process cc received SIGABRT
__elfN(load_section) 22
*(execsw[i]->ex_imgact)(imgp) error 22
Fell through to exec_fail
Process make received SIGABRT

i.e. __elfN(load_section) is returning EINVAL.

I instrumented the three places this is possible in
__elfN(load_section) and found the failure occurs here:

                rv = vm_map_find(exec_map,
                                 object,
                                 trunc_page(offset + filsz),
                                 &data_buf,
                                 PAGE_SIZE,
                                 TRUE,
                                 VM_PROT_READ,
                                 VM_PROT_ALL,
                                 MAP_COPY_ON_WRITE | MAP_PREFAULT_PARTIAL);
                if (rv != KERN_SUCCESS) {
                        vm_object_deallocate(object);
                        printf("rv != KERN_SUCCESS 3\n");
                        return (EINVAL);
                }

Pushing up into vm_map_find() shows that it's returning KERN_NO_SPACE:

        if (find_space) {
                if (vm_map_findspace(map, start, length, addr)) {
                        vm_map_unlock(map);
                        printf("KERN_NO_SPACE\n");
                        return (KERN_NO_SPACE);
                }
                start = *addr;
        }
 
Kris

--
In God we Trust -- all others must submit an X.509 certificate.
    -- Charles Forsythe <forsythe@alum.mit.edu>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050308194832.GD30165>