cvs commit: src/sys/sys mbuf.h objcache.h src/sys/kern kern_objcache.c uipc_mbuf.c
Simon 'corecode' Schubert
corecode at fs.ei.tum.de
Thu Jun 9 02:00:12 PDT 2005
On 09.06.2005, at 00:22, Matthew Dillon wrote:
dillon 2005/06/08 15:22:59 PDT
DragonFly src repository
Modified files:
sys/sys mbuf.h objcache.h
sys/kern kern_objcache.c uipc_mbuf.c
Log:
Rollup mbuf/objcache fixes.
/*
- * Both magazines empty. Get a full magazine from the depot.
+ * Both magazines empty. Get a full magazine from the depot and
+ * move one of the empty ones to the depot. Do this even if we
+ * block on the token to avoid a non-optimal corner case.
+ *
+ * Obtain the depot token.
*/
-
- /* Obtain the depot token. */
depot = &oc->depot[myclusterid];
if (!lwkt_trytoken(&ilock, &depot->token)) {
lwkt_gettoken(&ilock, &depot->token);
++depot->contested;
- if (!MAGAZINE_EMPTY(cpucache->loaded_magazine) ||
- !MAGAZINE_EMPTY(cpucache->previous_magazine)) {
- lwkt_reltoken(&ilock);
- goto retry;
- }
}
what exactly would this corner case be? the previous version looked
pretty sane to me, i.e. why don't we take an obj that was returned by
an interrupt (on our cpu) when we were blocking for the depot lock?
+
+ /*
+ * Return emptymag to the depot. Due to blocking it may
+ * not be entirely empty.
+ */
+ if (MAGAZINE_EMPTY(emptymag)) {
+ SLIST_INSERT_HEAD(&depot->emptymagazines,
+ emptymag, nextmagazine);
+ } else {
+ /*
+ * NOTE: magazine is not necessarily entirely full
+ */
+ SLIST_INSERT_HEAD(&depot->fullmagazines,
+ emptymag, nextmagazine);
+ if (depot->waiting)
+ wakeup(depot);
+ }
isn't this a non-optimal case: returning nearly-empty magazines to the
full depot and thus producing more traffic (the magazine empties
faster) on the depot?
/*
- * Depot layer empty.
+ * The depot does not have any non-empty magazines. If we have
+ * not hit our object limit we can allocate a new object using
+ * the back-end allocator.
+ *
+ * note: unallocated_objects can be initialized to -1, which has
+ * the effect of removing any allocation limits.
*/
+ if (depot->unallocated_objects) {
+ --depot->unallocated_objects;
+ lwkt_reltoken(&ilock);
+ crit_exit();
this should read if (depot->unallocated_objects > 0 ||
depot->unallocated_objects == -1), or are you taking a short cut by
using the "free" negative space of the int for objects? that seems
nasty (as we had to get the depot token anyways).
static int
mag_purge(struct objcache *oc, struct magazine *mag)
{
+ int ndeleted;
void *obj;
- int i;
- for (i = 0; i < mag->rounds; i++) {
- obj = mag->objects[i];
+ ndeleted = 0;
+ crit_enter();
+ while (mag->rounds) {
+ obj = mag->objects[--mag->rounds];
+ crit_exit();
oc->dtor(obj, oc->private);
oc->free(obj, oc->allocator_args);
+ ++ndeleted;
+ crit_enter();
}
-
- return (mag->rounds);
+ crit_exit();
+ return(ndeleted);
}
I'm not really sure what the critical sections are good for. Aren't we
always protected by a critical section anyways? And still if not, can't
the magazine as well be moved into the depot while we were blocking in
oc->dtor() or oc->free()? then we shouldn't operate on it anymore (of
course only holds for magazines that were in the cpu layer before).
static void
depot_purge(struct magazinedepot *depot, struct objcache *oc)
{
- depot->cluster_balance -= maglist_purge(oc, &depot->fullmagazines,
- TRUE);
- maglist_purge(oc, &depot->emptymagazines, TRUE);
+ depot->unallocated_objects +=
+ maglist_purge(oc, &depot->fullmagazines, TRUE);
+ depot->unallocated_objects +=
+ maglist_purge(oc, &depot->emptymagazines, TRUE);
+ if (depot->unallocated_objects && depot->waiting)
+ wakeup(depot);
}
. .. like here.
cheers
simon
--
Serve - BSD +++ RENT this banner advert +++ ASCII Ribbon /"\
Work - Mac +++ space for low $$$ NOW!1 +++ Campaign \ /
Party Enjoy Relax | http://dragonflybsd.org Against HTML \
Dude 2c 2 the max ! http://golden-apple.biz Mail + News / \
Attachment:
PGP.sig
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pgp00004.pgp
Type: application/octet-stream
Size: 186 bytes
Desc: "Description: This is a digitally signed message part"
URL: <http://lists.dragonflybsd.org/pipermail/commits/attachments/20050609/47ad5bdb/attachment-0022.obj>
More information about the Commits
mailing list