summaryrefslogtreecommitdiffstats
path: root/kernel/compat.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-03 19:14:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-03 19:14:51 -0400
commit1b044f1cfc65a7d90b209dfabd57e16d98b58c5b (patch)
treead657c911b563f9176b17578c0b88a1ea9916a02 /kernel/compat.c
parente0f3e8f14da868047c524a0cf11e08b95fd1b008 (diff)
parent2287d8664fe7345ead891017eccd879fc605305e (diff)
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner: "A rather large update for timers/timekeeping: - compat syscall consolidation (Al Viro) - Posix timer consolidation (Christoph Helwig / Thomas Gleixner) - Cleanup of the device tree based initialization for clockevents and clocksources (Daniel Lezcano) - Consolidation of the FTTMR010 clocksource/event driver (Linus Walleij) - The usual set of small fixes and updates all over the place" * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (93 commits) timers: Make the cpu base lock raw clocksource/drivers/mips-gic-timer: Fix an error code in 'gic_clocksource_of_init()' clocksource/drivers/fsl_ftm_timer: Unmap region obtained by of_iomap clocksource/drivers/tcb_clksrc: Make IO endian agnostic clocksource/drivers/sun4i: Switch to the timer-of common init clocksource/drivers/timer-of: Fix invalid iomap check Revert "ktime: Simplify ktime_compare implementation" clocksource/drivers: Fix uninitialized variable use in timer_of_init kselftests: timers: Add test for frequency step kselftests: timers: Fix inconsistency-check to not ignore first timestamp time: Add warning about imminent deprecation of CONFIG_GENERIC_TIME_VSYSCALL_OLD time: Clean up CLOCK_MONOTONIC_RAW time handling posix-cpu-timers: Make timespec to nsec conversion safe itimer: Make timeval to nsec conversion range limited timers: Fix parameter description of try_to_del_timer_sync() ktime: Simplify ktime_compare implementation clocksource/drivers/fttmr010: Factor out clock read code clocksource/drivers/fttmr010: Implement delay timer clocksource/drivers: Add timer-of common init routine clocksource/drivers/tcb_clksrc: Save timer context on suspend/resume ...
Diffstat (limited to 'kernel/compat.c')
-rw-r--r--kernel/compat.c526
1 files changed, 67 insertions, 459 deletions
diff --git a/kernel/compat.c b/kernel/compat.c
index 933bcb31ae10..ebd8bdc3fd68 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -30,100 +30,66 @@
30 30
31#include <linux/uaccess.h> 31#include <linux/uaccess.h>
32 32
33static int compat_get_timex(struct timex *txc, struct compat_timex __user *utp) 33int compat_get_timex(struct timex *txc, const struct compat_timex __user *utp)
34{ 34{
35 memset(txc, 0, sizeof(struct timex)); 35 struct compat_timex tx32;
36
37 if (!access_ok(VERIFY_READ, utp, sizeof(struct compat_timex)) ||
38 __get_user(txc->modes, &utp->modes) ||
39 __get_user(txc->offset, &utp->offset) ||
40 __get_user(txc->freq, &utp->freq) ||
41 __get_user(txc->maxerror, &utp->maxerror) ||
42 __get_user(txc->esterror, &utp->esterror) ||
43 __get_user(txc->status, &utp->status) ||
44 __get_user(txc->constant, &utp->constant) ||
45 __get_user(txc->precision, &utp->precision) ||
46 __get_user(txc->tolerance, &utp->tolerance) ||
47 __get_user(txc->time.tv_sec, &utp->time.tv_sec) ||
48 __get_user(txc->time.tv_usec, &utp->time.tv_usec) ||
49 __get_user(txc->tick, &utp->tick) ||
50 __get_user(txc->ppsfreq, &utp->ppsfreq) ||
51 __get_user(txc->jitter, &utp->jitter) ||
52 __get_user(txc->shift, &utp->shift) ||
53 __get_user(txc->stabil, &utp->stabil) ||
54 __get_user(txc->jitcnt, &utp->jitcnt) ||
55 __get_user(txc->calcnt, &utp->calcnt) ||
56 __get_user(txc->errcnt, &utp->errcnt) ||
57 __get_user(txc->stbcnt, &utp->stbcnt))
58 return -EFAULT;
59 36
60 return 0; 37 if (copy_from_user(&tx32, utp, sizeof(struct compat_timex)))
61}
62
63static int compat_put_timex(struct compat_timex __user *utp, struct timex *txc)
64{
65 if (!access_ok(VERIFY_WRITE, utp, sizeof(struct compat_timex)) ||
66 __put_user(txc->modes, &utp->modes) ||
67 __put_user(txc->offset, &utp->offset) ||
68 __put_user(txc->freq, &utp->freq) ||
69 __put_user(txc->maxerror, &utp->maxerror) ||
70 __put_user(txc->esterror, &utp->esterror) ||
71 __put_user(txc->status, &utp->status) ||
72 __put_user(txc->constant, &utp->constant) ||
73 __put_user(txc->precision, &utp->precision) ||
74 __put_user(txc->tolerance, &utp->tolerance) ||
75 __put_user(txc->time.tv_sec, &utp->time.tv_sec) ||
76 __put_user(txc->time.tv_usec, &utp->time.tv_usec) ||
77 __put_user(txc->tick, &utp->tick) ||
78 __put_user(txc->ppsfreq, &utp->ppsfreq) ||
79 __put_user(txc->jitter, &utp->jitter) ||
80 __put_user(txc->shift, &utp->shift) ||
81 __put_user(txc->stabil, &utp->stabil) ||
82 __put_user(txc->jitcnt, &utp->jitcnt) ||
83 __put_user(txc->calcnt, &utp->calcnt) ||
84 __put_user(txc->errcnt, &utp->errcnt) ||
85 __put_user(txc->stbcnt, &utp->stbcnt) ||
86 __put_user(txc->tai, &utp->tai))
87 return -EFAULT; 38 return -EFAULT;
88 return 0;
89}
90 39
91COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv, 40 txc->modes = tx32.modes;
92 struct timezone __user *, tz) 41 txc->offset = tx32.offset;
93{ 42 txc->freq = tx32.freq;
94 if (tv) { 43 txc->maxerror = tx32.maxerror;
95 struct timeval ktv; 44 txc->esterror = tx32.esterror;
96 do_gettimeofday(&ktv); 45 txc->status = tx32.status;
97 if (compat_put_timeval(&ktv, tv)) 46 txc->constant = tx32.constant;
98 return -EFAULT; 47 txc->precision = tx32.precision;
99 } 48 txc->tolerance = tx32.tolerance;
100 if (tz) { 49 txc->time.tv_sec = tx32.time.tv_sec;
101 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz))) 50 txc->time.tv_usec = tx32.time.tv_usec;
102 return -EFAULT; 51 txc->tick = tx32.tick;
103 } 52 txc->ppsfreq = tx32.ppsfreq;
53 txc->jitter = tx32.jitter;
54 txc->shift = tx32.shift;
55 txc->stabil = tx32.stabil;
56 txc->jitcnt = tx32.jitcnt;
57 txc->calcnt = tx32.calcnt;
58 txc->errcnt = tx32.errcnt;
59 txc->stbcnt = tx32.stbcnt;
104 60
105 return 0; 61 return 0;
106} 62}
107 63
108COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv, 64int compat_put_timex(struct compat_timex __user *utp, const struct timex *txc)
109 struct timezone __user *, tz) 65{
110{ 66 struct compat_timex tx32;
111 struct timespec64 new_ts; 67
112 struct timeval user_tv; 68 memset(&tx32, 0, sizeof(struct compat_timex));
113 struct timezone new_tz; 69 tx32.modes = txc->modes;
114 70 tx32.offset = txc->offset;
115 if (tv) { 71 tx32.freq = txc->freq;
116 if (compat_get_timeval(&user_tv, tv)) 72 tx32.maxerror = txc->maxerror;
117 return -EFAULT; 73 tx32.esterror = txc->esterror;
118 new_ts.tv_sec = user_tv.tv_sec; 74 tx32.status = txc->status;
119 new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; 75 tx32.constant = txc->constant;
120 } 76 tx32.precision = txc->precision;
121 if (tz) { 77 tx32.tolerance = txc->tolerance;
122 if (copy_from_user(&new_tz, tz, sizeof(*tz))) 78 tx32.time.tv_sec = txc->time.tv_sec;
123 return -EFAULT; 79 tx32.time.tv_usec = txc->time.tv_usec;
124 } 80 tx32.tick = txc->tick;
125 81 tx32.ppsfreq = txc->ppsfreq;
126 return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL); 82 tx32.jitter = txc->jitter;
83 tx32.shift = txc->shift;
84 tx32.stabil = txc->stabil;
85 tx32.jitcnt = txc->jitcnt;
86 tx32.calcnt = txc->calcnt;
87 tx32.errcnt = txc->errcnt;
88 tx32.stbcnt = txc->stbcnt;
89 tx32.tai = txc->tai;
90 if (copy_to_user(utp, &tx32, sizeof(struct compat_timex)))
91 return -EFAULT;
92 return 0;
127} 93}
128 94
129static int __compat_get_timeval(struct timeval *tv, const struct compat_timeval __user *ctv) 95static int __compat_get_timeval(struct timeval *tv, const struct compat_timeval __user *ctv)
@@ -213,141 +179,28 @@ int compat_convert_timespec(struct timespec __user **kts,
213 return 0; 179 return 0;
214} 180}
215 181
216static long compat_nanosleep_restart(struct restart_block *restart) 182int get_compat_itimerval(struct itimerval *o, const struct compat_itimerval __user *i)
217{
218 struct compat_timespec __user *rmtp;
219 struct timespec rmt;
220 mm_segment_t oldfs;
221 long ret;
222
223 restart->nanosleep.rmtp = (struct timespec __user *) &rmt;
224 oldfs = get_fs();
225 set_fs(KERNEL_DS);
226 ret = hrtimer_nanosleep_restart(restart);
227 set_fs(oldfs);
228
229 if (ret == -ERESTART_RESTARTBLOCK) {
230 rmtp = restart->nanosleep.compat_rmtp;
231
232 if (rmtp && compat_put_timespec(&rmt, rmtp))
233 return -EFAULT;
234 }
235
236 return ret;
237}
238
239COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
240 struct compat_timespec __user *, rmtp)
241{ 183{
242 struct timespec tu, rmt; 184 struct compat_itimerval v32;
243 struct timespec64 tu64;
244 mm_segment_t oldfs;
245 long ret;
246 185
247 if (compat_get_timespec(&tu, rqtp)) 186 if (copy_from_user(&v32, i, sizeof(struct compat_itimerval)))
248 return -EFAULT; 187 return -EFAULT;
249 188 o->it_interval.tv_sec = v32.it_interval.tv_sec;
250 tu64 = timespec_to_timespec64(tu); 189 o->it_interval.tv_usec = v32.it_interval.tv_usec;
251 if (!timespec64_valid(&tu64)) 190 o->it_value.tv_sec = v32.it_value.tv_sec;
252 return -EINVAL; 191 o->it_value.tv_usec = v32.it_value.tv_usec;
253 192 return 0;
254 oldfs = get_fs();
255 set_fs(KERNEL_DS);
256 ret = hrtimer_nanosleep(&tu64,
257 rmtp ? (struct timespec __user *)&rmt : NULL,
258 HRTIMER_MODE_REL, CLOCK_MONOTONIC);
259 set_fs(oldfs);
260
261 /*
262 * hrtimer_nanosleep() can only return 0 or
263 * -ERESTART_RESTARTBLOCK here because:
264 *
265 * - we call it with HRTIMER_MODE_REL and therefor exclude the
266 * -ERESTARTNOHAND return path.
267 *
268 * - we supply the rmtp argument from the task stack (due to
269 * the necessary compat conversion. So the update cannot
270 * fail, which excludes the -EFAULT return path as well. If
271 * it fails nevertheless we have a bigger problem and wont
272 * reach this place anymore.
273 *
274 * - if the return value is 0, we do not have to update rmtp
275 * because there is no remaining time.
276 *
277 * We check for -ERESTART_RESTARTBLOCK nevertheless if the
278 * core implementation decides to return random nonsense.
279 */
280 if (ret == -ERESTART_RESTARTBLOCK) {
281 struct restart_block *restart = &current->restart_block;
282
283 restart->fn = compat_nanosleep_restart;
284 restart->nanosleep.compat_rmtp = rmtp;
285
286 if (rmtp && compat_put_timespec(&rmt, rmtp))
287 return -EFAULT;
288 }
289 return ret;
290}
291
292static inline long get_compat_itimerval(struct itimerval *o,
293 struct compat_itimerval __user *i)
294{
295 return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
296 (__get_user(o->it_interval.tv_sec, &i->it_interval.tv_sec) |
297 __get_user(o->it_interval.tv_usec, &i->it_interval.tv_usec) |
298 __get_user(o->it_value.tv_sec, &i->it_value.tv_sec) |
299 __get_user(o->it_value.tv_usec, &i->it_value.tv_usec)));
300}
301
302static inline long put_compat_itimerval(struct compat_itimerval __user *o,
303 struct itimerval *i)
304{
305 return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
306 (__put_user(i->it_interval.tv_sec, &o->it_interval.tv_sec) |
307 __put_user(i->it_interval.tv_usec, &o->it_interval.tv_usec) |
308 __put_user(i->it_value.tv_sec, &o->it_value.tv_sec) |
309 __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
310}
311
312asmlinkage long sys_ni_posix_timers(void);
313
314COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
315 struct compat_itimerval __user *, it)
316{
317 struct itimerval kit;
318 int error;
319
320 if (!IS_ENABLED(CONFIG_POSIX_TIMERS))
321 return sys_ni_posix_timers();
322
323 error = do_getitimer(which, &kit);
324 if (!error && put_compat_itimerval(it, &kit))
325 error = -EFAULT;
326 return error;
327} 193}
328 194
329COMPAT_SYSCALL_DEFINE3(setitimer, int, which, 195int put_compat_itimerval(struct compat_itimerval __user *o, const struct itimerval *i)
330 struct compat_itimerval __user *, in,
331 struct compat_itimerval __user *, out)
332{ 196{
333 struct itimerval kin, kout; 197 struct compat_itimerval v32;
334 int error;
335
336 if (!IS_ENABLED(CONFIG_POSIX_TIMERS))
337 return sys_ni_posix_timers();
338 198
339 if (in) { 199 v32.it_interval.tv_sec = i->it_interval.tv_sec;
340 if (get_compat_itimerval(&kin, in)) 200 v32.it_interval.tv_usec = i->it_interval.tv_usec;
341 return -EFAULT; 201 v32.it_value.tv_sec = i->it_value.tv_sec;
342 } else 202 v32.it_value.tv_usec = i->it_value.tv_usec;
343 memset(&kin, 0, sizeof(kin)); 203 return copy_to_user(o, &v32, sizeof(struct compat_itimerval)) ? -EFAULT : 0;
344
345 error = do_setitimer(which, &kin, out ? &kout : NULL);
346 if (error || !out)
347 return error;
348 if (put_compat_itimerval(out, &kout))
349 return -EFAULT;
350 return 0;
351} 204}
352 205
353static compat_clock_t clock_t_to_compat_clock_t(clock_t x) 206static compat_clock_t clock_t_to_compat_clock_t(clock_t x)
@@ -689,193 +542,6 @@ int put_compat_itimerspec(struct compat_itimerspec __user *dst,
689 return 0; 542 return 0;
690} 543}
691 544
692COMPAT_SYSCALL_DEFINE3(timer_create, clockid_t, which_clock,
693 struct compat_sigevent __user *, timer_event_spec,
694 timer_t __user *, created_timer_id)
695{
696 struct sigevent __user *event = NULL;
697
698 if (timer_event_spec) {
699 struct sigevent kevent;
700
701 event = compat_alloc_user_space(sizeof(*event));
702 if (get_compat_sigevent(&kevent, timer_event_spec) ||
703 copy_to_user(event, &kevent, sizeof(*event)))
704 return -EFAULT;
705 }
706
707 return sys_timer_create(which_clock, event, created_timer_id);
708}
709
710COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
711 struct compat_itimerspec __user *, new,
712 struct compat_itimerspec __user *, old)
713{
714 long err;
715 mm_segment_t oldfs;
716 struct itimerspec newts, oldts;
717
718 if (!new)
719 return -EINVAL;
720 if (get_compat_itimerspec(&newts, new))
721 return -EFAULT;
722 oldfs = get_fs();
723 set_fs(KERNEL_DS);
724 err = sys_timer_settime(timer_id, flags,
725 (struct itimerspec __user *) &newts,
726 (struct itimerspec __user *) &oldts);
727 set_fs(oldfs);
728 if (!err && old && put_compat_itimerspec(old, &oldts))
729 return -EFAULT;
730 return err;
731}
732
733COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
734 struct compat_itimerspec __user *, setting)
735{
736 long err;
737 mm_segment_t oldfs;
738 struct itimerspec ts;
739
740 oldfs = get_fs();
741 set_fs(KERNEL_DS);
742 err = sys_timer_gettime(timer_id,
743 (struct itimerspec __user *) &ts);
744 set_fs(oldfs);
745 if (!err && put_compat_itimerspec(setting, &ts))
746 return -EFAULT;
747 return err;
748}
749
750COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
751 struct compat_timespec __user *, tp)
752{
753 long err;
754 mm_segment_t oldfs;
755 struct timespec ts;
756
757 if (compat_get_timespec(&ts, tp))
758 return -EFAULT;
759 oldfs = get_fs();
760 set_fs(KERNEL_DS);
761 err = sys_clock_settime(which_clock,
762 (struct timespec __user *) &ts);
763 set_fs(oldfs);
764 return err;
765}
766
767COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
768 struct compat_timespec __user *, tp)
769{
770 long err;
771 mm_segment_t oldfs;
772 struct timespec ts;
773
774 oldfs = get_fs();
775 set_fs(KERNEL_DS);
776 err = sys_clock_gettime(which_clock,
777 (struct timespec __user *) &ts);
778 set_fs(oldfs);
779 if (!err && compat_put_timespec(&ts, tp))
780 return -EFAULT;
781 return err;
782}
783
784COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
785 struct compat_timex __user *, utp)
786{
787 struct timex txc;
788 mm_segment_t oldfs;
789 int err, ret;
790
791 err = compat_get_timex(&txc, utp);
792 if (err)
793 return err;
794
795 oldfs = get_fs();
796 set_fs(KERNEL_DS);
797 ret = sys_clock_adjtime(which_clock, (struct timex __user *) &txc);
798 set_fs(oldfs);
799
800 err = compat_put_timex(utp, &txc);
801 if (err)
802 return err;
803
804 return ret;
805}
806
807COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
808 struct compat_timespec __user *, tp)
809{
810 long err;
811 mm_segment_t oldfs;
812 struct timespec ts;
813
814 oldfs = get_fs();
815 set_fs(KERNEL_DS);
816 err = sys_clock_getres(which_clock,
817 (struct timespec __user *) &ts);
818 set_fs(oldfs);
819 if (!err && tp && compat_put_timespec(&ts, tp))
820 return -EFAULT;
821 return err;
822}
823
824static long compat_clock_nanosleep_restart(struct restart_block *restart)
825{
826 long err;
827 mm_segment_t oldfs;
828 struct timespec tu;
829 struct compat_timespec __user *rmtp = restart->nanosleep.compat_rmtp;
830
831 restart->nanosleep.rmtp = (struct timespec __user *) &tu;
832 oldfs = get_fs();
833 set_fs(KERNEL_DS);
834 err = clock_nanosleep_restart(restart);
835 set_fs(oldfs);
836
837 if ((err == -ERESTART_RESTARTBLOCK) && rmtp &&
838 compat_put_timespec(&tu, rmtp))
839 return -EFAULT;
840
841 if (err == -ERESTART_RESTARTBLOCK) {
842 restart->fn = compat_clock_nanosleep_restart;
843 restart->nanosleep.compat_rmtp = rmtp;
844 }
845 return err;
846}
847
848COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
849 struct compat_timespec __user *, rqtp,
850 struct compat_timespec __user *, rmtp)
851{
852 long err;
853 mm_segment_t oldfs;
854 struct timespec in, out;
855 struct restart_block *restart;
856
857 if (compat_get_timespec(&in, rqtp))
858 return -EFAULT;
859
860 oldfs = get_fs();
861 set_fs(KERNEL_DS);
862 err = sys_clock_nanosleep(which_clock, flags,
863 (struct timespec __user *) &in,
864 (struct timespec __user *) &out);
865 set_fs(oldfs);
866
867 if ((err == -ERESTART_RESTARTBLOCK) && rmtp &&
868 compat_put_timespec(&out, rmtp))
869 return -EFAULT;
870
871 if (err == -ERESTART_RESTARTBLOCK) {
872 restart = &current->restart_block;
873 restart->fn = compat_clock_nanosleep_restart;
874 restart->nanosleep.compat_rmtp = rmtp;
875 }
876 return err;
877}
878
879/* 545/*
880 * We currently only need the following fields from the sigevent 546 * We currently only need the following fields from the sigevent
881 * structure: sigev_value, sigev_signo, sig_notify and (sometimes 547 * structure: sigev_value, sigev_signo, sig_notify and (sometimes
@@ -1035,64 +701,6 @@ COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
1035 return ret; 701 return ret;
1036} 702}
1037 703
1038#ifdef __ARCH_WANT_COMPAT_SYS_TIME
1039
1040/* compat_time_t is a 32 bit "long" and needs to get converted. */
1041
1042COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc)
1043{
1044 compat_time_t i;
1045 struct timeval tv;
1046
1047 do_gettimeofday(&tv);
1048 i = tv.tv_sec;
1049
1050 if (tloc) {
1051 if (put_user(i,tloc))
1052 return -EFAULT;
1053 }
1054 force_successful_syscall_return();
1055 return i;
1056}
1057
1058COMPAT_SYSCALL_DEFINE1(stime, compat_time_t __user *, tptr)
1059{
1060 struct timespec tv;
1061 int err;
1062
1063 if (get_user(tv.tv_sec, tptr))
1064 return -EFAULT;
1065
1066 tv.tv_nsec = 0;
1067
1068 err = security_settime(&tv, NULL);
1069 if (err)
1070 return err;
1071
1072 do_settimeofday(&tv);
1073 return 0;
1074}
1075
1076#endif /* __ARCH_WANT_COMPAT_SYS_TIME */
1077
1078COMPAT_SYSCALL_DEFINE1(adjtimex, struct compat_timex __user *, utp)
1079{
1080 struct timex txc;
1081 int err, ret;
1082
1083 err = compat_get_timex(&txc, utp);
1084 if (err)
1085 return err;
1086
1087 ret = do_adjtimex(&txc);
1088
1089 err = compat_put_timex(utp, &txc);
1090 if (err)
1091 return err;
1092
1093 return ret;
1094}
1095
1096#ifdef CONFIG_NUMA 704#ifdef CONFIG_NUMA
1097COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages, 705COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages,
1098 compat_uptr_t __user *, pages32, 706 compat_uptr_t __user *, pages32,