@@ -45,70 +45,34 @@ static struct kvm_s390_gib *gib;
4545/* handle external calls via sigp interpretation facility */
4646static int sca_ext_call_pending (struct kvm_vcpu * vcpu , int * src_id )
4747{
48- int c , scn ;
48+ struct esca_block * sca = vcpu -> kvm -> arch .sca ;
49+ union esca_sigp_ctrl sigp_ctrl = sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl ;
4950
5051 if (!kvm_s390_test_cpuflags (vcpu , CPUSTAT_ECALL_PEND ))
5152 return 0 ;
5253
5354 BUG_ON (!kvm_s390_use_sca_entries ());
54- read_lock (& vcpu -> kvm -> arch .sca_lock );
55- if (vcpu -> kvm -> arch .use_esca ) {
56- struct esca_block * sca = vcpu -> kvm -> arch .sca ;
57- union esca_sigp_ctrl sigp_ctrl =
58- sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl ;
59-
60- c = sigp_ctrl .c ;
61- scn = sigp_ctrl .scn ;
62- } else {
63- struct bsca_block * sca = vcpu -> kvm -> arch .sca ;
64- union bsca_sigp_ctrl sigp_ctrl =
65- sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl ;
66-
67- c = sigp_ctrl .c ;
68- scn = sigp_ctrl .scn ;
69- }
70- read_unlock (& vcpu -> kvm -> arch .sca_lock );
7155
7256 if (src_id )
73- * src_id = scn ;
57+ * src_id = sigp_ctrl . scn ;
7458
75- return c ;
59+ return sigp_ctrl . c ;
7660}
7761
7862static int sca_inject_ext_call (struct kvm_vcpu * vcpu , int src_id )
7963{
64+ struct esca_block * sca = vcpu -> kvm -> arch .sca ;
65+ union esca_sigp_ctrl * sigp_ctrl = & sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl ;
66+ union esca_sigp_ctrl old_val , new_val = {.scn = src_id , .c = 1 };
8067 int expect , rc ;
8168
8269 BUG_ON (!kvm_s390_use_sca_entries ());
83- read_lock (& vcpu -> kvm -> arch .sca_lock );
84- if (vcpu -> kvm -> arch .use_esca ) {
85- struct esca_block * sca = vcpu -> kvm -> arch .sca ;
86- union esca_sigp_ctrl * sigp_ctrl =
87- & (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
88- union esca_sigp_ctrl new_val = {0 }, old_val ;
89-
90- old_val = READ_ONCE (* sigp_ctrl );
91- new_val .scn = src_id ;
92- new_val .c = 1 ;
93- old_val .c = 0 ;
94-
95- expect = old_val .value ;
96- rc = cmpxchg (& sigp_ctrl -> value , old_val .value , new_val .value );
97- } else {
98- struct bsca_block * sca = vcpu -> kvm -> arch .sca ;
99- union bsca_sigp_ctrl * sigp_ctrl =
100- & (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
101- union bsca_sigp_ctrl new_val = {0 }, old_val ;
10270
103- old_val = READ_ONCE (* sigp_ctrl );
104- new_val .scn = src_id ;
105- new_val .c = 1 ;
106- old_val .c = 0 ;
71+ old_val = READ_ONCE (* sigp_ctrl );
72+ old_val .c = 0 ;
10773
108- expect = old_val .value ;
109- rc = cmpxchg (& sigp_ctrl -> value , old_val .value , new_val .value );
110- }
111- read_unlock (& vcpu -> kvm -> arch .sca_lock );
74+ expect = old_val .value ;
75+ rc = cmpxchg (& sigp_ctrl -> value , old_val .value , new_val .value );
11276
11377 if (rc != expect ) {
11478 /* another external call is pending */
@@ -120,24 +84,14 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
12084
12185static void sca_clear_ext_call (struct kvm_vcpu * vcpu )
12286{
87+ struct esca_block * sca = vcpu -> kvm -> arch .sca ;
88+ union esca_sigp_ctrl * sigp_ctrl = & sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl ;
89+
12390 if (!kvm_s390_use_sca_entries ())
12491 return ;
12592 kvm_s390_clear_cpuflags (vcpu , CPUSTAT_ECALL_PEND );
126- read_lock (& vcpu -> kvm -> arch .sca_lock );
127- if (vcpu -> kvm -> arch .use_esca ) {
128- struct esca_block * sca = vcpu -> kvm -> arch .sca ;
129- union esca_sigp_ctrl * sigp_ctrl =
130- & (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
131-
132- WRITE_ONCE (sigp_ctrl -> value , 0 );
133- } else {
134- struct bsca_block * sca = vcpu -> kvm -> arch .sca ;
135- union bsca_sigp_ctrl * sigp_ctrl =
136- & (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
13793
138- WRITE_ONCE (sigp_ctrl -> value , 0 );
139- }
140- read_unlock (& vcpu -> kvm -> arch .sca_lock );
94+ WRITE_ONCE (sigp_ctrl -> value , 0 );
14195}
14296
14397int psw_extint_disabled (struct kvm_vcpu * vcpu )
@@ -1224,7 +1178,7 @@ int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu)
12241178{
12251179 struct kvm_s390_local_interrupt * li = & vcpu -> arch .local_int ;
12261180
1227- if (!sclp . has_sigpif )
1181+ if (!kvm_s390_use_sca_entries () )
12281182 return test_bit (IRQ_PEND_EXT_EXTERNAL , & li -> pending_irqs );
12291183
12301184 return sca_ext_call_pending (vcpu , NULL );
@@ -1549,7 +1503,7 @@ static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
15491503 if (kvm_get_vcpu_by_id (vcpu -> kvm , src_id ) == NULL )
15501504 return - EINVAL ;
15511505
1552- if (sclp . has_sigpif && !kvm_s390_pv_cpu_get_handle (vcpu ))
1506+ if (kvm_s390_use_sca_entries () && !kvm_s390_pv_cpu_get_handle (vcpu ))
15531507 return sca_inject_ext_call (vcpu , src_id );
15541508
15551509 if (test_and_set_bit (IRQ_PEND_EXT_EXTERNAL , & li -> pending_irqs ))
0 commit comments