On Thu, Aug 27, 2009 at 05:11:29PM +0800, Zhu Yi wrote: > On Wed, 2009-08-26 at 22:44 +0800, Andrew Morton wrote: > > > > It is perhaps pretty simple to make the second (GFP_ATOMIC) allocation > > go away. The code is already conveniently structured to do this: > > > > do { > > chunk = (struct fw_chunk *)(data + offset); > > offset += sizeof(struct fw_chunk); > > /* build DMA packet and queue up for sending */ > > /* dma to chunk->address, the chunk->length bytes from > > data + > > * offeset*/ > > /* Dma loading */ > > rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset, > > > > le32_to_cpu(chunk->address), > > > > le32_to_cpu(chunk->length)); > > if (rc) { > > IPW_DEBUG_INFO("dmaAddBuffer Failed\n"); > > goto out; > > } > > > > offset += le32_to_cpu(chunk->length); > > } while (offset < len); > > > > what is the typical/expected value of chunk->length here? If it's > > significantly less than 4096*(2^6), could we convert this function to > > use a separate DMAable allocation per fw_chunk? > > Unfortunately, the largest chunk size for the latest 3.1 firmware is > 0x20040, which also requires order 6 page allocation. I'll try to use > the firmware DMA command block (64 slots) to handle the image (each for > 4k, totally 256k). > That would be preferable as trying to make alloc-6 atomic allocations isn't going to pan out. As I noted, doing it as GFP_KERNEL is possible but it'll manifest as weird stalls periodically when the driver is loaded due to reclaim and if the system is swapless, it might not work at all if memory is mostly anonymous. If the DMA command block doesn't work out, what is the feasibility of holding onto the order-6 allocation once the module is loaded instead of allocing for the duration of the firmware loading and then freeing it again? -- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html