···535535 l %r3,__LC_PGM_ILC # load program interruption code536536 la %r8,0x7f537537 nr %r8,%r3 # clear per-event-bit and ilc538538- be BASED(pgm_exit) # only per or per+check ?539539- b BASED(pgm_do_call)538538+ be BASED(pgm_exit2) # only per or per+check ?539539+ l %r7,BASED(.Ljump_table)540540+ sll %r8,2541541+ l %r7,0(%r8,%r7) # load address of handler routine542542+ la %r2,SP_PTREGS(%r15) # address of register-save area543543+ basr %r14,%r7 # branch to interrupt-handler544544+pgm_exit2:545545+ TRACE_IRQS_ON546546+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts547547+ b BASED(sysc_return)540548541549#542550# it was a single stepped SVC that is causing all the trouble
+10-2
arch/s390/kernel/entry64.S
···544544 lgf %r3,__LC_PGM_ILC # load program interruption code545545 lghi %r8,0x7f546546 ngr %r8,%r3 # clear per-event-bit and ilc547547- je pgm_exit548548- j pgm_do_call547547+ je pgm_exit2548548+ sll %r8,3549549+ larl %r1,pgm_check_table550550+ lg %r1,0(%r8,%r1) # load address of handler routine551551+ la %r2,SP_PTREGS(%r15) # address of register-save area552552+ basr %r14,%r1 # branch to interrupt-handler553553+pgm_exit2:554554+ TRACE_IRQS_ON555555+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts556556+ j sysc_return549557550558#551559# it was a single stepped SVC that is causing all the trouble
+12-6
arch/s390/kernel/time.c
···524524 if (!etr_eacr.sl)525525 return;526526 disable_sync_clock(NULL);527527- set_bit(ETR_EVENT_SWITCH_LOCAL, &etr_events);528528- queue_work(time_sync_wq, &etr_work);527527+ if (!test_and_set_bit(ETR_EVENT_SWITCH_LOCAL, &etr_events)) {528528+ etr_eacr.es = etr_eacr.sl = 0;529529+ etr_setr(&etr_eacr);530530+ queue_work(time_sync_wq, &etr_work);531531+ }529532}530533531534/*···542539 if (!etr_eacr.es)543540 return;544541 disable_sync_clock(NULL);545545- set_bit(ETR_EVENT_SYNC_CHECK, &etr_events);546546- queue_work(time_sync_wq, &etr_work);542542+ if (!test_and_set_bit(ETR_EVENT_SYNC_CHECK, &etr_events)) {543543+ etr_eacr.es = 0;544544+ etr_setr(&etr_eacr);545545+ queue_work(time_sync_wq, &etr_work);546546+ }547547}548548549549/*···908902 * Do not try to get the alternate port aib if the clock909903 * is not in sync yet.910904 */911911- if (!check_sync_clock())905905+ if (!eacr.es || !check_sync_clock())912906 return eacr;913907914908 /*···10701064 * If the clock is in sync just update the eacr and return.10711065 * If there is no valid sync port wait for a port update.10721066 */10731073- if (check_sync_clock() || sync_port < 0) {10671067+ if ((eacr.es && check_sync_clock()) || sync_port < 0) {10741068 etr_update_eacr(eacr);10751069 etr_set_tolec_timeout(now);10761070 goto out_unlock;