Messages in this thread | | | Date | Tue, 26 Apr 2022 18:48:52 +0200 | Subject | Re: [PATCH 5/6] mm/page_alloc: Protect PCP lists with a spinlock | From | Vlastimil Babka <> |
| |
On 4/26/22 18:42, Nicolas Saenz Julienne wrote: > On Wed, 2022-04-20 at 10:59 +0100, Mel Gorman wrote: >> @@ -3082,15 +3093,22 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, >> */ >> void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) >> { >> - unsigned long flags; >> int to_drain, batch; >> >> - local_lock_irqsave(&pagesets.lock, flags); >> batch = READ_ONCE(pcp->batch); >> to_drain = min(pcp->count, batch); >> - if (to_drain > 0) >> + if (to_drain > 0) { >> + unsigned long flags; >> + >> + /* free_pcppages_bulk expects IRQs disabled for zone->lock */ >> + local_irq_save(flags); > > Why dropping the local_lock? That approach is nicer to RT builds, and I don't > think it makes a difference from a non-RT perspective.
I think the separate irq_disable+spin_lock here is actually broken on RT config, as explained in Documentation/locking/locktypes.rst. pcp->lock would have to be a raw_spin_lock.
> That said, IIUC, this will eventually disappear with subsequent patches, right?
So it wouldn't be mergeable even as a temporary step.
> >> + >> + spin_lock(&pcp->lock); >> free_pcppages_bulk(zone, to_drain, pcp, 0); >> - local_unlock_irqrestore(&pagesets.lock, flags); >> + spin_unlock(&pcp->lock); >> + >> + local_irq_restore(flags); >> + } >> } >> #endif >>
| |