Próbuję przydzielić bufor DMA dla obciążenia HPC. Wymaga 64 GB przestrzeni buforowej. W międzyczasie niektóre dane są odciążane na kartę PCIe. Zamiast kopiować dane do garści dinky 4 MB buforów podanych przez pci_alloc_consistent, chciałbym po prostu utworzyć 64 bufory 1GB, wspierane przez 1GB HugePages.Jak przydzielić bufor DMA wspierany przez 1GB HugePages w module jądra Linux?
Niektóre informacje tła: wersja jądra: CentOS 6.4/2.6.32-358.el6.x86_64 opcji bootowania: hugepagesz = 1g hugepages = 64 default_hugepagesz = 1g
odpowiednią porcję/proc/meminfo: AnonHugePages: 0 kB HugePages_Total HugePages_Free: 64: 64: 0 HugePages_Rsvd HugePages_Surp 0 Hugepagesize: 1048576 kB DirectMap4k: 848 kB DirectMap2M: 2062336 kB DirectMap1G: 132120576 kB
Mogę zamontować -t hugetlbfs nodev/mnt/hugepages. CONFIG_HUGETLB_PAGE jest prawdziwe. MAP_HUGETLB jest zdefiniowany.
Przeczytałem kilka informacji o używaniu libhugetlbfs do wywoływania get_huge_pages() w przestrzeni użytkownika, ale najlepiej ten bufor zostałby przydzielony w przestrzeni jądra. Próbowałem wywoływać do_mmap() z MAP_HUGETLB, ale wydawało się, że nie zmienia to liczby bezpłatnych stron wścibskich, więc nie sądzę, że faktycznie wspierało mmap dużymi stronami.
Więc domyślam się, do czego dążę, czy jest tam jakikolwiek sposób mogę mapować bufor do 1GB HugePage w przestrzeni jądra, czy to musi być zrobione w przestrzeni użytkownika? Lub jeśli ktoś wie w inny sposób, mogę uzyskać ogromną (1-64 GB) ilość ciągłej pamięci fizycznej dostępnej jako bufor jądra?
Czy Twoim celem jest przede wszystkim uniknięcie kopiowania między jądrem a przestrzenią użytkownika? – ChuckCottrill
Wszystkie te interfejsy API dotyczą obszaru użytkownika. Zobacz, jak zaimplementowano hugetlbfs, szczególnie 'hugetlbfs_file_mmap'. –
@muusbolla Czy możesz znaleźć odpowiedź? –