On Fri, Nov 24, 2023 at 12:15 AM Kairui Song <ryncsn@xxxxxxxxx> wrote: > > > folio_put will discharge a page if it's charged, in original code the > 2 folio_put call simply free the page since it's not charged. But in > this patch, folio_put will cancel previous > mem_cgroup_swapin_charge_folio call, so actually the 3 > mem_cgroup_swapin_charge_folio calls will only charge once. (2 calls > was cancelled by folio_put). You are saying the original code case folio_put() will be free without uncharge. But with your patch folio_put() will free and cancel mem_cgroup_swapin_charge_folio() charge. That is because the folio->memcg_data was not set in the first case and folio->memcg_data was set in the second case? > > I think this is making it confusing indeed and causing more trouble in > error path (the uncharge could be more expensive than unlock check), > will rework this part. Agree. Thanks. Chris