On Thu, Dec 3, 2020 at 2:36 PM Jason Gunthorpe <jgg@xxxxxxxx> wrote: > > On Thu, Dec 03, 2020 at 02:15:36PM -0500, Pavel Tatashin wrote: > > > I studied some more, and I think this is not a race: > > list_add_tail(&head->lru, &cma_page_list) is called only when > > isolate_lru_page(head) succeeds. > > isolate_lru_page(head) succeeds only when PageLRU(head) is true. > > However, in this function we also clear LRU flag before returning > > success. > > This means, that if we race with another thread, the other thread > > won't get to unprotected list_add_tail(&head->lru, &cma_page_list) > > until head is is back on LRU list. > > Oh interesting, I totally didn't see how that LRU stuff is > working. So.. this creates a ridiculously expensive spin lock? Not > broken, but yikes :| Not really a spin lock, the second thread won't be able to isolate this page, and will skip migration of this page. > > Jason