* PG_reserved is set for special pages, which can never be swapped out. Some
* of them might not even exist (eg empty_bad_page)...
* During disk I/O, PG_locked is used. This bit is set before I/O and
* reset when I/O completes. page_waitqueue(page) is a wait queue of all tasks
* waiting for the I/O on this page to complete.
PG_locked是在做disk I/O时让别人不要touch,谁会去touch呢?我认为是page cache的回收程序。因为disk I/O主要是和page cache打交道,而page cache又是动态回收的。所以在做DMA的时候不允许该页面被回收。
static int alloc_dmabuf(ymfpci_t *unit, struct ymf_dmabuf *dmabuf)
{
void *rawbuf = NULL;
dma_addr_t dma_addr;
int order;
struct page *map, *mapend;
/* alloc as big a chunk as we can */
for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) {
rawbuf = pci_alloc_consistent(unit->pci, PAGE_SIZE << order, &dma_addr);
if (rawbuf)
break;
}
if (!rawbuf)
return -ENOMEM;
#if 0
printk(KERN_DEBUG "ymfpci: allocated %ld (order = %d) bytes at %p\n",
PAGE_SIZE << order, order, rawbuf);
#endif
dmabuf->ready = dmabuf->mapped = 0;
dmabuf->rawbuf = rawbuf;
dmabuf->dma_addr = dma_addr;
dmabuf->buforder = order;
/* now mark the pages as reserved; otherwise remap_pfn_range doesn't do what we want */
mapend = virt_to_page(rawbuf + (PAGE_SIZE << order) - 1);
for (map = virt_to_page(rawbuf); map <= mapend; map++)
set_bit(PG_reserved, &map->flags);
return 0;
}