2013-10-17 6 views
0

J'ai ce périphérique x86 et un module noyau qui essaie d'allouer de la mémoire DMA. Il possède un paramètre appelé dmasize qui permet de contrôler la taille de la mémoire allouée.dma_alloc_coherent échoue lorsque le tampon> 2M sur le noyau 3.2

J'ai remarqué que l'allocation réussit quand dmasize = 2M mais pas si elle est plus grande. Même au démarrage. J'ai entendu qu'il y avait une limitation par CONSISTENT_DMA_SIZE, mais en regardant lxr, je ne peux pas le trouver pour le noyau d'architecture x86 3.2.

Vous ne savez pas si c'est pertinent, mais il s'agit d'une machine 32 bits avec 8 Go de RAM et un noyau compatible pae.

C'est l'appel à dma_alloc_coherent:

dma_addr_t dma_handle; 

if (!(_dma_vbase = dma_alloc_coherent(0, alloc_size, &dma_handle, GFP_KERNEL)) || !dma_handle) { 
    gprintk("_alloc_mpool: Kernel failed to allocate the memory pool of size 0x%lx\n", (unsigned long)alloc_size); 
    return; 
    } 

Appréciez tous ceux qui peuvent aider.

+0

Votre appareil est-il sur un bus ISA ou PCI? –

+0

PCI. Cela affecte-t-il l'appel de fonction? – shayst

+0

Pour les périphériques PCI, vous devez définir le premier paramètre de 'dma_alloc_coherent'. Quoi qu'il en soit, les allocations importantes ont probablement besoin de [Allocation de mémoire contiguë] (http://mina86.com/2012/06/10/deep-dive-into-contiguous-memory-allocator-part-i/). –

Répondre

1

Juste au cas où quelqu'un trouverait cela, la réponse est la suivante: L'indicateur de config CONFIG_FORCE_MAX_ZONEORDER qui par défaut à 11 au plus architecture est la cause de cette limitation.

l'augmenter à 12 (et recompiler le noyau) résout le problème.

Je suppose que l'utilisation de CMA sera également possible mais comme mon noyau ne le supporte pas, je ne peux pas le dire avec certitude.

Questions connexes