privcmd: sprinkle around cond_resched() calls in mmap ioctl handling Many of these operations can be arbitrarily long, which can become a problem irrespective of them being exposed to privileged users only. Signed-off-by: Jan Beulich --- sle11sp3.orig/drivers/xen/privcmd/privcmd.c 2012-12-12 12:05:51.000000000 +0100 +++ sle11sp3/drivers/xen/privcmd/privcmd.c 2014-01-16 10:01:23.000000000 +0100 @@ -126,6 +126,9 @@ static long privcmd_ioctl(struct file *f p = mmapcmd.entry; for (i = 0; i < mmapcmd.num;) { + if (i) + cond_resched(); + nr = min(mmapcmd.num - i, MMAP_NR_PER_PAGE); ret = -ENOMEM; @@ -158,6 +161,9 @@ static long privcmd_ioctl(struct file *f i = 0; list_for_each(l, &pagelist) { + if (i) + cond_resched(); + nr = i + min(mmapcmd.num - i, MMAP_NR_PER_PAGE); msg = (privcmd_mmap_entry_t*)(l + 1); @@ -186,6 +192,9 @@ static long privcmd_ioctl(struct file *f addr = vma->vm_start; i = 0; list_for_each(l, &pagelist) { + if (i) + cond_resched(); + nr = i + min(mmapcmd.num - i, MMAP_NR_PER_PAGE); msg = (privcmd_mmap_entry_t*)(l + 1); @@ -209,8 +218,12 @@ static long privcmd_ioctl(struct file *f mmap_out: up_write(&mm->mmap_sem); - list_for_each_safe(l,l2,&pagelist) + i = 0; + list_for_each_safe(l, l2, &pagelist) { + if (!(++i & 7)) + cond_resched(); free_page((unsigned long)l); + } } #undef MMAP_NR_PER_PAGE break; @@ -236,6 +249,9 @@ static long privcmd_ioctl(struct file *f p = m.arr; for (i=0; i