我正在爲SPI連接的LCD寫幀緩衝驅動程序。我使用kmalloc分配緩衝區,這是相當大的 - 150KB。考慮到kmalloc分配緩衝區的方式,ksize報告說,更多的內存正在被使用 - 大約256KB左右。kmalloc中的緩衝區是否也是DMA安全緩衝區?
SPI spi_transfer結構需要指向tx和rx緩衝區的指針,它們都必須是DMA安全的。因爲我希望tx緩衝區大約爲16KB,我可以在kmalloced視頻緩衝區內分配緩衝區,並仍然是DMA安全的嗎?
這可能被認爲是不成熟的優化,但視頻緩衝區中有太多的空閒空間,所以感覺不好不要使用它!本質上存在之間分配的內存沒有任何區別:
kmalloc(videosize)
和
kmalloc(PAGE_ALIGN(videosize) + txbufsize)
這樣一個可以採取kptr返回,並做到:
txbuf = (u8 *)kptr + PAGE_ALIGN(videosize);
我知道的那部分「DMA安全」的要求是適當的對齊 - CPU緩存線的大小,我相信... - 但不應該頁面對齊爲這個好嗎?
順便說一句,我不確定tx和rx是否可以指向相同的地方。 spi.h標題也不清楚(實際上明確不清楚)。由於rx緩衝區永遠不會超過幾個字節,因此試圖找出問題將會很麻煩!
也許嘗試構建你的代碼直接寫入到內存DMA'ble,而不是一個kmalloc的緩衝? – tangrs
你爲什麼使用'kmalloc'作爲視頻緩衝區? –
與__get_free_pages相反?應該沒有什麼區別......他們都是DMA安全的。我可以半回答我自己的問題 - 如果我對齊一個頁面,我相信會排除任何緩存一致性問題的可能性,即使它是過度殺毒,也不會查看TLB的東西。 – carveone