Re: Exception while handling MEM Hole on OMAP3 / ARM Cortex A8

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

 



On Mon, Aug 17, 2009 at 03:23:18PM -0500, Aguirre Rodriguez, Sergio Alberto wrote:
> #ifndef CONFIG_SPARSEMEM
> int pfn_valid(unsigned long pfn)
> {
> 	struct meminfo *mi = &meminfo;
> 	unsigned int left = 0, right = mi->nr_banks;
> 
> 	while (left <= right) {

This condition will cause the while to loop forever when left == right
and pfn < bank_pfn_start(bank).

> 		unsigned int mid = (right - left) / 2;

This calculation is incorrect when left != 0 (also in the original
patch).

> 		struct membank *bank = &mi->bank[mid];
> 
> 		if (pfn < bank_pfn_start(bank))
> 			right = mid;
> 		else if (pfn >= bank_pfn_end(bank))
> 			left = mid + 1;
> 		else
> 			return 1;
> 	}
> 	return 0;
> }
> EXPORT_SYMBOL(pfn_valid);
> #endif

Here's a fixed version:

int pfn_valid(unsigned long pfn)
{
	struct meminfo *mi = &meminfo;
	unsigned int left = 0, right = mi->nr_banks;

	while (left < right) {
			unsigned int mid = (left + right) / 2;
			struct membank *bank = &mi->bank[mid];

			if (pfn < bank_pfn_start(bank))
				right = mid;
			else if (pfn >= bank_pfn_end(bank))
				left = mid + 1;
			else
				return 1;
	}

	return 0;
}

Rabin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux