Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

HWPOISON: Clean up PR_MCE_KILL interface

While writing the manpage I noticed some shortcomings in the
current interface.

- Define symbolic names for all the different values
- Boundary check the kill mode values
- For symmetry add a get interface too. This allows library
code to get/set the current state.
- For consistency define a PR_MCE_KILL_DEFAULT value

Signed-off-by: Andi Kleen <ak@linux.intel.com>

+30 -5
+12
include/linux/prctl.h
··· 88 88 #define PR_TASK_PERF_EVENTS_DISABLE 31 89 89 #define PR_TASK_PERF_EVENTS_ENABLE 32 90 90 91 + /* 92 + * Set early/late kill mode for hwpoison memory corruption. 93 + * This influences when the process gets killed on a memory corruption. 94 + */ 91 95 #define PR_MCE_KILL 33 96 + # define PR_MCE_KILL_CLEAR 0 97 + # define PR_MCE_KILL_SET 1 98 + 99 + # define PR_MCE_KILL_LATE 0 100 + # define PR_MCE_KILL_EARLY 1 101 + # define PR_MCE_KILL_DEFAULT 2 102 + 103 + #define PR_MCE_KILL_GET 34 92 104 93 105 #endif /* _LINUX_PRCTL_H */
+18 -5
kernel/sys.c
··· 1546 1546 if (arg4 | arg5) 1547 1547 return -EINVAL; 1548 1548 switch (arg2) { 1549 - case 0: 1549 + case PR_MCE_KILL_CLEAR: 1550 1550 if (arg3 != 0) 1551 1551 return -EINVAL; 1552 1552 current->flags &= ~PF_MCE_PROCESS; 1553 1553 break; 1554 - case 1: 1554 + case PR_MCE_KILL_SET: 1555 1555 current->flags |= PF_MCE_PROCESS; 1556 - if (arg3 != 0) 1556 + if (arg3 == PR_MCE_KILL_EARLY) 1557 1557 current->flags |= PF_MCE_EARLY; 1558 - else 1558 + else if (arg3 == PR_MCE_KILL_LATE) 1559 1559 current->flags &= ~PF_MCE_EARLY; 1560 + else if (arg3 == PR_MCE_KILL_DEFAULT) 1561 + current->flags &= 1562 + ~(PF_MCE_EARLY|PF_MCE_PROCESS); 1563 + else 1564 + return -EINVAL; 1560 1565 break; 1561 1566 default: 1562 1567 return -EINVAL; 1563 1568 } 1564 1569 error = 0; 1565 1570 break; 1566 - 1571 + case PR_MCE_KILL_GET: 1572 + if (arg2 | arg3 | arg4 | arg5) 1573 + return -EINVAL; 1574 + if (current->flags & PF_MCE_PROCESS) 1575 + error = (current->flags & PF_MCE_EARLY) ? 1576 + PR_MCE_KILL_EARLY : PR_MCE_KILL_LATE; 1577 + else 1578 + error = PR_MCE_KILL_DEFAULT; 1579 + break; 1567 1580 default: 1568 1581 error = -EINVAL; 1569 1582 break;