Hi Gleb,

Sorry. Lost power at home earlier this morning and was operating on very low
laptop battery power (and stealing network bandwidth from my neighbor over his
unsecured wireless network :)), so sent you a brief reply earlier.

We have this bit of logic in uma_zfree_arg()

/* See uma.h */
void
uma_zfree_arg(uma_zone_t zone, void *item, void *udata)
{
...
...
        /*
         * The race here is acceptable.  If we miss it we'll just have to wait
         * a little longer for the limits to be reset.
         */
        if (keg->uk_flags & UMA_ZFLAG_FULL)
                goto zfree_internal;
...
...
zfree_internal:
        uma_zfree_internal(zone, item, udata, SKIP_DTOR, ZFREE_STATFREE);

        return;

And uma_zfree_internal() frees the object back to the slab and wakes up 
all blocked processes (one of which will proceed) and the others will 
reset ZFLAG_FULL and block. But as objects get freed, they should all 
get freed to the slab as long as ZFLAG_FULL is set, and blocked procs
woken up.

> P.S. Let me do a small style nit-pick. :) All the UMA public functions are
> preceeded with "uma_", so it will be more nice to create a public 
> uma_zone_drain(),
> that just calls internal zone_drain(). Like uma_print_stats() or 
> uma_zdestroy()
> are.

I'll do this.

thanks

mohan
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to