I am on an old codebase that already has the fix that you are proposing, so I might be seeing someother issue which I will debug further.
So looks like the loop in __offline_pages() had a call to drain_all_pages() before it was removed by
c52e75935f8d: mm: remove extra drain pages on pcp list
I see, thanks. There is a reason to have the second drain, my fix is a little better as it is performed only on a rare occasion when it is needed, but I should add a FIXES tag. I have not checked alloc_contig_range race.