On Wed, Apr 04, 2018 at 09:35:46AM -0700, Mike Kravetz wrote: > Running with this XArray series on top of next-20180329 consistently 'hangs' > on shutdown looping (?forever?) in tag_pages_for_writeback/xas_for_each_tag. > All I have to do is make sure there is some activity on the ext4 fs before > shutdown. Not sure if this is a 'next-20180329' issue or XArray issue. > But the fact that we are looping in xas_for_each_tag looks suspicious. Thanks for your help debugging this! Particularly collecting the xa_dump. I got bit by the undefined behaviour of shifting by BITS_PER_LONG, but of course it was subtle. The userspace testing framework wasn't catching this for a couple of reasons; I'll work on making sure it catches this kind of thing in the future. I'll fold this in and post a v11 later this week or early next week. diff --git a/include/linux/xarray.h b/include/linux/xarray.h index eac04922eba2..f5b7e507a86f 100644 --- a/include/linux/xarray.h +++ b/include/linux/xarray.h @@ -904,9 +929,12 @@ static inline unsigned int xas_find_chunk(struct xa_state *xas, bool advance, if (advance) offset++; if (XA_CHUNK_SIZE == BITS_PER_LONG) { - unsigned long data = *addr & (~0UL << offset); - if (data) - return __ffs(data); + if (offset < XA_CHUNK_SIZE) { + unsigned long data = *addr & (~0UL << offset); + + if (data) + return __ffs(data); + } return XA_CHUNK_SIZE; }