Commit 212c5c07 authored by Pasha Tatashin's avatar Pasha Tatashin Committed by Joerg Roedel
Browse files

iommu: account IOMMU allocated memory



In order to be able to limit the amount of memory that is allocated
by IOMMU subsystem, the memory must be accounted.

Account IOMMU as part of the secondary pagetables as it was discussed
at LPC.

The value of SecPageTables now contains mmeory allocation by IOMMU
and KVM.

There is a difference between GFP_ACCOUNT and what NR_IOMMU_PAGES shows.
GFP_ACCOUNT is set only where it makes sense to charge to user
processes, i.e. IOMMU Page Tables, but there more IOMMU shared data
that should not really be charged to a specific process.

Signed-off-by: default avatarPasha Tatashin <pasha.tatashin@soleen.com>
Acked-by: default avatarDavid Rientjes <rientjes@google.com>
Tested-by: default avatarBagas Sanjaya <bagasdotme@gmail.com>
Link: https://lore.kernel.org/r/20240413002522.1101315-12-pasha.tatashin@soleen.com


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent bd3520a9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1432,7 +1432,7 @@ PAGE_SIZE multiple when read back.
	  sec_pagetables
		Amount of memory allocated for secondary page tables,
		this currently includes KVM mmu allocations on x86
		and arm64.
		and arm64 and IOMMU page tables.

	  percpu (npn)
		Amount of memory used for storing per-cpu kernel
+2 −2
Original line number Diff line number Diff line
@@ -1110,8 +1110,8 @@ KernelStack
PageTables
              Memory consumed by userspace page tables
SecPageTables
              Memory consumed by secondary page tables, this currently
              currently includes KVM mmu allocations on x86 and arm64.
              Memory consumed by secondary page tables, this currently includes
              KVM mmu and IOMMU allocations on x86 and arm64.
NFS_Unstable
              Always zero. Previous counted pages which had been written to
              the server, but has not been committed to stable storage.
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ static inline void __iommu_alloc_account(struct page *page, int order)
	const long pgcnt = 1l << order;

	mod_node_page_state(page_pgdat(page), NR_IOMMU_PAGES, pgcnt);
	mod_lruvec_page_state(page, NR_SECONDARY_PAGETABLE, pgcnt);
}

/**
@@ -42,6 +43,7 @@ static inline void __iommu_free_account(struct page *page, int order)
	const long pgcnt = 1l << order;

	mod_node_page_state(page_pgdat(page), NR_IOMMU_PAGES, -pgcnt);
	mod_lruvec_page_state(page, NR_SECONDARY_PAGETABLE, -pgcnt);
}

/**
+1 −1
Original line number Diff line number Diff line
@@ -205,7 +205,7 @@ enum node_stat_item {
	NR_KERNEL_SCS_KB,	/* measured in KiB */
#endif
	NR_PAGETABLE,		/* used for pagetables */
	NR_SECONDARY_PAGETABLE, /* secondary pagetables, e.g. KVM pagetables */
	NR_SECONDARY_PAGETABLE, /* secondary pagetables, KVM & IOMMU */
#ifdef CONFIG_IOMMU_SUPPORT
	NR_IOMMU_PAGES,		/* # of pages allocated by IOMMU */
#endif