xref: /freebsd/sys/compat/linuxkpi/common/include/linux/mm.h (revision 8d59ecb214f7e078e57d35b865f33efc5d7cdf4d)
1*8d59ecb2SHans Petter Selasky /*-
2*8d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Isilon Systems, Inc.
3*8d59ecb2SHans Petter Selasky  * Copyright (c) 2010 iX Systems, Inc.
4*8d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Panasas, Inc.
5*8d59ecb2SHans Petter Selasky  * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
6*8d59ecb2SHans Petter Selasky  * Copyright (c) 2015 François Tigeot
7*8d59ecb2SHans Petter Selasky  * Copyright (c) 2015 Matthew Dillon <dillon@backplane.com>
8*8d59ecb2SHans Petter Selasky  * All rights reserved.
9*8d59ecb2SHans Petter Selasky  *
10*8d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
11*8d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
12*8d59ecb2SHans Petter Selasky  * are met:
13*8d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
14*8d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
15*8d59ecb2SHans Petter Selasky  *    disclaimer.
16*8d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
17*8d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
18*8d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
19*8d59ecb2SHans Petter Selasky  *
20*8d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*8d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*8d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*8d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*8d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*8d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*8d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*8d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*8d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29*8d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*8d59ecb2SHans Petter Selasky  *
31*8d59ecb2SHans Petter Selasky  * $FreeBSD$
32*8d59ecb2SHans Petter Selasky  */
33*8d59ecb2SHans Petter Selasky #ifndef	_LINUX_MM_H_
34*8d59ecb2SHans Petter Selasky #define	_LINUX_MM_H_
35*8d59ecb2SHans Petter Selasky 
36*8d59ecb2SHans Petter Selasky #include <linux/spinlock.h>
37*8d59ecb2SHans Petter Selasky #include <linux/gfp.h>
38*8d59ecb2SHans Petter Selasky #include <linux/kernel.h>
39*8d59ecb2SHans Petter Selasky 
40*8d59ecb2SHans Petter Selasky #define	PAGE_ALIGN(x)	ALIGN(x, PAGE_SIZE)
41*8d59ecb2SHans Petter Selasky 
42*8d59ecb2SHans Petter Selasky struct vm_area_struct {
43*8d59ecb2SHans Petter Selasky 	vm_offset_t	vm_start;
44*8d59ecb2SHans Petter Selasky 	vm_offset_t	vm_end;
45*8d59ecb2SHans Petter Selasky 	vm_offset_t	vm_pgoff;
46*8d59ecb2SHans Petter Selasky 	vm_paddr_t	vm_pfn;		/* PFN For mmap. */
47*8d59ecb2SHans Petter Selasky 	vm_size_t	vm_len;		/* length for mmap. */
48*8d59ecb2SHans Petter Selasky 	vm_memattr_t	vm_page_prot;
49*8d59ecb2SHans Petter Selasky };
50*8d59ecb2SHans Petter Selasky 
51*8d59ecb2SHans Petter Selasky /*
52*8d59ecb2SHans Petter Selasky  * Compute log2 of the power of two rounded up count of pages
53*8d59ecb2SHans Petter Selasky  * needed for size bytes.
54*8d59ecb2SHans Petter Selasky  */
55*8d59ecb2SHans Petter Selasky static inline int
56*8d59ecb2SHans Petter Selasky get_order(unsigned long size)
57*8d59ecb2SHans Petter Selasky {
58*8d59ecb2SHans Petter Selasky 	int order;
59*8d59ecb2SHans Petter Selasky 
60*8d59ecb2SHans Petter Selasky 	size = (size - 1) >> PAGE_SHIFT;
61*8d59ecb2SHans Petter Selasky 	order = 0;
62*8d59ecb2SHans Petter Selasky 	while (size) {
63*8d59ecb2SHans Petter Selasky 		order++;
64*8d59ecb2SHans Petter Selasky 		size >>= 1;
65*8d59ecb2SHans Petter Selasky 	}
66*8d59ecb2SHans Petter Selasky 	return (order);
67*8d59ecb2SHans Petter Selasky }
68*8d59ecb2SHans Petter Selasky 
69*8d59ecb2SHans Petter Selasky static inline void *
70*8d59ecb2SHans Petter Selasky lowmem_page_address(struct page *page)
71*8d59ecb2SHans Petter Selasky {
72*8d59ecb2SHans Petter Selasky 
73*8d59ecb2SHans Petter Selasky 	return page_address(page);
74*8d59ecb2SHans Petter Selasky }
75*8d59ecb2SHans Petter Selasky 
76*8d59ecb2SHans Petter Selasky /*
77*8d59ecb2SHans Petter Selasky  * This only works via mmap ops.
78*8d59ecb2SHans Petter Selasky  */
79*8d59ecb2SHans Petter Selasky static inline int
80*8d59ecb2SHans Petter Selasky io_remap_pfn_range(struct vm_area_struct *vma,
81*8d59ecb2SHans Petter Selasky     unsigned long addr, unsigned long pfn, unsigned long size,
82*8d59ecb2SHans Petter Selasky     vm_memattr_t prot)
83*8d59ecb2SHans Petter Selasky {
84*8d59ecb2SHans Petter Selasky 	vma->vm_page_prot = prot;
85*8d59ecb2SHans Petter Selasky 	vma->vm_pfn = pfn;
86*8d59ecb2SHans Petter Selasky 	vma->vm_len = size;
87*8d59ecb2SHans Petter Selasky 
88*8d59ecb2SHans Petter Selasky 	return (0);
89*8d59ecb2SHans Petter Selasky }
90*8d59ecb2SHans Petter Selasky 
91*8d59ecb2SHans Petter Selasky static inline unsigned long
92*8d59ecb2SHans Petter Selasky vma_pages(struct vm_area_struct *vma)
93*8d59ecb2SHans Petter Selasky {
94*8d59ecb2SHans Petter Selasky 	return ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT);
95*8d59ecb2SHans Petter Selasky }
96*8d59ecb2SHans Petter Selasky 
97*8d59ecb2SHans Petter Selasky #define	offset_in_page(off)	((off) & (PAGE_SIZE - 1))
98*8d59ecb2SHans Petter Selasky 
99*8d59ecb2SHans Petter Selasky static inline void
100*8d59ecb2SHans Petter Selasky set_page_dirty(struct vm_page *page)
101*8d59ecb2SHans Petter Selasky {
102*8d59ecb2SHans Petter Selasky 	vm_page_dirty(page);
103*8d59ecb2SHans Petter Selasky }
104*8d59ecb2SHans Petter Selasky 
105*8d59ecb2SHans Petter Selasky static inline void
106*8d59ecb2SHans Petter Selasky get_page(struct vm_page *page)
107*8d59ecb2SHans Petter Selasky {
108*8d59ecb2SHans Petter Selasky 	vm_page_hold(page);
109*8d59ecb2SHans Petter Selasky }
110*8d59ecb2SHans Petter Selasky 
111*8d59ecb2SHans Petter Selasky #endif	/* _LINUX_MM_H_ */
112