mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Our current int_sqrt() is not rough nor any approximation; it calculates the exact value of: floor(sqrt()). Document this. Link: http://lkml.kernel.org/r/20171020164645.001652117@infradead.org Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Cc: Anshul Garg <aksgarg1989@gmail.com> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: David Miller <davem@davemloft.net> Cc: Ingo Molnar <mingo@kernel.org> Cc: Joe Perches <joe@perches.com> Cc: Kees Cook <keescook@chromium.org> Cc: Matthew Wilcox <mawilcox@microsoft.com> Cc: Michael Davidson <md@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			691 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			691 B
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
/*
 | 
						|
 * Copyright (C) 2013 Davidlohr Bueso <davidlohr.bueso@hp.com>
 | 
						|
 *
 | 
						|
 *  Based on the shift-and-subtract algorithm for computing integer
 | 
						|
 *  square root from Guy L. Steele.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <linux/export.h>
 | 
						|
#include <linux/bitops.h>
 | 
						|
 | 
						|
/**
 | 
						|
 * int_sqrt - computes the integer square root
 | 
						|
 * @x: integer of which to calculate the sqrt
 | 
						|
 *
 | 
						|
 * Computes: floor(sqrt(x))
 | 
						|
 */
 | 
						|
unsigned long int_sqrt(unsigned long x)
 | 
						|
{
 | 
						|
	unsigned long b, m, y = 0;
 | 
						|
 | 
						|
	if (x <= 1)
 | 
						|
		return x;
 | 
						|
 | 
						|
	m = 1UL << (__fls(x) & ~1UL);
 | 
						|
	while (m != 0) {
 | 
						|
		b = y + m;
 | 
						|
		y >>= 1;
 | 
						|
 | 
						|
		if (x >= b) {
 | 
						|
			x -= b;
 | 
						|
			y += m;
 | 
						|
		}
 | 
						|
		m >>= 2;
 | 
						|
	}
 | 
						|
 | 
						|
	return y;
 | 
						|
}
 | 
						|
EXPORT_SYMBOL(int_sqrt);
 |