Re: [PATCH v4 5/5] arm64: mte: add compression support to mteswap.c
From: Alexander Potapenko <glider@google.com>
Date: 2023-09-20 13:27:49
Also in:
lkml
On Fri, Aug 18, 2023 at 8:18 PM Catalin Marinas [off-list ref] wrote:
On Thu, Jul 20, 2023 at 07:39:56PM +0200, Alexander Potapenko wrote:quoted
Soon after booting Android, tag compression saves ~2.5x memory previously spent by mteswap.c on tag allocations. With the growing uptime, the savings reach 20x and even more.This sounds like a marketing claim ;). The way I read your statement is that the memory used for tag storage is 2.5x less with your patches and that's great. It means a 2.5x compression on average. How does the compression get so much better to 20x with more uptime?
I am currently looking at this, and I think this happens because some userspace apps assign zero tags to userspace pages, and those tags are effectively zero-cost, because they can be compressed into 8 bytes of the Xarray pointer. As the uptime grows, the share of such pages also grows. I agree though that this is a marginal use case, and the average compression rate is more representative.
The number of tag storage allocations should be proportional to the pages swapped out (not equal as not all would be mapped as PROT_MTE).
We think a reasonable upper bound for PROT_MTE pages is 40%, but currently it is probably more like 20%.
So you can indeed have a lot more pages swapped out than available in RAM and the tag storage can take space but not sure which numbers you divided to get 20x.
Right now (in kernel 6.5) the amount of memory spent to store the tags can be calculated as 128 * (number of mte_allocate_tag_storage() calls - number of mte_free_tag_storage() calls). In my patchset I calculate the total amount of memory allocated/deallocated from the mte-tags-N caches and compare that with 128 * (total number of live objects in those caches). E.g. the stats after booting up the device (~120s uptime) look as follows: 8 bytes: 14007 allocations, 256 deallocations 16 bytes: 1583 allocations, 179 deallocations 32 bytes: 1634 allocations, 205 deallocations 64 bytes: 1538 allocations, 142 deallocations 128 bytes: 10881 allocations, 1340 deallocations uncompressed tag storage size: 3522688 compressed tag storage size: 1488792 (note 8-byte allocations contribute to uncompressed storage, but not to compressed storage). After running various apps, I made the device use almost 19Mb swap space: 8 bytes: 71352 allocations, 8093 deallocations 16 bytes: 5102 allocations, 2598 deallocations 32 bytes: 8206 allocations, 4536 deallocations 64 bytes: 9489 allocations, 5377 deallocations 128 bytes: 43258 allocations, 23364 deallocations uncompressed tag storage size: 11960192 compressed tag storage size: 2967104 (Note the share of allocations compressed into 8 bytes is slowly growing) In this case the compression ratio is 4x. I must admit I could not reproduce the 20x compression this time, and after thinking a little I anticipate the absolute values to be lower in that case (maybe that was observed at some point where a lot of uncompressed data was evicted from swap). I therefore think I'd better make a modester claim in the docs/patch description.
Anyway, it would be nice to see the full picture of what the savings relative to the total RAM is. Given that the swap in this instance is zram, you have an upper bound of how many pages it can store. I'm just trying to assess whether the complexity added here is worth it. Maybe not as good as the RLE algorithm here, I was wondering whether we could use zswap to save the tags together with the page. I looked some time ago at it seemed slightly easier for zswap than zram. Another option is to make the swap format more generic to support metadata storage. Yet another option is for the zram to flag that it can compress the metadata together with the data (no swap format change needed; when decompressing the page, it populates the tags as well). -- Catalin
-- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Paul Manicle, Liana Sebastian Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel