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);
>
>
>

Reply via email to