1818#include "qed.h"
1919#include "qemu/bswap.h"
2020
21+ /* Called either from qed_check or with table_lock held. */
2122static int qed_read_table (BDRVQEDState * s , uint64_t offset , QEDTable * table )
2223{
2324 QEMUIOVector qiov ;
@@ -32,18 +33,22 @@ static int qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table)
3233
3334 trace_qed_read_table (s , offset , table );
3435
36+ if (qemu_in_coroutine ()) {
37+ qemu_co_mutex_unlock (& s -> table_lock );
38+ }
3539 ret = bdrv_preadv (s -> bs -> file , offset , & qiov );
40+ if (qemu_in_coroutine ()) {
41+ qemu_co_mutex_lock (& s -> table_lock );
42+ }
3643 if (ret < 0 ) {
3744 goto out ;
3845 }
3946
4047 /* Byteswap offsets */
41- qed_acquire (s );
4248 noffsets = qiov .size / sizeof (uint64_t );
4349 for (i = 0 ; i < noffsets ; i ++ ) {
4450 table -> offsets [i ] = le64_to_cpu (table -> offsets [i ]);
4551 }
46- qed_release (s );
4752
4853 ret = 0 ;
4954out :
@@ -61,6 +66,8 @@ static int qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table)
6166 * @index: Index of first element
6267 * @n: Number of elements
6368 * @flush: Whether or not to sync to disk
69+ *
70+ * Called either from qed_check or with table_lock held.
6471 */
6572static int qed_write_table (BDRVQEDState * s , uint64_t offset , QEDTable * table ,
6673 unsigned int index , unsigned int n , bool flush )
@@ -97,16 +104,20 @@ static int qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table,
97104 /* Adjust for offset into table */
98105 offset += start * sizeof (uint64_t );
99106
107+ if (qemu_in_coroutine ()) {
108+ qemu_co_mutex_unlock (& s -> table_lock );
109+ }
100110 ret = bdrv_pwritev (s -> bs -> file , offset , & qiov );
111+ if (qemu_in_coroutine ()) {
112+ qemu_co_mutex_lock (& s -> table_lock );
113+ }
101114 trace_qed_write_table_cb (s , table , flush , ret );
102115 if (ret < 0 ) {
103116 goto out ;
104117 }
105118
106119 if (flush ) {
107- qed_acquire (s );
108120 ret = bdrv_flush (s -> bs );
109- qed_release (s );
110121 if (ret < 0 ) {
111122 goto out ;
112123 }
@@ -123,6 +134,7 @@ int qed_read_l1_table_sync(BDRVQEDState *s)
123134 return qed_read_table (s , s -> header .l1_table_offset , s -> l1_table );
124135}
125136
137+ /* Called either from qed_check or with table_lock held. */
126138int qed_write_l1_table (BDRVQEDState * s , unsigned int index , unsigned int n )
127139{
128140 BLKDBG_EVENT (s -> bs -> file , BLKDBG_L1_UPDATE );
@@ -136,6 +148,7 @@ int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index,
136148 return qed_write_l1_table (s , index , n );
137149}
138150
151+ /* Called either from qed_check or with table_lock held. */
139152int qed_read_l2_table (BDRVQEDState * s , QEDRequest * request , uint64_t offset )
140153{
141154 int ret ;
@@ -154,7 +167,6 @@ int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset)
154167 BLKDBG_EVENT (s -> bs -> file , BLKDBG_L2_LOAD );
155168 ret = qed_read_table (s , offset , request -> l2_table -> table );
156169
157- qed_acquire (s );
158170 if (ret ) {
159171 /* can't trust loaded L2 table anymore */
160172 qed_unref_l2_cache_entry (request -> l2_table );
@@ -170,7 +182,6 @@ int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset)
170182 request -> l2_table = qed_find_l2_cache_entry (& s -> l2_cache , offset );
171183 assert (request -> l2_table != NULL );
172184 }
173- qed_release (s );
174185
175186 return ret ;
176187}
@@ -180,6 +191,7 @@ int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset
180191 return qed_read_l2_table (s , request , offset );
181192}
182193
194+ /* Called either from qed_check or with table_lock held. */
183195int qed_write_l2_table (BDRVQEDState * s , QEDRequest * request ,
184196 unsigned int index , unsigned int n , bool flush )
185197{
0 commit comments