On Wed, Aug 31, 2016 at 10:47:50AM +0200, Michal Mazurek wrote:
> Section "J.2 Undefined behavior" of n1570 includes:
> * Pointers that do not point to the same aggregate or union (nor just
>   beyond the same array object) are compared using relational
>   operators (6.5.8).
> 
> I think that's what's happening when using RB trees in subr_hibernate.c.
> subr_pool.c fixes this issue by casting the address to vaddr_t. Diff
> to do the same in subr_hibernate.c below.
> 

If this passes a couple ZZZ/resume cycles, go for it.

> Index: sys/kern/subr_hibernate.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/subr_hibernate.c,v
> retrieving revision 1.116
> diff -u -p -r1.116 subr_hibernate.c
> --- sys/kern/subr_hibernate.c 4 May 2015 02:18:05 -0000       1.116
> +++ sys/kern/subr_hibernate.c 31 Aug 2016 08:35:53 -0000
> @@ -156,7 +156,10 @@ hibernate_sort_ranges(union hibernate_in
>  static __inline int
>  hibe_cmp(struct hiballoc_entry *l, struct hiballoc_entry *r)
>  {
> -     return l < r ? -1 : (l > r);
> +     vaddr_t vl = (vaddr_t)l;
> +     vaddr_t vr = (vaddr_t)r;
> +
> +     return vl < vr ? -1 : (vl > vr);
>  }
>  
>  RB_PROTOTYPE(hiballoc_addr, hiballoc_entry, hibe_entry, hibe_cmp)
> 
> -- 
> Michal Mazurek
> 

Reply via email to