Swap only altered elements of the grouplist in getgroups() (Kirill Shutemov).
authorbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 20 Sep 2008 02:12:08 +0000 (02:12 +0000)
committerbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 20 Sep 2008 02:12:08 +0000 (02:12 +0000)
getgroups() returns the number of supplementary group IDs, so it's
unnessary to swap the entire array.  It can dramatically speed up
the syscall: on recent Linux kernels NGROUPS_MAX=65536.

Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5267 c046a42c-6fe2-441c-8c8c-71466251a162

linux-user/syscall.c

index 4ba8880..2012eee 100644 (file)
@@ -5253,7 +5253,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
                 target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 2, 0);
                 if (!target_grouplist)
                     goto efault;
-                for(i = 0;i < gidsetsize; i++)
+                for(i = 0;i < ret; i++)
                     target_grouplist[i] = tswap16(grouplist[i]);
                 unlock_user(target_grouplist, arg2, gidsetsize * 2);
             }
@@ -5407,7 +5407,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
                     ret = -TARGET_EFAULT;
                     goto fail;
                 }
-                for(i = 0;i < gidsetsize; i++)
+                for(i = 0;i < ret; i++)
                     target_grouplist[i] = tswap32(grouplist[i]);
                 unlock_user(target_grouplist, arg2, gidsetsize * 4);
             }