[RFC] manage multiple entries of scratch page with scatterlist

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

 



Hi,

I am working on a feature to implement support for gem objects to have variable size and realized a problem with the current implementation.
Please advice me how to handle this situation efficiently.

In this implementation the backing store of the object is replaced with scratch pages according to input range; Initially I store table entries in an array, replace relevant entries with scratch pages and I am using sg_alloc_table_from_pages() to create new sg_table which is assigned to the object. This implementation works as expected but I realized it is wasting memory as scratch page count increases.

Consider the worst case scenario where all pages are replaced with scratch pages.

The fn sg_alloc_table_from_pages() first computes the number of chunks based on the page frame numbers. PFNs that are consecutive form a chunk and it allocates scatterlists for each chunk which form the sg_table.

In case of scratch pages they get the same pfn for each page and
sg_alloc_table_from_pages() considers them not part of a chunk and it
allocates scatterlist structure for each scratch page which takes lot of memory as the object size increases.

I have to tried to modify sg_alloc_table_from_pages() implementation to check for scratch pfn and consider them as single chunk but after the update when iterating through for_each_sg_page() I am seeing different page addresses instead of all pointing to scratch page.

Eg. In an object of size 8 pages, scratch_page = ffffea0001120000 and pfn: 0x00044800, the result I get is,

page[0]: ffffea0001120000, pfn: 0x00044800,
page[1]: ffffea0001120040, pfn: 0x00044801,
page[2]: ffffea0001120080, pfn: 0x00044802,
page[3]: ffffea00011200c0, pfn: 0x00044803,
page[4]: ffffea0001120100, pfn: 0x00044804,
page[5]: ffffea0001120140, pfn: 0x00044805,
page[6]: ffffea0001120180, pfn: 0x00044806,
page[7]: ffffea00011201c0, pfn: 0x00044807,

How to manage multiple pages that have same pfn with a single scatterlist and still have it's length equal to (PAGE_SIZE*chunk_size)?

I would really appreciate any suggestions to improve this implementation.

regards
Arun
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux