system freeze on objcache_get

Simon 'corecode' Schubert corecode at fs.ei.tum.de
Mon Jul 30 05:50:39 PDT 2007


Simon 'corecode' Schubert wrote:
In total, there are just 5 rounds in all magazines: one each in 
loaded_magazine on CPUs 0,1,2 and two in previous_magazine on CPU2.

So my question now is:  where did all the allocated objects go?
Answer:  they were never freed:

There were exactly 59 less frees than there were allocs (checked by looking at get/put_cummulative).

So, where'd it go?

       if (error == 0) {
               error = exec_copyin_args(&args, uap->fname, PATH_USERSPACE,
                                       uap->argv, uap->envv);
       }
       if (error == 0)
               error = kern_execve(&nd, &args);
       nlookup_done(&nd);
       exec_free_args(&args);
must be in kern_execve, right?  but how so?

in kern_execve...

exec_fail:
       /*
        * we're done here, clear P_INEXEC if we were the ones that
        * set it.  Otherwise if vmspace_destroyed is still set we
        * raced another thread and that thread is responsible for
        * clearing it.
        */
       if (imgp->vmspace_destroyed & 2)
               p->p_flag &= ~P_INEXEC;
       if (imgp->vmspace_destroyed) {
               /* sorry, no more process anymore. exit gracefully */
               exit1(W_EXITCODE(0, SIGABRT)); <<<<<<<< BIATCH
               /* NOT REACHED */
               return(0);
       } else {
               return(error);
       }
}
there we go.  turns out cperciva fixed that in freebsd in 2005, rev. 1.277.  fix will arrive now in dragonfly as well.

cheers + hope to see you again in this cinema.
 simon




More information about the Bugs mailing list