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

Re: mlock/guard page/xen-tools & lenny



On Mon, 2010-08-30 at 22:57 -0600, dann frazier wrote:
> On Mon, Aug 30, 2010 at 08:22:23AM -0600, dann frazier wrote:
> > hey Ian,
> >  I haven't seen any reports of xen problems w/ the latest lenny DSA
> > that added the guard page code. I looked at backporting the 3 patches
> > from Linus - but the mlock patch touches code that didn't exist in
> > .26, so I'm wondering if that patch is just not needed.
> 
> fyi, I setup a Xen/lenny system and didn't have any problems w/
> save/restore, so we're good afaict :)

Thanks, I can't see code  in the Lenny kernel equivalent to that which
was broken either.

I wrote a pretty skanky test program to test for the issue (mlock.c,
attached, run with "./mlock lock" to trigger the issue). I don't have a
Lenny system to hand right not where I can run it but if you still have
a Lenny system setup then it might be interesting to try. (the test
program doesn't actually require Xen to demonstrate the issue so any
Lenny system should do).

Ian.
-- 
Ian Campbell
Current Noise: Desecration - Human Gore

Barach's Rule:
	An alcoholic is a person who drinks more than his own physician.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/mman.h>

#include <sys/time.h>
#include <sys/resource.h>

#define PAGE_SIZE 4096
#define PAGE_MASK (~(PAGE_SIZE-1))

static void do_lock(void *addr, size_t len)
{
      void *laddr = (void *)((unsigned long)addr & PAGE_MASK);
      size_t llen = (len + ((unsigned long)addr - (unsigned long)laddr) +
                     PAGE_SIZE - 1) & PAGE_MASK;
      int e = mlock(laddr, llen);

      printf("locking %p-%p -> %p-%p -> %d\n",
	     addr, addr+len, laddr, laddr+llen, e);
      if (e < 0)
	      exit(1);
}

static void do_test(int lock_it)  __attribute__((noinline));
static void do_test(int lock_it) {
	struct rusage rbefore, rafter;
	struct {
		char pad1[2*PAGE_SIZE];
		unsigned long lock_me;
		char pad2[2*PAGE_SIZE];
	} s;
	unsigned long esp;

	s.pad1[0] = 1;
	s.pad2[2*PAGE_SIZE-1] = 1;

	//memset(&s.pad1, 0, sizeof(s.pad1));
	//memset(&s.pad2, 0, sizeof(s.pad2));

	printf("pad1 at %p-%p\n", &s.pad1[0], &s.pad1[sizeof(s.pad1)-1]);
	printf("LCK  at %p-%p\n", &s.lock_me, &s.lock_me + 1);
	printf("pad2 at %p-%p\n", &s.pad2[0], &s.pad2[sizeof(s.pad2)-1]);
	asm volatile("mov %%esp, %0\n" : "=r" (esp));
	printf("esp: %#lx\n", esp);

	if (lock_it) {
		do_lock(&s.lock_me, sizeof(s.lock_me));
	}

	getrusage(RUSAGE_SELF, &rbefore);

	s.lock_me = 0xdeadbeef;

	getrusage(RUSAGE_SELF, &rafter);

	printf("minor faults: %ld -> %ld\n", rbefore.ru_minflt, rafter.ru_minflt);
	printf("major faults: %ld -> %ld\n", rbefore.ru_majflt, rafter.ru_majflt);
	if (lock_it && (rbefore.ru_minflt != rafter.ru_minflt || rbefore.ru_majflt != rafter.ru_majflt))
		printf("ERROR -- Should not have faulted\n");
}

int main(int argc, char **argv)
{
	do_test(argc > 1 && strcmp(argv[1], "lock") == 0);
	return 0;
}

Reply to: