@@ -1272,7 +1272,7 @@ static void kill_me_maybe(struct callback_head *cb)
1272
1272
flags |= MF_MUST_KILL ;
1273
1273
1274
1274
ret = memory_failure (p -> mce_addr >> PAGE_SHIFT , flags );
1275
- if (!ret && !( p -> mce_kflags & MCE_IN_KERNEL_COPYIN ) ) {
1275
+ if (!ret ) {
1276
1276
set_mce_nospec (p -> mce_addr >> PAGE_SHIFT , p -> mce_whole_page );
1277
1277
sync_core ();
1278
1278
return ;
@@ -1286,15 +1286,21 @@ static void kill_me_maybe(struct callback_head *cb)
1286
1286
if (ret == - EHWPOISON )
1287
1287
return ;
1288
1288
1289
- if (p -> mce_vaddr != (void __user * )-1l ) {
1290
- force_sig_mceerr (BUS_MCEERR_AR , p -> mce_vaddr , PAGE_SHIFT );
1291
- } else {
1292
- pr_err ("Memory error not recovered" );
1293
- kill_me_now (cb );
1294
- }
1289
+ pr_err ("Memory error not recovered" );
1290
+ kill_me_now (cb );
1291
+ }
1292
+
1293
+ static void kill_me_never (struct callback_head * cb )
1294
+ {
1295
+ struct task_struct * p = container_of (cb , struct task_struct , mce_kill_me );
1296
+
1297
+ p -> mce_count = 0 ;
1298
+ pr_err ("Kernel accessed poison in user space at %llx\n" , p -> mce_addr );
1299
+ if (!memory_failure (p -> mce_addr >> PAGE_SHIFT , 0 ))
1300
+ set_mce_nospec (p -> mce_addr >> PAGE_SHIFT , p -> mce_whole_page );
1295
1301
}
1296
1302
1297
- static void queue_task_work (struct mce * m , char * msg , int kill_current_task )
1303
+ static void queue_task_work (struct mce * m , char * msg , void ( * func )( struct callback_head * ) )
1298
1304
{
1299
1305
int count = ++ current -> mce_count ;
1300
1306
@@ -1304,11 +1310,7 @@ static void queue_task_work(struct mce *m, char *msg, int kill_current_task)
1304
1310
current -> mce_kflags = m -> kflags ;
1305
1311
current -> mce_ripv = !!(m -> mcgstatus & MCG_STATUS_RIPV );
1306
1312
current -> mce_whole_page = whole_page (m );
1307
-
1308
- if (kill_current_task )
1309
- current -> mce_kill_me .func = kill_me_now ;
1310
- else
1311
- current -> mce_kill_me .func = kill_me_maybe ;
1313
+ current -> mce_kill_me .func = func ;
1312
1314
}
1313
1315
1314
1316
/* Ten is likely overkill. Don't expect more than two faults before task_work() */
@@ -1459,7 +1461,10 @@ noinstr void do_machine_check(struct pt_regs *regs)
1459
1461
/* If this triggers there is no way to recover. Die hard. */
1460
1462
BUG_ON (!on_thread_stack () || !user_mode (regs ));
1461
1463
1462
- queue_task_work (& m , msg , kill_current_task );
1464
+ if (kill_current_task )
1465
+ queue_task_work (& m , msg , kill_me_now );
1466
+ else
1467
+ queue_task_work (& m , msg , kill_me_maybe );
1463
1468
1464
1469
} else {
1465
1470
/*
@@ -1477,7 +1482,7 @@ noinstr void do_machine_check(struct pt_regs *regs)
1477
1482
}
1478
1483
1479
1484
if (m .kflags & MCE_IN_KERNEL_COPYIN )
1480
- queue_task_work (& m , msg , kill_current_task );
1485
+ queue_task_work (& m , msg , kill_me_never );
1481
1486
}
1482
1487
out :
1483
1488
mce_wrmsrl (MSR_IA32_MCG_STATUS , 0 );
0 commit comments