#!/usr/bin/perl

chdir('/');

my $interesting_order = 3;
my $interesting_watermark = 'low';

open(IN,"< /proc/zoneinfo") or die;
my %watermarks;
my ($node,$zone);
while (<IN>) {
	if (/^Node\s+(\d+),\s*zone\s+(.*)$/) {
		$node = $1;
		$zone = $2;
		next;
	}
	if (/\s*(min|low|high)\s+(\d+)/) {
		$watermarks{$node}{$zone}{$1} = $2;
	}
}
close(IN);

for (;;select '','','',0.2) {
	open(IN,"< /proc/buddyinfo") or die;
	$there = 0;
	@lines = ();
       	while (<IN>) {
		next if (/DMA /);
		chomp;
		next unless (s/^Node (\d+), zone//);
		$node = $1;
		@pages = split;
		$zone = shift @pages;
		my $nr_pages_free = 0;
		my $o = 0;
		foreach my $f (@pages) {
			$nr_pages_free+= $f << $o;
			$o++;
		}
		# Start of zone_pages_ok() reimplementation
		my $free_pages = $nr_pages_free - (1 << $interesting_order) + 1;
		my $min = $watermarks{$node}{$zone}{$interesting_watermark};
		my $buzzer = '';
		for (my $o = 0;$o < $interesting_order;$o++) {
			$free_pages-= $pages[$o] << $o;
			$min>>= 1;
			if ($free_pages <= $min) {
				$buzzer = "$free_pages <= $min !!!";
				last;
			} else {
				$buzzer = "$free_pages <= $min";
			}
		}
		# Squish it a bit
		printf("%6s %7u %6u %5u %5u %4u %3u %2u %1u %1u %1u %1u %7u %s\033[K\n",
			$zone,@pages,$nr_pages_free,$buzzer);
	}
	printf("%6s %7s %6s %5s %5s %4s %3s %2s %1s %1s %1s %1s %7s %s\033[K\r",
		'Zone','order:0',1,2,3,4,5,6,7,8,9,'A','nr_free','or3-low-chk');
	$| = 1; $| = 0;
}
