On 12/5/19 11:22 AM, Alexander Duyck wrote: > From: Alexander Duyck <alexander.h.duyck@xxxxxxxxxxxxxxx> > > In order to pave the way for free page reporting in virtualized > environments we will need a way to get pages out of the free lists and > identify those pages after they have been returned. To accomplish this, > this patch adds the concept of a Reported Buddy, which is essentially > meant to just be the Uptodate flag used in conjunction with the Buddy > page type. [...] > +enum { > + PAGE_REPORTING_IDLE = 0, > + PAGE_REPORTING_REQUESTED, > + PAGE_REPORTING_ACTIVE > +}; > + > +/* request page reporting */ > +static void > +__page_reporting_request(struct page_reporting_dev_info *prdev) > +{ > + unsigned int state; > + > + /* Check to see if we are in desired state */ > + state = atomic_read(&prdev->state); > + if (state == PAGE_REPORTING_REQUESTED) > + return; > + > + /* > + * If reporting is already active there is nothing we need to do. > + * Test against 0 as that represents PAGE_REPORTING_IDLE. > + */ > + state = atomic_xchg(&prdev->state, PAGE_REPORTING_REQUESTED); > + if (state != PAGE_REPORTING_IDLE) > + return; > + > + /* > + * Delay the start of work to allow a sizable queue to build. For > + * now we are limiting this to running no more than once every > + * couple of seconds. > + */ > + schedule_delayed_work(&prdev->work, PAGE_REPORTING_DELAY); > +} > + I think you recently switched to using an atomic variable for maintaining page reporting status as I was doing in v12. Which is good, as we will not have a disagreement on it now. On a side note, apologies for not getting involved actively in the discussions/reviews as I am on PTO. -- Nitesh