xref: /linux/tools/include/linux/math.h (revision d6e6a27d)
1*d6e6a27dSMatthew Wilcox (Oracle) #ifndef _TOOLS_MATH_H
2*d6e6a27dSMatthew Wilcox (Oracle) #define _TOOLS_MATH_H
3*d6e6a27dSMatthew Wilcox (Oracle) 
4*d6e6a27dSMatthew Wilcox (Oracle) /*
5*d6e6a27dSMatthew Wilcox (Oracle)  * This looks more complex than it should be. But we need to
6*d6e6a27dSMatthew Wilcox (Oracle)  * get the type for the ~ right in round_down (it needs to be
7*d6e6a27dSMatthew Wilcox (Oracle)  * as wide as the result!), and we want to evaluate the macro
8*d6e6a27dSMatthew Wilcox (Oracle)  * arguments just once each.
9*d6e6a27dSMatthew Wilcox (Oracle)  */
10*d6e6a27dSMatthew Wilcox (Oracle) #define __round_mask(x, y) ((__typeof__(x))((y)-1))
11*d6e6a27dSMatthew Wilcox (Oracle) #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
12*d6e6a27dSMatthew Wilcox (Oracle) #define round_down(x, y) ((x) & ~__round_mask(x, y))
13*d6e6a27dSMatthew Wilcox (Oracle) 
14*d6e6a27dSMatthew Wilcox (Oracle) #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
15*d6e6a27dSMatthew Wilcox (Oracle) 
16*d6e6a27dSMatthew Wilcox (Oracle) #ifndef roundup
17*d6e6a27dSMatthew Wilcox (Oracle) #define roundup(x, y) (                                \
18*d6e6a27dSMatthew Wilcox (Oracle) {                                                      \
19*d6e6a27dSMatthew Wilcox (Oracle) 	const typeof(y) __y = y;		       \
20*d6e6a27dSMatthew Wilcox (Oracle) 	(((x) + (__y - 1)) / __y) * __y;	       \
21*d6e6a27dSMatthew Wilcox (Oracle) }                                                      \
22*d6e6a27dSMatthew Wilcox (Oracle) )
23*d6e6a27dSMatthew Wilcox (Oracle) #endif
24*d6e6a27dSMatthew Wilcox (Oracle) 
25*d6e6a27dSMatthew Wilcox (Oracle) #endif
26