Page allocator doubt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




I have a doubt about the page allocation. I need to allocate a number of contiguous pages to later initialize and add them to the page cache. I'm doing something like that:


	struct address_space *x = &area->vm_file->f_dentry->d_inode->i_data;
	struct page *page = alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, order);

	for (i = 0; i< 1<<order; i++) {
		struct page *pg = page + i;
		printk("Page count of page %i is %i\n", i, page_count(pg));
		printk("Page address: 0x%lx\n", page_address(pg));
	}

	For my surprise, for order = 4 I got the following output:

	Page count of page 0 is 1
	Page address: 0xe00000003c1e0000
	Page count of page 1 is 0
	Page address: 0xe00000003c1e4000
	Page count of page 2 is 0
	Page address: 0xe00000003c1e8000
	Page count of page 3 is 0
	Page address: 0xe00000003c1ec000

Only the first page got it page counter incremented. Is this expected? As far as I understand, if page_count is 0 the page is free.
Looking at page_alloc, I found set_page_refs (below), and it really sets the page count only for the first page for machines with MMU.
I'm confused... are these pages really allocated to me?


	I'm running kernel 2.6.8-rc3 on a IPF machine.

	Thanks in advance for any help!

	Luciano Stertz


static inline void set_page_refs(struct page *page, int order) { #ifdef CONFIG_MMU set_page_count(page, 1); #else int i;

    /*
     * We need to reference all the pages for this order, otherwise if
     * anyone accesses one of the pages with (get/put) it will be freed.
     */
    for (i = 0; i < (1 << order); i++)
        set_page_count(page+i, 1);
#endif /* CONFIG_MMU */
}



--
Luciano A. Stertz
luciano@xxxxxxxxxxxx
T&T Engenheiros Associados Ltda
http://www.tteng.com.br
Fone/Fax (51) 3224 8425

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux