diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/alpha/Makefile | 10 | ||||
-rw-r--r-- | arch/alpha/kernel/err_ev7.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/err_marvel.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/err_titan.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/machvec_impl.h | 2 | ||||
-rw-r--r-- | arch/alpha/lib/ev6-stxncpy.S | 14 | ||||
-rw-r--r-- | arch/alpha/lib/strncpy.S | 2 | ||||
-rw-r--r-- | arch/alpha/lib/stxncpy.S | 14 | ||||
-rw-r--r-- | arch/um/drivers/net_user.c | 2 | ||||
-rw-r--r-- | arch/um/drivers/slip_user.c | 12 | ||||
-rw-r--r-- | arch/um/drivers/slirp_user.c | 15 | ||||
-rw-r--r-- | arch/um/drivers/ubd_user.c | 3 | ||||
-rw-r--r-- | arch/um/include/os.h | 2 | ||||
-rw-r--r-- | arch/um/os-Linux/aio.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/drivers/ethertap_user.c | 10 | ||||
-rw-r--r-- | arch/um/os-Linux/drivers/tuntap_user.c | 2 | ||||
-rw-r--r-- | arch/um/os-Linux/helper.c | 38 | ||||
-rw-r--r-- | arch/um/os-Linux/process.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/process.c | 12 | ||||
-rw-r--r-- | arch/um/os-Linux/util.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/suspend_64.c | 39 |
21 files changed, 80 insertions, 113 deletions
diff --git a/arch/alpha/Makefile b/arch/alpha/Makefile index 63104eb..4e1a8e2 100644 --- a/arch/alpha/Makefile +++ b/arch/alpha/Makefile @@ -14,13 +14,13 @@ LDFLAGS_vmlinux := -static -N #-relax CHECKFLAGS += -D__alpha__ -m64 cflags-y := -pipe -mno-fp-regs -ffixed-8 -msmall-data -cpuflags-$(CONFIG_ALPHA_EV67) := -mcpu=ev67 -cpuflags-$(CONFIG_ALPHA_EV6) := -mcpu=ev6 +cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4 +cpuflags-$(CONFIG_ALPHA_EV5) := -mcpu=ev5 +cpuflags-$(CONFIG_ALPHA_EV56) := -mcpu=ev56 cpuflags-$(CONFIG_ALPHA_POLARIS) := -mcpu=pca56 cpuflags-$(CONFIG_ALPHA_SX164) := -mcpu=pca56 -cpuflags-$(CONFIG_ALPHA_EV56) := -mcpu=ev56 -cpuflags-$(CONFIG_ALPHA_EV5) := -mcpu=ev5 -cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4 +cpuflags-$(CONFIG_ALPHA_EV6) := -mcpu=ev6 +cpuflags-$(CONFIG_ALPHA_EV67) := -mcpu=ev67 # If GENERIC, make sure to turn off any instruction set extensions that # the host compiler might have on by default. Given that EV4 and EV5 # have the same instruction set, prefer EV5 because an EV5 schedule is diff --git a/arch/alpha/kernel/err_ev7.c b/arch/alpha/kernel/err_ev7.c index bc799f7..68cd493 100644 --- a/arch/alpha/kernel/err_ev7.c +++ b/arch/alpha/kernel/err_ev7.c @@ -273,7 +273,7 @@ ev7_process_pal_subpacket(struct el_subpacket *header) struct el_subpacket_handler ev7_pal_subpacket_handler = SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket); -void +void __init ev7_register_error_handlers(void) { int i; diff --git a/arch/alpha/kernel/err_marvel.c b/arch/alpha/kernel/err_marvel.c index 497877b..413bf37 100644 --- a/arch/alpha/kernel/err_marvel.c +++ b/arch/alpha/kernel/err_marvel.c @@ -1152,7 +1152,7 @@ marvel_machine_check(u64 vector, u64 la_ptr) mb(); } -void +void __init marvel_register_error_handlers(void) { ev7_register_error_handlers(); diff --git a/arch/alpha/kernel/err_titan.c b/arch/alpha/kernel/err_titan.c index 6f38678..257449e 100644 --- a/arch/alpha/kernel/err_titan.c +++ b/arch/alpha/kernel/err_titan.c @@ -564,7 +564,7 @@ static struct el_subpacket_handler titan_subpacket_handler = SUBPACKET_HANDLER_INIT(EL_CLASS__REGATTA_FAMILY, el_process_regatta_subpacket); -void +void __init titan_register_error_handlers(void) { size_t i; diff --git a/arch/alpha/kernel/machvec_impl.h b/arch/alpha/kernel/machvec_impl.h index 0caa45a..466c9df 100644 --- a/arch/alpha/kernel/machvec_impl.h +++ b/arch/alpha/kernel/machvec_impl.h @@ -134,7 +134,7 @@ #define __initmv __initdata #define ALIAS_MV(x) #else -#define __initmv +#define __initmv __initdata_refok /* GCC actually has a syntax for defining aliases, but is under some delusion that you shouldn't be able to declare it extern somewhere diff --git a/arch/alpha/lib/ev6-stxncpy.S b/arch/alpha/lib/ev6-stxncpy.S index b581a7a..1aa6e97 100644 --- a/arch/alpha/lib/ev6-stxncpy.S +++ b/arch/alpha/lib/ev6-stxncpy.S @@ -362,10 +362,10 @@ $unaligned: extql t2, a1, t2 # U : cmpbge zero, t1, t8 # E : is there a zero? - andnot t2, t6, t12 # E : dest mask for a single word copy + andnot t2, t6, t2 # E : dest mask for a single word copy or t8, t10, t5 # E : test for end-of-count too - cmpbge zero, t12, t3 # E : + cmpbge zero, t2, t3 # E : cmoveq a2, t5, t8 # E : Latency=2, extra map slot nop # E : keep with cmoveq andnot t8, t3, t8 # E : (stall) @@ -379,13 +379,13 @@ $unaligned: negq t8, t6 # E : build bitmask of bytes <= zero mskqh t1, t4, t1 # U : - and t6, t8, t2 # E : - subq t2, 1, t6 # E : (stall) - or t6, t2, t8 # E : (stall) - zapnot t12, t8, t12 # U : prepare source word; mirror changes (stall) + and t6, t8, t12 # E : + subq t12, 1, t6 # E : (stall) + or t6, t12, t8 # E : (stall) + zapnot t2, t8, t2 # U : prepare source word; mirror changes (stall) zapnot t1, t8, t1 # U : to source validity mask - andnot t0, t12, t0 # E : zero place for source to reside + andnot t0, t2, t0 # E : zero place for source to reside or t0, t1, t0 # E : and put it there (stall both t0, t1) stq_u t0, 0(a0) # L : (stall) diff --git a/arch/alpha/lib/strncpy.S b/arch/alpha/lib/strncpy.S index bbdef1b..a46f7f3 100644 --- a/arch/alpha/lib/strncpy.S +++ b/arch/alpha/lib/strncpy.S @@ -35,7 +35,7 @@ strncpy: or $3, $24, $3 # clear the bits between the last or $4, $27, $4 # written byte and the last byte in COUNT - andnot $4, $3, $4 + andnot $3, $4, $4 zap $1, $4, $1 stq_u $1, 0($16) diff --git a/arch/alpha/lib/stxncpy.S b/arch/alpha/lib/stxncpy.S index da1a727..3dece25 100644 --- a/arch/alpha/lib/stxncpy.S +++ b/arch/alpha/lib/stxncpy.S @@ -315,9 +315,9 @@ $unaligned: extql t2, a1, t2 # e0 : cmpbge zero, t1, t8 # .. e1 : is there a zero? - andnot t2, t6, t12 # e0 : dest mask for a single word copy + andnot t2, t6, t2 # e0 : dest mask for a single word copy or t8, t10, t5 # .. e1 : test for end-of-count too - cmpbge zero, t12, t3 # e0 : + cmpbge zero, t2, t3 # e0 : cmoveq a2, t5, t8 # .. e1 : andnot t8, t3, t8 # e0 : beq t8, $u_head # .. e1 (zdb) @@ -330,14 +330,14 @@ $unaligned: ldq_u t0, 0(a0) # e0 : negq t8, t6 # .. e1 : build bitmask of bytes <= zero mskqh t1, t4, t1 # e0 : - and t6, t8, t2 # .. e1 : - subq t2, 1, t6 # e0 : - or t6, t2, t8 # e1 : + and t6, t8, t12 # .. e1 : + subq t12, 1, t6 # e0 : + or t6, t12, t8 # e1 : - zapnot t12, t8, t12 # e0 : prepare source word; mirror changes + zapnot t2, t8, t2 # e0 : prepare source word; mirror changes zapnot t1, t8, t1 # .. e1 : to source validity mask - andnot t0, t12, t0 # e0 : zero place for source to reside + andnot t0, t2, t0 # e0 : zero place for source to reside or t0, t1, t0 # e1 : and put it there stq_u t0, 0(a0) # e0 : ret (t9) # .. e1 : diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c index 90d7f2e..29185ca 100644 --- a/arch/um/drivers/net_user.c +++ b/arch/um/drivers/net_user.c @@ -201,7 +201,7 @@ static int change_tramp(char **argv, char *output, int output_len) close(fds[1]); if (pid > 0) - CATCH_EINTR(err = waitpid(pid, NULL, 0)); + helper_wait(pid, 0, "change_tramp"); return pid; } diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c index 5f06204..b8711e5 100644 --- a/arch/um/drivers/slip_user.c +++ b/arch/um/drivers/slip_user.c @@ -77,7 +77,7 @@ static int slip_tramp(char **argv, int fd) { struct slip_pre_exec_data pe_data; char *output; - int status, pid, fds[2], err, output_len; + int pid, fds[2], err, output_len; err = os_pipe(fds, 1, 0); if (err < 0) { @@ -109,15 +109,7 @@ static int slip_tramp(char **argv, int fd) read_output(fds[0], output, output_len); printk("%s", output); - CATCH_EINTR(err = waitpid(pid, &status, 0)); - if (err < 0) - err = errno; - else if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) { - printk(UM_KERN_ERR "'%s' didn't exit with status 0\n", argv[0]); - err = -EINVAL; - } - else err = 0; - + err = helper_wait(pid, 0, argv[0]); close(fds[0]); out_free: diff --git a/arch/um/drivers/slirp_user.c b/arch/um/drivers/slirp_user.c index 1865089..89c1be2 100644 --- a/arch/um/drivers/slirp_user.c +++ b/arch/um/drivers/slirp_user.c @@ -79,7 +79,7 @@ out: static void slirp_close(int fd, void *data) { struct slirp_data *pri = data; - int status,err; + int err; close(fd); close(pri->slave); @@ -98,18 +98,9 @@ static void slirp_close(int fd, void *data) "(%d)\n", pri->pid, errno); } #endif - - CATCH_EINTR(err = waitpid(pri->pid, &status, WNOHANG)); - if (err < 0) { - printk(UM_KERN_ERR "slirp_close: waitpid returned %d\n", errno); - return; - } - - if (err == 0) { - printk(UM_KERN_ERR "slirp_close: process %d has not exited\n", - pri->pid); + err = helper_wait(pri->pid, 1, "slirp_close"); + if (err < 0) return; - } pri->pid = -1; } diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c index 41d254b..48fc745 100644 --- a/arch/um/drivers/ubd_user.c +++ b/arch/um/drivers/ubd_user.c @@ -49,8 +49,7 @@ int start_io_thread(unsigned long sp, int *fd_out) goto out_close; } - pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD, - NULL); + pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL); if(pid < 0){ err = -errno; printk("start_io_thread - clone failed : errno = %d\n", errno); diff --git a/arch/um/include/os.h b/arch/um/include/os.h index fbf0a87..6f0d1c7 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h @@ -214,7 +214,7 @@ extern int execvp_noalloc(char *buf, const char *file, char *const argv[]); extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv); extern int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, unsigned long *stack_out); -extern int helper_wait(int pid); +extern int helper_wait(int pid, int nohang, char *pname); /* tls.c */ diff --git a/arch/um/os-Linux/aio.c b/arch/um/os-Linux/aio.c index 4158118..93dc0c8 100644 --- a/arch/um/os-Linux/aio.c +++ b/arch/um/os-Linux/aio.c @@ -218,7 +218,7 @@ static int init_aio_24(void) goto out_close_pipe; err = run_helper_thread(not_aio_thread, NULL, - CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack); + CLONE_FILES | CLONE_VM, &aio_stack); if (err < 0) goto out_close_pipe; @@ -254,7 +254,7 @@ static int init_aio_26(void) } err = run_helper_thread(aio_thread, NULL, - CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack); + CLONE_FILES | CLONE_VM, &aio_stack); if (err < 0) return err; diff --git a/arch/um/os-Linux/drivers/ethertap_user.c b/arch/um/os-Linux/drivers/ethertap_user.c index 4ff5536..07ca0cb 100644 --- a/arch/um/os-Linux/drivers/ethertap_user.c +++ b/arch/um/os-Linux/drivers/ethertap_user.c @@ -94,7 +94,7 @@ static int etap_tramp(char *dev, char *gate, int control_me, int control_remote, int data_me, int data_remote) { struct etap_pre_exec_data pe_data; - int pid, status, err, n; + int pid, err, n; char version_buf[sizeof("nnnnn\0")]; char data_fd_buf[sizeof("nnnnnn\0")]; char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; @@ -131,13 +131,7 @@ static int etap_tramp(char *dev, char *gate, int control_me, } if (c != 1) { printk(UM_KERN_ERR "etap_tramp : uml_net failed\n"); - err = -EINVAL; - CATCH_EINTR(n = waitpid(pid, &status, 0)); - if (n < 0) - err = -errno; - else if (!WIFEXITED(status) || (WEXITSTATUS(status) != 1)) - printk(UM_KERN_ERR "uml_net didn't exit with " - "status 1\n"); + err = helper_wait(pid, 0, "uml_net"); } return err; } diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c index 6c55d3c..1037a3b 100644 --- a/arch/um/os-Linux/drivers/tuntap_user.c +++ b/arch/um/os-Linux/drivers/tuntap_user.c @@ -107,7 +107,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote, "errno = %d\n", errno); return err; } - CATCH_EINTR(waitpid(pid, NULL, 0)); + helper_wait(pid, 0, "tuntap_open_tramp"); cmsg = CMSG_FIRSTHDR(&msg); if (cmsg == NULL) { diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c index 7a72dbb..fba3f0f 100644 --- a/arch/um/os-Linux/helper.c +++ b/arch/um/os-Linux/helper.c @@ -76,7 +76,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv) data.fd = fds[1]; data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) : kmalloc(PATH_MAX, UM_GFP_KERNEL); - pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); + pid = clone(helper_child, (void *) sp, CLONE_VM, &data); if (pid < 0) { ret = -errno; printk("run_helper : clone failed, errno = %d\n", errno); @@ -101,7 +101,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv) ret = n; kill(pid, SIGKILL); } - CATCH_EINTR(waitpid(pid, NULL, 0)); + CATCH_EINTR(waitpid(pid, NULL, __WCLONE)); } out_free2: @@ -126,7 +126,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, return -ENOMEM; sp = stack + UM_KERN_PAGE_SIZE - sizeof(void *); - pid = clone(proc, (void *) sp, flags | SIGCHLD, arg); + pid = clone(proc, (void *) sp, flags, arg); if (pid < 0) { err = -errno; printk("run_helper_thread : clone failed, errno = %d\n", @@ -134,7 +134,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, return err; } if (stack_out == NULL) { - CATCH_EINTR(pid = waitpid(pid, &status, 0)); + CATCH_EINTR(pid = waitpid(pid, &status, __WCLONE)); if (pid < 0) { err = -errno; printk("run_helper_thread - wait failed, errno = %d\n", @@ -150,14 +150,30 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, return pid; } -int helper_wait(int pid) +int helper_wait(int pid, int nohang, char *pname) { - int ret; + int ret, status; + int wflags = __WCLONE; - CATCH_EINTR(ret = waitpid(pid, NULL, WNOHANG)); + if (nohang) + wflags |= WNOHANG; + + if (!pname) + pname = "helper_wait"; + + CATCH_EINTR(ret = waitpid(pid, &status, wflags)); if (ret < 0) { - ret = -errno; - printk("helper_wait : waitpid failed, errno = %d\n", errno); - } - return ret; + printk(UM_KERN_ERR "%s : waitpid process %d failed, " + "errno = %d\n", pname, pid, errno); + return -errno; + } else if (nohang && ret == 0) { + printk(UM_KERN_ERR "%s : process %d has not exited\n", + pname, pid); + return -ECHILD; + } else if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { + printk(UM_KERN_ERR "%s : process %d didn't exit with " + "status 0\n", pname, pid); + return -ECHILD; + } else + return 0; } diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 37781db..bda5c31 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -101,7 +101,7 @@ void os_kill_process(int pid, int reap_child) { kill(pid, SIGKILL); if (reap_child) - CATCH_EINTR(waitpid(pid, NULL, 0)); + CATCH_EINTR(waitpid(pid, NULL, __WALL)); } /* This is here uniquely to have access to the userspace errno, i.e. the one @@ -130,7 +130,7 @@ void os_kill_ptraced_process(int pid, int reap_child) ptrace(PTRACE_KILL, pid); ptrace(PTRACE_CONT, pid); if (reap_child) - CATCH_EINTR(waitpid(pid, NULL, 0)); + CATCH_EINTR(waitpid(pid, NULL, __WALL)); } /* Don't use the glibc version, which caches the result in TLS. It misses some diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index d77c81d..e8b7a97 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -64,7 +64,7 @@ void wait_stub_done(int pid) int n, status, err; while (1) { - CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL)); if ((n < 0) || !WIFSTOPPED(status)) goto bad_wait; @@ -153,7 +153,7 @@ static void handle_trap(int pid, struct uml_pt_regs *regs, panic("handle_trap - continuing to end of syscall " "failed, errno = %d\n", errno); - CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED)); + CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED | __WALL)); if ((err < 0) || !WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP + 0x80)) { err = ptrace_dump_regs(pid); @@ -255,16 +255,18 @@ int start_userspace(unsigned long stub_stack) panic("start_userspace : mmap failed, errno = %d", errno); sp = (unsigned long) stack + UM_KERN_PAGE_SIZE - sizeof(void *); - flags = CLONE_FILES | SIGCHLD; + flags = CLONE_FILES; if (proc_mm) flags |= CLONE_VM; + else + flags |= SIGCHLD; pid = clone(userspace_tramp, (void *) sp, flags, (void *) stub_stack); if (pid < 0) panic("start_userspace : clone failed, errno = %d", errno); do { - CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL)); if (n < 0) panic("start_userspace : wait failed, errno = %d", errno); @@ -314,7 +316,7 @@ void userspace(struct uml_pt_regs *regs) "pid=%d, ptrace operation = %d, errno = %d\n", pid, op, errno); - CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED)); + CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED | __WALL)); if (err < 0) panic("userspace - waitpid failed, errno = %d\n", errno); diff --git a/arch/um/os-Linux/util.c b/arch/um/os-Linux/util.c index ef09543..3e058ce 100644 --- a/arch/um/os-Linux/util.c +++ b/arch/um/os-Linux/util.c @@ -141,7 +141,7 @@ void os_dump_core(void) * nothing reasonable to do if that fails. */ - while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) + while ((pid = waitpid(-1, NULL, WNOHANG | __WALL)) > 0) os_kill_ptraced_process(pid, 0); abort(); diff --git a/arch/x86/kernel/suspend_64.c b/arch/x86/kernel/suspend_64.c index db284ef..2e5efaa 100644 --- a/arch/x86/kernel/suspend_64.c +++ b/arch/x86/kernel/suspend_64.c @@ -192,42 +192,25 @@ static int res_phys_pud_init(pud_t *pud, unsigned long address, unsigned long en return 0; } -static int res_kernel_text_pud_init(pud_t *pud, unsigned long start) -{ - pmd_t *pmd; - unsigned long paddr; - - pmd = (pmd_t *)get_safe_page(GFP_ATOMIC); - if (!pmd) - return -ENOMEM; - set_pud(pud + pud_index(start), __pud(__pa(pmd) | _KERNPG_TABLE)); - for (paddr = 0; paddr < KERNEL_TEXT_SIZE; pmd++, paddr += PMD_SIZE) { - unsigned long pe; - - pe = __PAGE_KERNEL_LARGE_EXEC | _PAGE_GLOBAL | paddr; - pe &= __supported_pte_mask; - set_pmd(pmd, __pmd(pe)); - } - - return 0; -} - static int set_up_temporary_mappings(void) { unsigned long start, end, next; - pud_t *pud; int error; temp_level4_pgt = (pgd_t *)get_safe_page(GFP_ATOMIC); if (!temp_level4_pgt) return -ENOMEM; + /* It is safe to reuse the original kernel mapping */ + set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map), + init_level4_pgt[pgd_index(__START_KERNEL_map)]); + /* Set up the direct mapping from scratch */ start = (unsigned long)pfn_to_kaddr(0); end = (unsigned long)pfn_to_kaddr(end_pfn); for (; start < end; start = next) { - pud = (pud_t *)get_safe_page(GFP_ATOMIC); + pud_t *pud = (pud_t *)get_safe_page(GFP_ATOMIC); if (!pud) return -ENOMEM; next = start + PGDIR_SIZE; @@ -238,17 +221,7 @@ static int set_up_temporary_mappings(void) set_pgd(temp_level4_pgt + pgd_index(start), mk_kernel_pgd(__pa(pud))); } - - /* Set up the kernel text mapping from scratch */ - pud = (pud_t *)get_safe_page(GFP_ATOMIC); - if (!pud) - return -ENOMEM; - error = res_kernel_text_pud_init(pud, __START_KERNEL_map); - if (!error) - set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map), - __pgd(__pa(pud) | _PAGE_TABLE)); - - return error; + return 0; } int swsusp_arch_resume(void) |