aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sys.c')
-rw-r--r--kernel/sys.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/kernel/sys.c b/kernel/sys.c
index b95d3c72ba21..071de900c824 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -362,6 +362,29 @@ int unregister_reboot_notifier(struct notifier_block *nb)
362} 362}
363EXPORT_SYMBOL(unregister_reboot_notifier); 363EXPORT_SYMBOL(unregister_reboot_notifier);
364 364
365/* Add backwards compatibility for stable trees. */
366#ifndef PF_NO_SETAFFINITY
367#define PF_NO_SETAFFINITY PF_THREAD_BOUND
368#endif
369
370static void migrate_to_reboot_cpu(void)
371{
372 /* The boot cpu is always logical cpu 0 */
373 int cpu = 0;
374
375 cpu_hotplug_disable();
376
377 /* Make certain the cpu I'm about to reboot on is online */
378 if (!cpu_online(cpu))
379 cpu = cpumask_first(cpu_online_mask);
380
381 /* Prevent races with other tasks migrating this task */
382 current->flags |= PF_NO_SETAFFINITY;
383
384 /* Make certain I only run on the appropriate processor */
385 set_cpus_allowed_ptr(current, cpumask_of(cpu));
386}
387
365/** 388/**
366 * kernel_restart - reboot the system 389 * kernel_restart - reboot the system
367 * @cmd: pointer to buffer containing command to execute for restart 390 * @cmd: pointer to buffer containing command to execute for restart
@@ -373,7 +396,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier);
373void kernel_restart(char *cmd) 396void kernel_restart(char *cmd)
374{ 397{
375 kernel_restart_prepare(cmd); 398 kernel_restart_prepare(cmd);
376 disable_nonboot_cpus(); 399 migrate_to_reboot_cpu();
377 syscore_shutdown(); 400 syscore_shutdown();
378 if (!cmd) 401 if (!cmd)
379 printk(KERN_EMERG "Restarting system.\n"); 402 printk(KERN_EMERG "Restarting system.\n");
@@ -400,7 +423,7 @@ static void kernel_shutdown_prepare(enum system_states state)
400void kernel_halt(void) 423void kernel_halt(void)
401{ 424{
402 kernel_shutdown_prepare(SYSTEM_HALT); 425 kernel_shutdown_prepare(SYSTEM_HALT);
403 disable_nonboot_cpus(); 426 migrate_to_reboot_cpu();
404 syscore_shutdown(); 427 syscore_shutdown();
405 printk(KERN_EMERG "System halted.\n"); 428 printk(KERN_EMERG "System halted.\n");
406 kmsg_dump(KMSG_DUMP_HALT); 429 kmsg_dump(KMSG_DUMP_HALT);
@@ -419,7 +442,7 @@ void kernel_power_off(void)
419 kernel_shutdown_prepare(SYSTEM_POWER_OFF); 442 kernel_shutdown_prepare(SYSTEM_POWER_OFF);
420 if (pm_power_off_prepare) 443 if (pm_power_off_prepare)
421 pm_power_off_prepare(); 444 pm_power_off_prepare();
422 disable_nonboot_cpus(); 445 migrate_to_reboot_cpu();
423 syscore_shutdown(); 446 syscore_shutdown();
424 printk(KERN_EMERG "Power down.\n"); 447 printk(KERN_EMERG "Power down.\n");
425 kmsg_dump(KMSG_DUMP_POWEROFF); 448 kmsg_dump(KMSG_DUMP_POWEROFF);
@@ -488,7 +511,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
488 case LINUX_REBOOT_CMD_HALT: 511 case LINUX_REBOOT_CMD_HALT:
489 kernel_halt(); 512 kernel_halt();
490 do_exit(0); 513 do_exit(0);
491 panic("cannot halt"); 514 panic("cannot halt.\n");
492 515
493 case LINUX_REBOOT_CMD_POWER_OFF: 516 case LINUX_REBOOT_CMD_POWER_OFF:
494 kernel_power_off(); 517 kernel_power_off();
@@ -1286,6 +1309,17 @@ out:
1286 return retval; 1309 return retval;
1287} 1310}
1288 1311
1312static void set_special_pids(struct pid *pid)
1313{
1314 struct task_struct *curr = current->group_leader;
1315
1316 if (task_session(curr) != pid)
1317 change_pid(curr, PIDTYPE_SID, pid);
1318
1319 if (task_pgrp(curr) != pid)
1320 change_pid(curr, PIDTYPE_PGID, pid);
1321}
1322
1289SYSCALL_DEFINE0(setsid) 1323SYSCALL_DEFINE0(setsid)
1290{ 1324{
1291 struct task_struct *group_leader = current->group_leader; 1325 struct task_struct *group_leader = current->group_leader;
@@ -1305,7 +1339,7 @@ SYSCALL_DEFINE0(setsid)
1305 goto out; 1339 goto out;
1306 1340
1307 group_leader->signal->leader = 1; 1341 group_leader->signal->leader = 1;
1308 __set_special_pids(sid); 1342 set_special_pids(sid);
1309 1343
1310 proc_clear_tty(group_leader); 1344 proc_clear_tty(group_leader);
1311 1345
@@ -2332,8 +2366,7 @@ static int do_sysinfo(struct sysinfo *info)
2332 2366
2333 memset(info, 0, sizeof(struct sysinfo)); 2367 memset(info, 0, sizeof(struct sysinfo));
2334 2368
2335 ktime_get_ts(&tp); 2369 get_monotonic_boottime(&tp);
2336 monotonic_to_bootbased(&tp);
2337 info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); 2370 info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0);
2338 2371
2339 get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT); 2372 get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT);