Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1514030
| From | Alexander Duyck <alexander.h.duyck@intel.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [mm PATCH v2 24/26] mm: Add support for releasing multiple instances of a page |
| Date | 2016-11-02 18:20 +0100 |
| Message-ID | <sz7mH-J6-87@gated-at.bofh.it> (permalink) |
| References | <sz7mF-J6-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
This patch adds a function that allows us to batch free a page that has
multiple references outstanding. Specifically this function can be used to
drop a page being used in the page frag alloc cache. With this drivers can
make use of functionality similar to the page frag alloc cache without
having to do any workarounds for the fact that there is no function that
frees multiple references.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
---
include/linux/gfp.h | 2 ++
mm/page_alloc.c | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index f8041f9de..4175dca 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -506,6 +506,8 @@ extern struct page *alloc_pages_vma(gfp_t gfp_mask, int order,
extern void free_hot_cold_page_list(struct list_head *list, bool cold);
struct page_frag_cache;
+extern void __page_frag_drain(struct page *page, unsigned int order,
+ unsigned int count);
extern void *__alloc_page_frag(struct page_frag_cache *nc,
unsigned int fragsz, gfp_t gfp_mask);
extern void __free_page_frag(void *addr);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 65e0b51..bb6d7bd 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3938,6 +3938,20 @@ static struct page *__page_frag_refill(struct page_frag_cache *nc,
return page;
}
+void __page_frag_drain(struct page *page, unsigned int order,
+ unsigned int count)
+{
+ VM_BUG_ON_PAGE(page_ref_count(page) == 0, page);
+
+ if (page_ref_sub_and_test(page, count)) {
+ if (order == 0)
+ free_hot_cold_page(page, false);
+ else
+ __free_pages_ok(page, order);
+ }
+}
+EXPORT_SYMBOL(__page_frag_drain);
+
void *__alloc_page_frag(struct page_frag_cache *nc,
unsigned int fragsz, gfp_t gfp_mask)
{
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[mm PATCH v2 00/26] Add support for DMA writable pages being writable by the network stack Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 01/26] swiotlb: Drop unused functions swiotlb_map_sg and swiotlb_unmap_sg Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
Re: [mm PATCH v2 01/26] swiotlb: Drop unused functions swiotlb_map_sg and swiotlb_unmap_sg Christoph Hellwig <hch@infradead.org> - 2016-11-03 15:20 +0100
Re: [mm PATCH v2 01/26] swiotlb: Drop unused functions swiotlb_map_sg and swiotlb_unmap_sg Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> - 2016-11-03 15:40 +0100
Re: [mm PATCH v2 01/26] swiotlb: Drop unused functions swiotlb_map_sg and swiotlb_unmap_sg Christoph Hellwig <hch@infradead.org> - 2016-11-03 15:50 +0100
RE: [mm PATCH v2 01/26] swiotlb: Drop unused functions swiotlb_map_sg and swiotlb_unmap_sg "Duyck, Alexander H" <alexander.h.duyck@intel.com> - 2016-11-03 16:10 +0100
[mm PATCH v2 06/26] arch/avr32: Add option to skip sync on DMA map Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 23/26] dma: Add calls for dma_map_page_attrs and dma_unmap_page_attrs Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 21/26] arch/tile: Add option to skip DMA sync as a part of map and unmap Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 04/26] arch/arc: Add option to skip sync on DMA mapping Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 09/26] arch/frv: Add option to skip sync on DMA map Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 26/26] igb: Update code to better handle incrementing page count Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 12/26] arch/metag: Add option to skip DMA sync as a part of map and unmap Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 08/26] arch/c6x: Add option to skip sync on DMA map and unmap Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 24/26] mm: Add support for releasing multiple instances of a page Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 16/26] arch/openrisc: Add option to skip DMA sync as a part of mapping Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:20 +0100
[mm PATCH v2 13/26] arch/microblaze: Add option to skip DMA sync as a part of map and unmap Alexander Duyck <alexander.h.duyck@intel.com> - 2016-11-02 18:30 +0100
csiph-web