Ich versuche, einen DMA-Puffer für eine HPC-Arbeitslast zuzuordnen. Es benötigt 64 GB Pufferspeicher. Zwischen der Berechnung werden einige Daten auf eine PCIe-Karte ausgelagert. Anstatt Daten in eine Reihe von dinky 4MB Puffern zu kopieren, die von pci_alloc_consistent vergeben werden, möchte ich nur 64 1GB Puffer erstellen, die von 1GB HugePages unterstützt werden.Wie ordne ich einen DMA-Puffer, der von 1GB HugePages unterstützt wird, in einem Linux-Kernelmodul zu?
Einige Hintergrundinfo: Kernel-Version: Optionen CentOS 6.4/2.6.32-358.el6.x86_64 Kernel-Boot: hugepagesz = 1g hugepages = 64 default_hugepagesz = 1g
relevanten Teil von/proc/meminfo: AnonHugePages: 0 kB HugePages_Total: 64 HugePages_Free: 64 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 1048576 kB DirectMap4k: 848 kB DirectMap2M: 2.062.336 kB DirectMap1G: 132.120.576 kB
Ich kann mount -t hugetlbfs nodev/mnt/hugepages. CONFIG_HUGETLB_PAGE ist wahr. MAP_HUGETLB ist definiert.
Ich habe einige Informationen über die Verwendung von libhugetlbfs gelesen, um get_huge_pages() im Benutzerbereich aufzurufen, aber idealerweise würde dieser Puffer im Kernelraum zugewiesen werden. Ich habe versucht, do_mmap() mit MAP_HUGETLB aufzurufen, aber es schien nicht die Anzahl der freien hugepages zu ändern, also glaube ich nicht, dass es die mmap mit riesigen Seiten unterstützt.
Also ich denke, was ich bekomme, gibt es beliebig Weise kann ich einen Puffer auf eine 1GB HugePage im Kernelraum zuordnen, oder muss es in Benutzerraum getan werden? Oder wenn jemand eine andere Möglichkeit kennt, kann ich einen riesigen (1 - 64 GB) zusammenhängenden physischen Speicher als Kernel-Puffer zur Verfügung stellen?
Interessante Frage, ist Ihr Ziel vor allem zu vermeiden, Kopieren zwischen Kernel-und User-Space? – ChuckCottrill
Alle diese APIs sind für den Benutzerraum. Sehen Sie sich an, wie hugetlbfs implementiert ist, insbesondere 'hugetlbfs_file_mmap'. –
@muusbolla Konnten Sie die Antwort finden? –