This is probably the simplest way to solve the problem for now. if we want to mess with sys/queue we can do that separately.
On Wed, Apr 30, 2014 at 8:55 AM, Mark Kettenis <mark.kette...@xs4all.nl> wrote: >> From: Mike Belopuhov <m...@belopuhov.com> >> Date: Wed, 30 Apr 2014 16:00:45 +0200 >> >> On 30 April 2014 15:55, Mark Kettenis <mark.kette...@xs4all.nl> wrote: >> >> Date: Wed, 30 Apr 2014 15:38:39 +0200 (CEST) >> >> From: Mark Kettenis <mark.kette...@xs4all.nl> >> >> >> >> > Date: Wed, 30 Apr 2014 13:39:20 +0100 >> >> > From: Stuart Henderson <st...@openbsd.org> >> >> > >> >> > Seen when running e2fsprogs regression tests with /tmp on tmpfs >> >> >> >> I'm not surprised; tmpfs contains some serious bugs. I recommend not >> >> using it until those are fixed. >> > >> > Which means, I'd like somebody else besides espie@ to comment on my >> > uvm_aobj.c list manipulation hack diff. >> > >> >> Diff made sense to me when I looked at it, but I would rather hide >> direct pointer access :/ Perhaps LIST_SWAP does a tiny bit more, >> but it's cleaner and perhaps can be useful in the future. > > I'm not comfortable with introducing more <sys/queue.h> APIs. So > perhaps we should just punt on the optimization and remove/insert all > list items. Removing the trap comments that pedro set up... > > Index: uvm_aobj.c > =================================================================== > RCS file: /cvs/src/sys/uvm/uvm_aobj.c,v > retrieving revision 1.61 > diff -u -p -r1.61 uvm_aobj.c > --- uvm_aobj.c 13 Apr 2014 23:14:15 -0000 1.61 > +++ uvm_aobj.c 30 Apr 2014 14:52:33 -0000 > @@ -431,6 +431,7 @@ uao_shrink_hash(struct uvm_object *uobj, > { > struct uvm_aobj *aobj = (struct uvm_aobj *)uobj; > struct uao_swhash *new_swhash; > + struct uao_swhash_elt *elt; > unsigned long new_hashmask; > int i; > > @@ -456,8 +457,13 @@ uao_shrink_hash(struct uvm_object *uobj, > * Even though the hash table size is changing, the hash of the > buckets > * we are interested in copying should not change. > */ > - for (i = 0; i < UAO_SWHASH_BUCKETS(aobj->u_pages); i++) > - LIST_FIRST(&new_swhash[i]) = LIST_FIRST(&aobj->u_swhash[i]); > + for (i = 0; i < UAO_SWHASH_BUCKETS(aobj->u_pages); i++) { > + while (LIST_EMPTY(&aobj->u_swhash[i]) == 0) { > + elt = LIST_FIRST(&aobj->u_swhash[i]); > + LIST_REMOVE(elt, list); > + LIST_INSERT_HEAD(&new_swhash[i], elt, list); > + } > + } > > free(aobj->u_swhash, M_UVMAOBJ); > > @@ -609,7 +615,6 @@ uao_grow_hash(struct uvm_object *uobj, i > return ENOMEM; > > for (i = 0; i < UAO_SWHASH_BUCKETS(aobj->u_pages); i++) { > - /* XXX pedro: shouldn't copying the list pointers be enough? > */ > while (LIST_EMPTY(&aobj->u_swhash[i]) == 0) { > elt = LIST_FIRST(&aobj->u_swhash[i]); > LIST_REMOVE(elt, list); > > >