Re: [Qemu-devel] [PATCH v2 2/2] blockjob: do not cancel timer in resume
在 2018/5/8 21:54, Stefan Hajnoczi 写道: > Currently the timer is cancelled and the block job is entered by > block_job_resume(). This behavior causes drain to run extra blockjob > iterations when the job was sleeping due to the ratelimit. > > This patch leaves the job asleep when block_job_resume() is called. > Jobs can still be forcibly woken up using block_job_enter(), which is > used to cancel jobs. > > After this patch drain no longer runs extra blockjob iterations. This > is the expected behavior that qemu-iotests 185 used to rely on. We > temporarily changed the 185 test output to make it pass for the QEMU > 2.12 release but now it's time to address this issue. > Verified on s390x. Thx Reviewed-by: QingFeng Hao > Cc: QingFeng Hao > Signed-off-by: Stefan Hajnoczi > --- > blockjob.c | 22 +++--- > tests/qemu-iotests/185 | 5 + > tests/qemu-iotests/185.out | 12 +--- > 3 files changed, 21 insertions(+), 18 deletions(-) > [...] > *** done > -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH] Show values and description when using "qom-list"
在 2018/4/24 19:49, Dr. David Alan Gilbert 写道: > * QingFeng Hao (ha...@linux.vnet.ibm.com) wrote: >> >> >> 在 2018/4/13 16:05, Perez Blanco, Ricardo (Nokia - BE/Antwerp) 写道: >>> Dear all, >>> >>> Here you can find my first contribution to qemu. Please, do not hesitate to >>> do any kind of remark. >>> >>> Based on ac4ba87ae0738d7a77708f8ce31ae2378ab99654 >>> >>> Kind regards, >>> >>> Ricardo Perez Blanco >>> >>> >From 65df20cef2846d764a8a821574f5f3643391aac5 Mon Sep 17 00:00:00 2001 >>> From: Ricardo Perez Blanco >>> Date: Wed, 11 Apr 2018 12:09:11 +0200 >>> Subject: [PATCH] Show values and description when using "qom-list" >>> >>> For debugging purposes it is very useful to: >>> - See the description of the field. This information is already filled >>>in but not shown in "qom-list" command. >>> - Display value of the field. So far, only well known types are >>>implemented (string, str, int, uint, bool). >> Need we support other types like QList and QDict? I think yes and suggest a >> new command >> to be introduced like qom-list-property or qom-get. The resorts may be: >> 1) print the json string just as Alan's former patch >> 2) print the value step by step. Supposing property foo is a >> structure, >>qom-list-property path foo prints its members as "mem1;mem2;mem3" >>and qom-list-property path foo.mem1 prints mem1's value. >> And some properties don't have get/set callback set, which prompts as below >> if doing >> qom-get/set: >> (qemu) qom-get /machine kernel-irqchip >> Insufficient permission to perform this operation >> For these properties I think we may need to not show the value in qom-list. > > So while I think it would be good to handle all the cases, I'd be happy > to take just the current enhancements to qom-list (once the cleanups that Eric > suggested are fixed). Being able to see even just the int/bool/strings > is very useful and something I've wanted for a while. > Yes, agree! Thanks! > Dave > >> Thanks! >> >>> >>> Signed-off-by: Ricardo Perez Blanco >>> --- >>> hmp.c | 13 +++-- >>> qapi/misc.json | 4 +++- >>> qmp.c | 26 ++ >>> 3 files changed, 40 insertions(+), 3 deletions(-) >>> >>> diff --git a/hmp.c b/hmp.c >>> index a25c7bd..967e0b2 100644 >>> --- a/hmp.c >>> +++ b/hmp.c >>> @@ -2490,8 +2490,17 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict) >>> while (list != NULL) { >>> ObjectPropertyInfo *value = list->value; >>> >>> -monitor_printf(mon, "%s (%s)\n", >>> - value->name, value->type); >>> +monitor_printf(mon, "%s", value->name); >>> +if (value->value) { >>> +monitor_printf(mon, "=%s", value->value); >>> +} >>> +monitor_printf(mon, " (%s)", value->type); >>> +if (value->description) { >>> +monitor_printf(mon, "\r\t\t\t\t\t\t\t\t\t[Description: >>> %s]", >>> + value->description); >>> +} >>> +monitor_printf(mon, "\n"); >>> + >>> list = list->next; >>> } >>> qapi_free_ObjectPropertyInfoList(start); >>> diff --git a/qapi/misc.json b/qapi/misc.json >>> index 5636f4a..6b3b4de 100644 >>> --- a/qapi/misc.json >>> +++ b/qapi/misc.json >>> @@ -1328,10 +1328,12 @@ >>> # >>> # @description: if specified, the description of the property. >>> # >>> +# @value: if specified, the value of the property. >>> +# >>> # Since: 1.2 >>> ## >>> { 'struct': 'ObjectPropertyInfo', >>> - 'data': { 'name': 'str', 'type': 'str', '*description': 'str' } } >>> + 'data': { 'name': 'str', 'type': 'str', '*description':'str', >>> '*value':'str' } } >>> >>> ## >>> # @qom-list: >>> diff --git a/qmp.c b/qmp.c >>> index f722616..75
Re: [Qemu-devel] [PATCH] Show values and description when using "qom-list"
在 2018/4/13 16:05, Perez Blanco, Ricardo (Nokia - BE/Antwerp) 写道: > Dear all, > > Here you can find my first contribution to qemu. Please, do not hesitate to > do any kind of remark. > > Based on ac4ba87ae0738d7a77708f8ce31ae2378ab99654 > > Kind regards, > > Ricardo Perez Blanco > >>From 65df20cef2846d764a8a821574f5f3643391aac5 Mon Sep 17 00:00:00 2001 > From: Ricardo Perez Blanco > Date: Wed, 11 Apr 2018 12:09:11 +0200 > Subject: [PATCH] Show values and description when using "qom-list" > > For debugging purposes it is very useful to: > - See the description of the field. This information is already filled >in but not shown in "qom-list" command. > - Display value of the field. So far, only well known types are >implemented (string, str, int, uint, bool). Need we support other types like QList and QDict? I think yes and suggest a new command to be introduced like qom-list-property or qom-get. The resorts may be: 1) print the json string just as Alan's former patch 2) print the value step by step. Supposing property foo is a structure, qom-list-property path foo prints its members as "mem1;mem2;mem3" and qom-list-property path foo.mem1 prints mem1's value. And some properties don't have get/set callback set, which prompts as below if doing qom-get/set: (qemu) qom-get /machine kernel-irqchip Insufficient permission to perform this operation For these properties I think we may need to not show the value in qom-list. Thanks! > > Signed-off-by: Ricardo Perez Blanco > --- > hmp.c | 13 +++-- > qapi/misc.json | 4 +++- > qmp.c | 26 ++ > 3 files changed, 40 insertions(+), 3 deletions(-) > > diff --git a/hmp.c b/hmp.c > index a25c7bd..967e0b2 100644 > --- a/hmp.c > +++ b/hmp.c > @@ -2490,8 +2490,17 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict) > while (list != NULL) { > ObjectPropertyInfo *value = list->value; > > -monitor_printf(mon, "%s (%s)\n", > - value->name, value->type); > +monitor_printf(mon, "%s", value->name); > +if (value->value) { > +monitor_printf(mon, "=%s", value->value); > +} > +monitor_printf(mon, " (%s)", value->type); > +if (value->description) { > +monitor_printf(mon, "\r\t\t\t\t\t\t\t\t\t[Description: %s]", > + value->description); > +} > +monitor_printf(mon, "\n"); > + > list = list->next; > } > qapi_free_ObjectPropertyInfoList(start); > diff --git a/qapi/misc.json b/qapi/misc.json > index 5636f4a..6b3b4de 100644 > --- a/qapi/misc.json > +++ b/qapi/misc.json > @@ -1328,10 +1328,12 @@ > # > # @description: if specified, the description of the property. > # > +# @value: if specified, the value of the property. > +# > # Since: 1.2 > ## > { 'struct': 'ObjectPropertyInfo', > - 'data': { 'name': 'str', 'type': 'str', '*description': 'str' } } > + 'data': { 'name': 'str', 'type': 'str', '*description':'str', > '*value':'str' } } > > ## > # @qom-list: > diff --git a/qmp.c b/qmp.c > index f722616..750b5d0 100644 > --- a/qmp.c > +++ b/qmp.c > @@ -237,6 +237,32 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, > Error **errp) > > entry->value->name = g_strdup(prop->name); > entry->value->type = g_strdup(prop->type); > +if (prop->description) { > +entry->value->description = g_strdup(prop->description); > +} > +if ((g_ascii_strncasecmp(entry->value->type, "string", 6) == 0) || > +(g_ascii_strncasecmp(entry->value->type, "str", 3) == 0)) { > +Error **errp = NULL; > +entry->value->value = g_strdup_printf("\"%s\"", > +object_property_get_str(obj, entry->value->name, errp)); > +} > +if (g_ascii_strncasecmp(entry->value->type, "int", 3) == 0) { > +Error **errp = NULL; > +entry->value->value = g_strdup_printf("%ld", > + object_property_get_int(obj, entry->value->name, errp)); > +} > +if (g_ascii_strncasecmp(entry->value->type, "uint", 4) == 0) { > +Error **errp = NULL; > +entry->value->value = g_strdup_printf("%lu", > +object_property_get_uint(obj, entry->value->name, errp)); > +} > +if (g_ascii_strncasecmp(entry->value->type, "bool", 4) == 0) { > +Error **errp = NULL; > +entry->value->value = g_strdup_printf("%s", > + (object_property_get_bool(obj, entry->value->name, errp) == > true) > +? "true" : "false"); > +} > + > } > > return props; > -- > 1.8.3.1 > > -- Regards QingFeng Hao
Re: [Qemu-devel] Why is there no qom_get in hmp.c?
在 2018/4/18 22:04, Dr. David Alan Gilbert 写道: > * QingFeng Hao (ha...@linux.vnet.ibm.com) wrote: >> Hi all, >> I did some investigation and found that "virsh qemu-monitor-command" >> supports qom-get, >> but qemu hmp doesn't. However, in hmp.c there are qom_list and qom_set. It >> confused me >> and my question is: why is this? And how can I get a property's value in >> hmp? e.g. >> qemu-system-* -nodefaults -machine accel=qtest -no-shutdown -nographic >> -monitor stdio -serial none -hda /root/t.qcow2 >> "info qtree" can only get a few properties. > > I did try that in 2016 (see my series from about September); but it got > bogged down in trying to fix output visitors; it's possible the visitor > code has been fixed since then though. > Thanks! I used your patch with a bit fix of compilation to test, which can work and print the json format string for structure property. The prior discussions seem no any eventual conclusion with some tricks. > The 'Show values and description when using "qom-list"' patch > that Ricardo Perez Blanco posted would do something similar. Yes, I saw the patch. thanks > > Dave > >> Thanks a lot! >> -- >> Regards >> QingFeng Hao >> >> > -- > Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK > -- Regards QingFeng Hao
[Qemu-devel] Why is there no qom_get in hmp.c?
Hi all, I did some investigation and found that "virsh qemu-monitor-command" supports qom-get, but qemu hmp doesn't. However, in hmp.c there are qom_list and qom_set. It confused me and my question is: why is this? And how can I get a property's value in hmp? e.g. qemu-system-* -nodefaults -machine accel=qtest -no-shutdown -nographic -monitor stdio -serial none -hda /root/t.qcow2 "info qtree" can only get a few properties. Thanks a lot! -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH for-2.12 v2] qemu-iotests: update 185 output
在 2018/4/4 23:01, Stefan Hajnoczi 写道: > Commit 4486e89c219c0d1b9bd8dfa0b1dd5b0d51ff2268 ("vl: introduce > vm_shutdown()") added a bdrv_drain_all() call. As a side-effect of the > drain operation the block job iterates one more time than before. The > 185 output no longer matches and the test is failing now. > > It may be possible to avoid the superfluous block job iteration, but > that type of patch is not suitable late in the QEMU 2.12 release cycle. > > This patch simply updates the 185 output file. The new behavior is > correct, just not optimal, so make the test pass again. > > Fixes: 4486e89c219c0d1b9bd8dfa0b1dd5b0d51ff2268 ("vl: introduce > vm_shutdown()") > Cc: Kevin Wolf > Cc: QingFeng Hao > Signed-off-by: Stefan Hajnoczi > --- > tests/qemu-iotests/185 | 10 ++ > tests/qemu-iotests/185.out | 12 +++- > 2 files changed, 13 insertions(+), 9 deletions(-) > > diff --git a/tests/qemu-iotests/185 b/tests/qemu-iotests/185 > index f5b47e4c1a..298d88d04e 100755 > --- a/tests/qemu-iotests/185 > +++ b/tests/qemu-iotests/185 > @@ -92,9 +92,8 @@ echo === Start commit job and exit qemu === > echo > > # Note that the reference output intentionally includes the 'offset' field in > -# BLOCK_JOB_CANCELLED events for all of the following block jobs. They are > -# predictable and any change in the offsets would hint at a bug in the job > -# throttling code. > +# BLOCK_JOB_* events for all of the following block jobs. They are > predictable > +# and any change in the offsets would hint at a bug in the job throttling > code. > # > # In order to achieve these predictable offsets, all of the following tests > # use speed=65536. Each job will perform exactly one iteration before it has > @@ -102,11 +101,14 @@ echo > # command to be received (after receiving the command, the rest runs > # synchronously, so jobs can arbitrarily continue or complete). > # > +# Jobs present while QEMU is terminating iterate once more due to > +# bdrv_drain_all(). > +# > # The buffer size for commit and streaming is 512k (waiting for 8 seconds > after > # the first request), for active commit and mirror it's large enough to cover > # the full 4M, and for backup it's the qcow2 cluster size, which we know is > # 64k. As all of these are at least as large as the speed, we are sure that > the > -# offset doesn't advance after the first iteration before qemu exits. > +# offset advances exactly twice before qemu exits. > > _send_qemu_cmd $h \ > "{ 'execute': 'block-commit', Reviewed-by: QingFeng Hao > diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out > index 57eaf8d699..2c4b04de73 100644 [...] > -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH] qemu-iotests: update 185 output
在 2018/4/3 22:03, Stefan Hajnoczi 写道: > Commit 4486e89c219c0d1b9bd8dfa0b1dd5b0d51ff2268 ("vl: introduce > vm_shutdown()") added a bdrv_drain_all() call. As a side-effect of the > drain operation the block job iterates one more time than before. The > 185 output no longer matches and the test is failing now. > > It may be possible to avoid the superfluous block job iteration, but > that type of patch is not suitable late in the QEMU 2.12 release cycle. > > This patch simply updates the 185 output file. The new behavior is > correct, just not optimal, so make the test pass again. > > Fixes: 4486e89c219c0d1b9bd8dfa0b1dd5b0d51ff2268 ("vl: introduce > vm_shutdown()") > Cc: Kevin Wolf > Cc: QingFeng Hao > Signed-off-by: Stefan Hajnoczi > --- > tests/qemu-iotests/185.out | 12 +++- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out > index 57eaf8d699..2c4b04de73 100644 > --- a/tests/qemu-iotests/185.out > +++ b/tests/qemu-iotests/185.out > @@ -20,7 +20,7 @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 > backing_file=TEST_DIR/t.q > {"return": {}} > {"return": {}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "SHUTDOWN", "data": {"guest": false}} > -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": > 524288, "speed": 65536, "type": "commit"}} > +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": > 1048576, "speed": 65536, "type": "commit"}} Need we add the comment in 185.out that this change is to make the test pass for the superfluous block job iteration? thanks > > === Start active commit job and exit qemu === > > @@ -28,16 +28,18 @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 > backing_file=TEST_DIR/t.q > {"return": {}} > {"return": {}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "SHUTDOWN", "data": {"guest": false}} > -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 4194304, "offset": > 4194304, "speed": 65536, "type": "commit"}} > +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "BLOCK_JOB_READY", "data": {"device": "disk", "len": 4194304, "offset": > 4194304, "speed": 65536, "type": "commit"}} > +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "BLOCK_JOB_COMPLETED", "data": {"device": "disk", "len": 4194304, "offset": > 4194304, "speed": 65536, "type": "commit"}} [...] > -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2 1/1] iotests: fix test case 185
在 2018/3/26 18:29, Kevin Wolf 写道: Am 23.03.2018 um 04:43 hat QingFeng Hao geschrieben: Test case 185 failed since commit 4486e89c219 --- "vl: introduce vm_shutdown()". It's because of the newly introduced function vm_shutdown calls bdrv_drain_all, which is called later by bdrv_close_all. bdrv_drain_all resumes the jobs that doubles the speed and offset is doubled. Some jobs' status are changed as well. The fix is to not resume the jobs that are already yielded and also change 185.out accordingly. Suggested-by: Stefan Hajnoczi Signed-off-by: QingFeng Hao Stefan already commented on the fix itself, but I want to add two more points: Please change your subject line. "iotests: fix test case 185" means that you are fixing the test case, not qemu code that makes the test case fail. The subject line should describe the actual change. In all likelihood it will start with "blockjob:" rather than "iotests:". Sure! thanks for pointing that. diff --git a/include/block/blockjob.h b/include/block/blockjob.h index fc645dac68..f8f208bbcf 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -99,6 +99,11 @@ typedef struct BlockJob { bool ready; /** + * Set to true when the job is yielded. + */ +bool yielded; This is the same as !busy, so we don't need a new field for this. Mostly yes, but the trick is that busy is set to be true in block_job_do_yield. Kevin -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2 1/1] iotests: fix test case 185
在 2018/3/23 18:04, Stefan Hajnoczi 写道: On Fri, Mar 23, 2018 at 3:43 AM, QingFeng Hao wrote: Test case 185 failed since commit 4486e89c219 --- "vl: introduce vm_shutdown()". It's because of the newly introduced function vm_shutdown calls bdrv_drain_all, which is called later by bdrv_close_all. bdrv_drain_all resumes the jobs that doubles the speed and offset is doubled. Some jobs' status are changed as well. The fix is to not resume the jobs that are already yielded and also change 185.out accordingly. Suggested-by: Stefan Hajnoczi Signed-off-by: QingFeng Hao --- blockjob.c | 10 +- include/block/blockjob.h | 5 + tests/qemu-iotests/185.out | 11 +-- If drain no longer forces the block job to iterate, shouldn't the test output remain the same? (The means the test is fixed by the QEMU patch.) 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/blockjob.c b/blockjob.c index ef3ed69ff1..fa9838ac97 100644 --- a/blockjob.c +++ b/blockjob.c @@ -206,11 +206,16 @@ void block_job_txn_add_job(BlockJobTxn *txn, BlockJob *job) static void block_job_pause(BlockJob *job) { -job->pause_count++; +if (!job->yielded) { +job->pause_count++; +} The pause cannot be ignored. This change introduces a bug. Pause is not a synchronous operation that stops the job immediately. Pause just remembers that the job needs to be paused. When the job runs again (e.g. timer callback, fd handler) it eventually reaches block_job_pause_point() where it really pauses. The bug in this patch is: 1. The job has a timer pending. 2. block_job_pause() is called during drain. 3. The timer fires during drain but now the job doesn't know it needs to pause, so it continues running! Instead what needs to happen is that block_job_pause() remains unmodified but block_job_resume if extended: static void block_job_resume(BlockJob *job) { assert(job->pause_count > 0); job->pause_count--; if (job->pause_count) { return; } +if (job_yielded_before_pause_and_is_still_yielded) { Thanks a lot for your great comments! But I can't figure out how to check this. block_job_enter(job); +} } This handles the case I mentioned above, where the yield ends before pause ends (therefore resume must enter the job!). To make this a little clearer, there are two cases to consider: Case 1: 1. Job yields 2. Pause 3. Job is entered from timer/fd callback How do I know that if job is entered from ...? thanks 4. Resume (enter job? yes) Case 2: 1. Job yields 2. Pause 3. Resume (enter job? no) 4. Job is entered from timer/fd callback Stefan -- Regards QingFeng Hao
[Qemu-devel] [PATCH v2 0/1] iotests: fix test case 185
Hi, This patch is to fix iotest case 185 and based on the latest commit d522e0bd18364 --- "gitmodules: Use the QEMU mirror of qemu-palcode". Thanks! Change Log (v2): * Recover the change on the call to bdrv_drain_all but don't resume the yielded jobs according to Stefan Hajnoczi's comment. * Change 185.out accordingly as job's status is changed as well. Change Log (v1): * Remove the call to bdrv_drain_all in vm_shutdown to make case 185 passed. QingFeng Hao (1): iotests: fix test case 185 blockjob.c | 10 +- include/block/blockjob.h | 5 + tests/qemu-iotests/185.out | 11 +-- 3 files changed, 23 insertions(+), 3 deletions(-) -- 2.13.5
[Qemu-devel] [PATCH v2 1/1] iotests: fix test case 185
Test case 185 failed since commit 4486e89c219 --- "vl: introduce vm_shutdown()". It's because of the newly introduced function vm_shutdown calls bdrv_drain_all, which is called later by bdrv_close_all. bdrv_drain_all resumes the jobs that doubles the speed and offset is doubled. Some jobs' status are changed as well. The fix is to not resume the jobs that are already yielded and also change 185.out accordingly. Suggested-by: Stefan Hajnoczi Signed-off-by: QingFeng Hao --- blockjob.c | 10 +- include/block/blockjob.h | 5 + tests/qemu-iotests/185.out | 11 +-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/blockjob.c b/blockjob.c index ef3ed69ff1..fa9838ac97 100644 --- a/blockjob.c +++ b/blockjob.c @@ -206,11 +206,16 @@ void block_job_txn_add_job(BlockJobTxn *txn, BlockJob *job) static void block_job_pause(BlockJob *job) { -job->pause_count++; +if (!job->yielded) { +job->pause_count++; +} } static void block_job_resume(BlockJob *job) { +if (job->yielded) { +return; +} assert(job->pause_count > 0); job->pause_count--; if (job->pause_count) { @@ -371,6 +376,7 @@ static void block_job_sleep_timer_cb(void *opaque) BlockJob *job = opaque; block_job_enter(job); +job->yielded = false; } void block_job_start(BlockJob *job) @@ -935,6 +941,7 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver, job->cb= cb; job->opaque= opaque; job->busy = false; +job->yielded = false; job->paused= true; job->pause_count = 1; job->refcnt= 1; @@ -1034,6 +1041,7 @@ static void block_job_do_yield(BlockJob *job, uint64_t ns) timer_mod(&job->sleep_timer, ns); } job->busy = false; +job->yielded = true; block_job_unlock(); qemu_coroutine_yield(); diff --git a/include/block/blockjob.h b/include/block/blockjob.h index fc645dac68..f8f208bbcf 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -99,6 +99,11 @@ typedef struct BlockJob { bool ready; /** + * Set to true when the job is yielded. + */ +bool yielded; + +/** * Set to true when the job has deferred work to the main loop. */ bool deferred_to_main_loop; diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out index 57eaf8d699..798282e196 100644 --- a/tests/qemu-iotests/185.out +++ b/tests/qemu-iotests/185.out @@ -7,6 +7,7 @@ Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864 === Creating backing chain === +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESUME"} Formatting 'TEST_DIR/t.qcow2.mid', fmt=qcow2 size=67108864 backing_file=TEST_DIR/t.qcow2.base backing_fmt=qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16 {"return": {}} wrote 4194304/4194304 bytes at offset 0 @@ -25,23 +26,28 @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 backing_file=TEST_DIR/t.q === Start active commit job and exit qemu === {"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESUME"} {"return": {}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}} === Start mirror job and exit qemu === {"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESUME"} Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 size=67108864 cluster_size=65536 lazy_refcounts=off refcount_bits=
Re: [Qemu-devel] [Qemu-block] [PATCH v1 1/1] iotests: fix test case 185
在 2018/3/21 11:12, QingFeng Hao 写道: 在 2018/3/20 22:31, Stefan Hajnoczi 写道: On Tue, Mar 20, 2018 at 11:11:01AM +0100, Kevin Wolf wrote: Am 19.03.2018 um 18:53 hat Christian Borntraeger geschrieben: On 03/19/2018 05:10 PM, Stefan Hajnoczi wrote: On Mon, Mar 19, 2018 at 9:35 AM, QingFeng Hao wrote: Test case 185 failed since commit 4486e89c219 --- "vl: introduce vm_shutdown()". It's because of the newly introduced function vm_shutdown calls bdrv_drain_all, which is called later by bdrv_close_all. bdrv_drain_all resumes the jobs that doubles the speed and offset is doubled. Some jobs' status are changed as well. Thus, let's not call bdrv_drain_all in vm_shutdown. Signed-off-by: QingFeng Hao --- cpus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpus.c b/cpus.c index 2e6701795b..ae2962508c 100644 --- a/cpus.c +++ b/cpus.c @@ -1006,8 +1006,9 @@ static int do_vm_stop(RunState state, bool send_stop) qapi_event_send_stop(&error_abort); } } - - bdrv_drain_all(); + if (send_stop) { + bdrv_drain_all(); + } Thanks for looking into this bug! This if statement breaks the contract of the function when send_stop is false. Drain ensures that pending I/O completes and that device emulation finishes before this function returns. This is important for live migration, where there must be no more guest-related activity after vm_stop(). This patch relies on the caller invoking bdrv_close_all() immediately after do_vm_stop(), which is not documented and could lead to more bugs in the future. I suggest a different solution: Test 185 relies on internal QEMU behavior which can change from time to time. Buffer sizes and block job iteration counts are implementation details that are not part of qapi-schema.json or other documented behavior. In fact, the existing test case was already broken in IOThread mode since iothread_stop_all() -> bdrv_set_aio_context() also includes a bdrv_drain() with the side-effect of an extra blockjob iteration. After 4486e89c219 ("vl: introduce vm_shutdown()") both IOThread and non-IOThread mode perform the drain. This has caused the test failure. Instead of modifying QEMU to keep the same arbitrary internal behavior as before, please send a patch that updates tests/qemu-iotests/185.out with the latest output. Wouldnt it be better if the test actually masks out the values the are not really part of the "agreed upon" behaviour? Wouldnt block_job_offset from common.filter be what we want? The test case has the following note: # Note that the reference output intentionally includes the 'offset' field in # BLOCK_JOB_CANCELLED events for all of the following block jobs. They are # predictable and any change in the offsets would hint at a bug in the job # throttling code. Now the question is if this particular change is okay rather than hinting at a bug and we should update the reference output or whether we need to change qemu again. I think the change isn't really bad, but we are doing more useless work now than we used to do before, and we're exiting slower because we're spawning additional I/O that we have to wait for. So the better state was certainly the old one. Here is the reason for the additional I/O and how it could be eliminated: child_job_drained_begin() pauses and child_job_drained_end() resumes the job. Resuming the job cancels the timer (if pending) and enters the blockjob's coroutine. This is why draining BlockDriverState forces an extra iteration of the blockjob. The current behavior is intended for the case where the job has I/O pending at child_job_drained_begin() time. When the I/O completes, the job will see it must pause and it will yield at a pause point. It makes sense for child_job_drained_end() to resume the job so it can start I/O again. In our case this behavior doesn't make sense though. The job already yielded before child_job_drained_begin() and it doesn't need to resume at child_job_drained_end() time. We'd prefer to wait for the timer expiry. Thanks for all of your good comments! I think the better way is to filter out this case but I am sure if this is a proper way to do it that adds a yielded field in struct BlockJob to record if it's yielded by block_job_do_yield. However, this way can only solve the offset problem but not the status. Maybe we need also to change 185.out? I am bit confused. thanks What I did is setting job->yielded in block_job_do_yield and adding the check for it in block_job_pause and block_job_resume that if yielded is true, just return. We need to distinguish these two cases to avoid resuming the job in the latter case. I think this would be the proper way to avoid unnecessary blockjob activity across drain. I favor updating the test output though, because the code change adds complexity and the practical be
Re: [Qemu-devel] [Qemu-block] [PATCH v1 1/1] iotests: fix test case 185
在 2018/3/20 22:31, Stefan Hajnoczi 写道: On Tue, Mar 20, 2018 at 11:11:01AM +0100, Kevin Wolf wrote: Am 19.03.2018 um 18:53 hat Christian Borntraeger geschrieben: On 03/19/2018 05:10 PM, Stefan Hajnoczi wrote: On Mon, Mar 19, 2018 at 9:35 AM, QingFeng Hao wrote: Test case 185 failed since commit 4486e89c219 --- "vl: introduce vm_shutdown()". It's because of the newly introduced function vm_shutdown calls bdrv_drain_all, which is called later by bdrv_close_all. bdrv_drain_all resumes the jobs that doubles the speed and offset is doubled. Some jobs' status are changed as well. Thus, let's not call bdrv_drain_all in vm_shutdown. Signed-off-by: QingFeng Hao --- cpus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpus.c b/cpus.c index 2e6701795b..ae2962508c 100644 --- a/cpus.c +++ b/cpus.c @@ -1006,8 +1006,9 @@ static int do_vm_stop(RunState state, bool send_stop) qapi_event_send_stop(&error_abort); } } - -bdrv_drain_all(); +if (send_stop) { +bdrv_drain_all(); +} Thanks for looking into this bug! This if statement breaks the contract of the function when send_stop is false. Drain ensures that pending I/O completes and that device emulation finishes before this function returns. This is important for live migration, where there must be no more guest-related activity after vm_stop(). This patch relies on the caller invoking bdrv_close_all() immediately after do_vm_stop(), which is not documented and could lead to more bugs in the future. I suggest a different solution: Test 185 relies on internal QEMU behavior which can change from time to time. Buffer sizes and block job iteration counts are implementation details that are not part of qapi-schema.json or other documented behavior. In fact, the existing test case was already broken in IOThread mode since iothread_stop_all() -> bdrv_set_aio_context() also includes a bdrv_drain() with the side-effect of an extra blockjob iteration. After 4486e89c219 ("vl: introduce vm_shutdown()") both IOThread and non-IOThread mode perform the drain. This has caused the test failure. Instead of modifying QEMU to keep the same arbitrary internal behavior as before, please send a patch that updates tests/qemu-iotests/185.out with the latest output. Wouldnt it be better if the test actually masks out the values the are not really part of the "agreed upon" behaviour? Wouldnt block_job_offset from common.filter be what we want? The test case has the following note: # Note that the reference output intentionally includes the 'offset' field in # BLOCK_JOB_CANCELLED events for all of the following block jobs. They are # predictable and any change in the offsets would hint at a bug in the job # throttling code. Now the question is if this particular change is okay rather than hinting at a bug and we should update the reference output or whether we need to change qemu again. I think the change isn't really bad, but we are doing more useless work now than we used to do before, and we're exiting slower because we're spawning additional I/O that we have to wait for. So the better state was certainly the old one. Here is the reason for the additional I/O and how it could be eliminated: child_job_drained_begin() pauses and child_job_drained_end() resumes the job. Resuming the job cancels the timer (if pending) and enters the blockjob's coroutine. This is why draining BlockDriverState forces an extra iteration of the blockjob. The current behavior is intended for the case where the job has I/O pending at child_job_drained_begin() time. When the I/O completes, the job will see it must pause and it will yield at a pause point. It makes sense for child_job_drained_end() to resume the job so it can start I/O again. In our case this behavior doesn't make sense though. The job already yielded before child_job_drained_begin() and it doesn't need to resume at child_job_drained_end() time. We'd prefer to wait for the timer expiry. Thanks for all of your good comments! I think the better way is to filter out this case but I am sure if this is a proper way to do it that adds a yielded field in struct BlockJob to record if it's yielded by block_job_do_yield. However, this way can only solve the offset problem but not the status. Maybe we need also to change 185.out? I am bit confused. thanks We need to distinguish these two cases to avoid resuming the job in the latter case. I think this would be the proper way to avoid unnecessary blockjob activity across drain. I favor updating the test output though, because the code change adds complexity and the practical benefit is not obvious to me. QingFeng, if you decide to modify blockjobs, please CC Jeffrey Cody and I'd also be happy to review the patch Stefan -- Regards QingFeng Hao
[Qemu-devel] [PATCH v1 1/1] iotests: fix test case 185
Test case 185 failed since commit 4486e89c219 --- "vl: introduce vm_shutdown()". It's because of the newly introduced function vm_shutdown calls bdrv_drain_all, which is called later by bdrv_close_all. bdrv_drain_all resumes the jobs that doubles the speed and offset is doubled. Some jobs' status are changed as well. Thus, let's not call bdrv_drain_all in vm_shutdown. Signed-off-by: QingFeng Hao --- cpus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpus.c b/cpus.c index 2e6701795b..ae2962508c 100644 --- a/cpus.c +++ b/cpus.c @@ -1006,8 +1006,9 @@ static int do_vm_stop(RunState state, bool send_stop) qapi_event_send_stop(&error_abort); } } - -bdrv_drain_all(); +if (send_stop) { +bdrv_drain_all(); +} replay_disable_events(); ret = bdrv_flush_all(); -- 2.13.5
[Qemu-devel] [PATCH v1 0/1] iotests: fix test case 185
Hi, This patch is to remove the redundant call to bdrv_drain_all in vm_shutdown. Thanks! Test case 185 failed as below: 185 2s ... - output mismatch (see 185.out.bad) --- /home/mc/gitcheck/work/qemu-master/tree/qemu/tests/qemu-iotests/185.out 2018-03-09 01:00:40.451603189 +0100 +++ /home/mc/gitcheck/work/qemu-master/tree/qemu/tests/qemu-iotests/185.out.bad 2018-03-19 09:40:22.781603189 +0100 @@ -20,7 +20,7 @@ {"return": {}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 524288, "speed": 65536, "type": "commit"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 1048576, "speed": 65536, "type": "commit"}} === Start active commit job and exit qemu === @@ -28,7 +28,8 @@ {"return": {}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}} === Start mirror job and exit qemu === @@ -37,7 +38,8 @@ {"return": {}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "mirror"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "mirror"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "mirror"}} === Start backup job and exit qemu === @@ -46,7 +48,7 @@ {"return": {}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 65536, "speed": 65536, "type": "backup"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 131072, "speed": 65536, "type": "backup"}} === Start streaming job and exit qemu === @@ -54,6 +56,6 @@ {"return": {}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 524288, "speed": 65536, "type": "stream"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 1048576, "speed": 65536, "type": "stream"}} No errors were found on the image. *** done Failures: 185 Failed 1 of 1 tests QingFeng Hao (1): iotests: fix test case 185 cpus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) -- 2.13.5
Re: [Qemu-devel] [PATCH v1 1/1] iotests: bypass s390x for case 200
在 2018/3/6 15:56, Christian Borntraeger 写道: Nack. This will be fixed by s390/ipl: only print boot menu error if -boot menu=on was specified You are right. After I applied that patch, the case is passed. Please ignore this patch. Thanks On 03/06/2018 08:54 AM, QingFeng Hao wrote: In s390x, the case 200 failed as: === Starting QEMU VM === +QEMU_PROG: boot menu is not supported for this device type. {"return": {}} === Sending stream/cancel, checking for SIGSEGV only === Failures: 200 Failed 1 of 1 tests It was caused by the command which isn't supported by s390x now: qemu-system-s390x -device pci-bridge,id=bridge1,chassis_nr=1,bus=pci.0 -object iothread,id=iothread0 -device virtio-scsi-pci,bus=bridge1,addr=0x1f,id=scsi0,iothread=iothread0 -drive file=.../scratch/test.img,media=disk,if=none,cache=writeback,id=drive_sysdisk,format=qcow2 -device scsi-hd,drive=drive_sysdisk,bus=scsi0.0,id=sysdisk,bootindex=0 -nographic Signed-off-by: QingFeng Hao --- tests/qemu-iotests/200 | 4 1 file changed, 4 insertions(+) diff --git a/tests/qemu-iotests/200 b/tests/qemu-iotests/200 index ddbdedc476..7e53bd7774 100755 --- a/tests/qemu-iotests/200 +++ b/tests/qemu-iotests/200 @@ -45,6 +45,10 @@ _supported_fmt qcow2 qed _supported_proto file _supported_os Linux +if [ "$QEMU_DEFAULT_MACHINE" != "pc" ]; then +_notrun "Requires a PC machine" +fi + BACKING_IMG="${TEST_DIR}/backing.img" TEST_IMG="${TEST_DIR}/test.img" -- Regards QingFeng Hao
[Qemu-devel] [PATCH v1 1/1] iotests: bypass s390x for case 200
In s390x, the case 200 failed as: === Starting QEMU VM === +QEMU_PROG: boot menu is not supported for this device type. {"return": {}} === Sending stream/cancel, checking for SIGSEGV only === Failures: 200 Failed 1 of 1 tests It was caused by the command which isn't supported by s390x now: qemu-system-s390x -device pci-bridge,id=bridge1,chassis_nr=1,bus=pci.0 -object iothread,id=iothread0 -device virtio-scsi-pci,bus=bridge1,addr=0x1f,id=scsi0,iothread=iothread0 -drive file=.../scratch/test.img,media=disk,if=none,cache=writeback,id=drive_sysdisk,format=qcow2 -device scsi-hd,drive=drive_sysdisk,bus=scsi0.0,id=sysdisk,bootindex=0 -nographic Signed-off-by: QingFeng Hao --- tests/qemu-iotests/200 | 4 1 file changed, 4 insertions(+) diff --git a/tests/qemu-iotests/200 b/tests/qemu-iotests/200 index ddbdedc476..7e53bd7774 100755 --- a/tests/qemu-iotests/200 +++ b/tests/qemu-iotests/200 @@ -45,6 +45,10 @@ _supported_fmt qcow2 qed _supported_proto file _supported_os Linux +if [ "$QEMU_DEFAULT_MACHINE" != "pc" ]; then +_notrun "Requires a PC machine" +fi + BACKING_IMG="${TEST_DIR}/backing.img" TEST_IMG="${TEST_DIR}/test.img" -- 2.13.5
Re: [Qemu-devel] [PATCH v2] s390x/cpu: expose the guest crash information
在 2017/11/8 3:35, Eric Blake 写道: On 11/07/2017 05:00 AM, QingFeng Hao wrote: + +## +# @GuestPanicInformationS390: +# +# S390 specific guest panic information (PSW) +# +# Since: 2.11 +## +{'struct': 'GuestPanicInformationS390', + 'data': { 'psw-mask': 'uint64', + 'psw-addr': 'uint64', + 'reason': 'str' } } Missing documentation of the three fields; in particular, whether I didn't get your point, do you mean we need to add comments for the three fields? But I don't see the comments for Hyper-V either. Your mailer is eating blank lines, which makes it harder to visually distinguish where quoting ends and where new content begins (I had a blank line between your "'reason': 'str' } }" content and my "Missing documentation..." comment). Sorry about that I am using thunderbird and I had set some related configurations but not sure what's going on. I can read it normally. I mean something like: ## # @GuestPanicInformationS390: # # S390 specific guest panic information (PSW) # # @psw-mask: # @psw-addr: Address that was accessed to cause the panic # @reason: Human-readable explanation of the panic (should not be parsed # by a machine) # # Since: 2.11 ## Thanks and our new patch will contain this change. -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2] s390x/cpu: expose the guest crash information
在 2017/9/19 21:04, Eric Blake 写道: On 09/19/2017 02:43 AM, Christian Borntraeger wrote: From: Jing Liu This patch is the s390 implementation of guest crash information, similar to commit d187e08dc4 ("i386/cpu: add crash-information QOM property") and the related commits. We will detect several crash reasons, with the "disabled wait" being the most important one, since this is used by all s390 guests as a "panic like" notification. Demonstrate the these ways with examples as follows. Signed-off-by: Jing Liu Reviewed-by: Christian Borntraeger Signed-off-by: Christian Borntraeger [minor fixes due to upstream feedback] --- V1->V2: - rename kvm-s390 to s390 in all places - add "loop" to the crash reasons where appropriate - use "-" instead of "_" for qapi qapi/run-state.json | 19 -- target/s390x/cpu.c | 57 + target/s390x/cpu.h | 6 ++ target/s390x/kvm.c | 29 +-- vl.c| 6 ++ 5 files changed, 109 insertions(+), 8 deletions(-) diff --git a/qapi/run-state.json b/qapi/run-state.json index d36ff49..4567510 100644 --- a/qapi/run-state.json + +## +# @GuestPanicInformationS390: +# +# S390 specific guest panic information (PSW) +# +# Since: 2.11 +## +{'struct': 'GuestPanicInformationS390', + 'data': { 'psw-mask': 'uint64', + 'psw-addr': 'uint64', + 'reason': 'str' } } Missing documentation of the three fields; in particular, whether I didn't get your point, do you mean we need to add comments for the three fields? But I don't see the comments for Hyper-V either. Thanks 'reason' is for human consumption only (presumably the case) rather than for machine parsing. yes, the 'reason' is for human understanding and also investigation but psw-* could be used to parse later. +cpu_synchronize_state(cs); +panic_info = g_malloc0(sizeof(GuestPanicInformation)); + +panic_info->type = GUEST_PANIC_INFORMATION_TYPE_S390; +panic_info->u.s390.psw_mask = cpu->env.psw.mask; +panic_info->u.s390.psw_addr = cpu->env.psw.addr; + +switch (cs->exception_index) { +case EXCP_CRASH_PGM: +panic_info->u.s390.reason = g_strdup("program interrupt loop"); +break; +case EXCP_CRASH_EXT: +panic_info->u.s390.reason = g_strdup("external interrupt loop"); +break; +case EXCP_CRASH_WAITPSW: +panic_info->u.s390.reason = g_strdup("disabled wait"); +break; +case EXCP_CRASH_OPEREXC: +panic_info->u.s390.reason = g_strdup("operation exception loop"); +break; +default: +panic_info->u.s390.reason = g_strdup("unknown crash reason"); +break; Is it worth a QAPI enum type to expose the reason as one of a finite set of known strings, or is that information not needed beyond the human-only string that you are setting here? Actually we had considered to use enum type for 'reason' instead of str, the awkwardness is that then qemu_system_guest_panicked has to parse the 'reason' before it prints it, but qemu_system_guest_panicked is a common function and we don't want to do more arch related handling there. Thanks! -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2 0/3] iotests: cure s390x failures by switching to ccw/aliases
Reviewed-by: QingFeng Hao for the series of patches. Thanks 在 2017/9/13 17:10, Cornelia Huck 写道: Recent changes in s390x made pci support dependant on the zpci cpu feature, which is not provided on all models (and not on by default). This means we cannot instatiate pci devices on a standard qemu invocation for s390x. Moreover, the zpci instructions are not even wired up for tcg yet, so actually doing anything with those pci devices is bound to fail on tcg. For 040, 051, 139, and 182, this can be fixed by switching to virtio-ccw from virtio-pci on s390x. 051 also needs a bit of post-processing on the output. For 067, it is easier to switch to virtio aliases, which will pick virtio-ccw on s390x and virtio-pci elsewhere. It also exercises the aliasing path. v1->v2: - avoid adding new reference output by adding post-processing to 051 and switching to aliases for 067 Cornelia Huck (3): iotests: use -ccw on s390x for 040, 139, and 182 iotests: use -ccw on s390x for 051 iotests: use virtio aliases for 067 tests/qemu-iotests/040| 6 +- tests/qemu-iotests/051| 12 +++- tests/qemu-iotests/051.out| 2 +- tests/qemu-iotests/051.pc.out | 2 +- tests/qemu-iotests/067| 3 ++- tests/qemu-iotests/067.out| 2 +- tests/qemu-iotests/139| 12 ++-- tests/qemu-iotests/182| 13 +++-- 8 files changed, 42 insertions(+), 10 deletions(-) -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH 2/3] iotests: use -ccw on s390x for 051
在 2017/9/6 15:32, Cornelia Huck 写道: On Wed, 6 Sep 2017 15:19:01 +0800 QingFeng Hao wrote: 在 2017/9/5 23:16, Cornelia Huck 写道: The default cpu model on s390x does not provide zPCI, which is not yet wired up on tcg. Moreover, virtio-ccw is the standard on s390x, so use the -ccw instead of the -pci versions of virtio devices on s390x. Provide an output file for s390x. Signed-off-by: Cornelia Huck --- tests/qemu-iotests/051 | 9 +- tests/qemu-iotests/051.s390-ccw-virtio.out | 434 + 2 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 tests/qemu-iotests/051.s390-ccw-virtio.out diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051 index c8cfc764bc..f6ad0f4f0b 100755 --- a/tests/qemu-iotests/051 +++ b/tests/qemu-iotests/051 @@ -103,7 +103,14 @@ echo echo === Device without drive === echo -run_qemu -device virtio-scsi-pci -device scsi-hd +case "$QEMU_DEFAULT_MACHINE" in + s390-ccw-virtio) + run_qemu -device virtio-scsi-ccw -device scsi-hd + ;; + *) + run_qemu -device virtio-scsi-pci -device scsi-hd + ;; +esac echo echo === Overriding backing file === Regarding the new output file, I have a doubt that why there is no change on "check" script where the result check is located: if diff -w "$reference" $tmp.out >/dev/null 2>&1 Got it. It makes sense. The right output reference should be picked as of commit e166b4148208656635ea2fe39df8b1e875a34fb8 Author: Bo Tu Date: Fri Jul 3 15:28:46 2015 +0800 qemu-iotests: qemu machine type support This patch adds qemu machine type support to the io test suite. Based on the qemu default machine type and alias of the default machine type the reference output file can now vary from the default to a machine specific output file if necessary. When using a machine specific reference file if the default machine has an alias then use the alias as the output file name otherwise use the default machine name as the output file name. Reviewed-by: Max Reitz Reviewed-by: Michael Mueller Reviewed-by: Sascha Silbe Signed-off-by: Xiao Guang Chen Signed-off-by: Kevin Wolf -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH 2/3] iotests: use -ccw on s390x for 051
在 2017/9/5 23:16, Cornelia Huck 写道: The default cpu model on s390x does not provide zPCI, which is not yet wired up on tcg. Moreover, virtio-ccw is the standard on s390x, so use the -ccw instead of the -pci versions of virtio devices on s390x. Provide an output file for s390x. Signed-off-by: Cornelia Huck --- tests/qemu-iotests/051 | 9 +- tests/qemu-iotests/051.s390-ccw-virtio.out | 434 + 2 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 tests/qemu-iotests/051.s390-ccw-virtio.out diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051 index c8cfc764bc..f6ad0f4f0b 100755 --- a/tests/qemu-iotests/051 +++ b/tests/qemu-iotests/051 @@ -103,7 +103,14 @@ echo echo === Device without drive === echo -run_qemu -device virtio-scsi-pci -device scsi-hd +case "$QEMU_DEFAULT_MACHINE" in + s390-ccw-virtio) + run_qemu -device virtio-scsi-ccw -device scsi-hd + ;; + *) + run_qemu -device virtio-scsi-pci -device scsi-hd + ;; +esac echo echo === Overriding backing file === Regarding the new output file, I have a doubt that why there is no change on "check" script where the result check is located: if diff -w "$reference" $tmp.out >/dev/null 2>&1 Thanks! diff --git a/tests/qemu-iotests/051.s390-ccw-virtio.out b/tests/qemu-iotests/051.s390-ccw-virtio.out new file mode 100644 index 00..7555f0b73e --- /dev/null +++ b/tests/qemu-iotests/051.s390-ccw-virtio.out [...] -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH 0/3] iotests: cure s390x failures by switching to ccw
在 2017/9/5 23:16, Cornelia Huck 写道: Recent changes in s390x made pci support dependant on the zpci cpu feature, which is not provided on all models (and not on by default). This means we cannot instatiate pci devices on a standard qemu invocation for s390x. Moreover, the zpci instructions are not even wired up for tcg yet, so actually doing anything with those pci devices is bound to fail on tcg. Let's follow the existing example in 068 and switch to the (default) virtio-ccw transport on s390x. The changes for 051 and 067 are split out as they require adding an output file for s390x (the actual command lines are part of the output). We also found this error and YiMin suggested to change the code in ccw_init as below: if (pci_available) { DeviceState *dev = qdev_create(NULL, TYPE_S390_PCI_HOST_BRIDGE); ... } We tested it and it can make the 5 cases passed. How do you think this? :-) Thanks! Cornelia Huck (3): iotests: use -ccw on s390x for 040, 139, and 182 iotests: use -ccw on s390x for 051 iotests: use -ccw on s390x for 067 tests/qemu-iotests/040 | 6 +- tests/qemu-iotests/051 | 9 +- tests/qemu-iotests/051.s390-ccw-virtio.out | 434 +++ tests/qemu-iotests/067 | 11 +- tests/qemu-iotests/067.s390-ccw-virtio.out | 458 + tests/qemu-iotests/139 | 12 +- tests/qemu-iotests/182 | 13 +- 7 files changed, 936 insertions(+), 7 deletions(-) create mode 100644 tests/qemu-iotests/051.s390-ccw-virtio.out create mode 100644 tests/qemu-iotests/067.s390-ccw-virtio.out -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v4 0/1] virtio-scsi-ccw: fix iotest 068 for s390x
在 2017/7/5 23:15, Stefan Hajnoczi 写道: On Tue, Jul 04, 2017 at 03:23:49PM +0200, QingFeng Hao wrote: This commit fixes iotest 068 for s390x as s390x uses virtio-scsi-ccw. It's based on commit c324fd0a39c by Stefan Hajnoczi. Thanks! Change history: v4: Got Cornelia Huck's Reviewed-by and take the comment to change the commit message. v3: Take Christian Borntraeger and Cornelia Huck's comment to check if kvm is enabled in s390_assign_subch_ioeventfd instead of kvm_s390_assign_subch_ioeventfd to as the former is a general one. v2: Remove Stefan from sign-off list and change the patch's commit message according to Christian Borntraeger's comment. QingFeng Hao (1): virtio-scsi-ccw: use ioeventfd even when KVM is disabled hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) I didn't realize s390 also has this old check. Thanks for fixing it! Thanks Stefan! Reviewed-by: Stefan Hajnoczi -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v4 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/4 22:04, Christian Borntraeger 写道: On 07/04/2017 03:23 PM, QingFeng Hao wrote: This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c ("virtio-pci: use ioeventfd even when KVM is disabled") Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. Currently we don't have an equivalent to "memory: emulate ioeventfd" for ccw yet, but that this doesn't hurt and qemu-iotests 068 can pass with skipping iothread arguments. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao Reviewed-by: Cornelia Huck I will take it via the s390-next tree. thanks applied. Ok, thanks. --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 9faca04b52..bdb9bdbc9d 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -1264,7 +1264,11 @@ static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id, int vq, bool assign) { -return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +if (kvm_enabled()) { +return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +} else { + return 0; +} } static inline void s390_crypto_reset(void) -- Regards QingFeng Hao
[Qemu-devel] [PATCH v4 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c ("virtio-pci: use ioeventfd even when KVM is disabled") Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. Currently we don't have an equivalent to "memory: emulate ioeventfd" for ccw yet, but that this doesn't hurt and qemu-iotests 068 can pass with skipping iothread arguments. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao Reviewed-by: Cornelia Huck --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 9faca04b52..bdb9bdbc9d 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -1264,7 +1264,11 @@ static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id, int vq, bool assign) { -return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +if (kvm_enabled()) { +return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +} else { +return 0; +} } static inline void s390_crypto_reset(void) -- 2.11.2
[Qemu-devel] [PATCH v4 0/1] virtio-scsi-ccw: fix iotest 068 for s390x
This commit fixes iotest 068 for s390x as s390x uses virtio-scsi-ccw. It's based on commit c324fd0a39c by Stefan Hajnoczi. Thanks! Change history: v4: Got Cornelia Huck's Reviewed-by and take the comment to change the commit message. v3: Take Christian Borntraeger and Cornelia Huck's comment to check if kvm is enabled in s390_assign_subch_ioeventfd instead of kvm_s390_assign_subch_ioeventfd to as the former is a general one. v2: Remove Stefan from sign-off list and change the patch's commit message according to Christian Borntraeger's comment. QingFeng Hao (1): virtio-scsi-ccw: use ioeventfd even when KVM is disabled hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) -- 2.11.2
Re: [Qemu-devel] [PATCH v3 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/4 17:34, Cornelia Huck 写道: On Tue, 4 Jul 2017 10:32:31 +0200 QingFeng Hao wrote: This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c (" virtio-pci: use ioeventfd even when KVM is disabled) Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. It might be good to add a sentence that we don't have an equivalent to "memory: emulate ioeventfd" for ccw yet, but that this doesn't hurt. Ok, I'll add it. thanks. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 9faca04b52..bdb9bdbc9d 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -1264,7 +1264,11 @@ static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id, int vq, bool assign) { -return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +if (kvm_enabled()) { +return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +} else { +return 0; +} } static inline void s390_crypto_reset(void) Reviewed-by: Cornelia Huck Thanks! -- Regards QingFeng Hao
[Qemu-devel] [PATCH v3 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c (" virtio-pci: use ioeventfd even when KVM is disabled) Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 9faca04b52..bdb9bdbc9d 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -1264,7 +1264,11 @@ static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id, int vq, bool assign) { -return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +if (kvm_enabled()) { +return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +} else { +return 0; +} } static inline void s390_crypto_reset(void) -- 2.11.2
[Qemu-devel] [PATCH v3 0/1] virtio-scsi-ccw: fix iotest 068 for s390x
This commit fixes iotest 068 for s390x as s390x uses virtio-scsi-ccw. It's based on commit c324fd0a39c by Stefan Hajnoczi. Thanks! Change history: v3: Take Christian Borntraeger and Cornelia Huck's comment to check if kvm is enabled in s390_assign_subch_ioeventfd instead of kvm_s390_assign_subch_ioeventfd to as the former is a general one. v2: Remove Stefan from sign-off list and change the patch's commit message according to Christian Borntraeger's comment. QingFeng Hao (1): virtio-scsi-ccw: use ioeventfd even when KVM is disabled hw/s390x/virtio-ccw.c | 2 +- target/s390x/cpu.h| 6 +- 2 files changed, 6 insertions(+), 2 deletions(-) -- 2.11.2
Re: [Qemu-devel] [PATCH v2 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/4 15:06, Christian Borntraeger 写道: On 07/04/2017 05:41 AM, QingFeng Hao wrote: 在 2017/7/3 18:20, Christian Borntraeger 写道: On 07/03/2017 10:51 AM, QingFeng Hao wrote: This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c (" virtio-pci: use ioeventfd even when KVM is disabled) Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} thinking more about it. wouldnt it be better to do something like this instead diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 058ddad..cc47831 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -1240,7 +1240,11 @@ static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id, int vq, bool assign) { -return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +if (kvm_enabled()) { +return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +} else { +return 0; +} } Thanks. It makes sense. I'll change it. static inline void s390_crypto_reset(void) FWIW, it seems that we (s390) do not have a functional equivalent function as commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") , so we will not use the iothreads. Ok, but might s390 have skipped the iothread arguments and passed the test, so we could still keep this test case? Yes, lets just fix the test case. We can implement emulated ioeventfds later. Fine, thanks! -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/3 19:48, Cornelia Huck 写道: On Mon, 3 Jul 2017 09:38:36 +0200 QingFeng Hao wrote: Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao Signed-off-by: Stefan Hajnoczi --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} I'd prefer if you moved the kvm_enabled() check into s390_assign_subch_ioeventfd(). Thanks and I'll change it just as Christian's comment. if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) { return -ENOSYS; } -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/3 18:20, Christian Borntraeger 写道: On 07/03/2017 10:51 AM, QingFeng Hao wrote: This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c (" virtio-pci: use ioeventfd even when KVM is disabled) Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} thinking more about it. wouldnt it be better to do something like this instead diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 058ddad..cc47831 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -1240,7 +1240,11 @@ static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id, int vq, bool assign) { -return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +if (kvm_enabled()) { +return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign); +} else { +return 0; +} } Thanks. It makes sense. I'll change it. static inline void s390_crypto_reset(void) FWIW, it seems that we (s390) do not have a functional equivalent function as commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") , so we will not use the iothreads. Ok, but might s390 have skipped the iothread arguments and passed the test, so we could still keep this test case? if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) { return -ENOSYS; } -- Regards QingFeng Hao
[Qemu-devel] [PATCH v2 0/1] virtio-scsi-ccw: fix iotest 068 for s390x
This commit fixes iotest 068 for s390x as s390x uses virtio-scsi-ccw. It's based on commit c324fd0a39c by Stefan Hajnoczi. Thanks! Change history: v2: Remove Stefan from sign-off list and change the patch's commit message according to Christian Borntraeger's comment. QingFeng Hao (1): virtio-scsi-ccw: use ioeventfd even when KVM is disabled hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) -- 2.11.2
[Qemu-devel] [PATCH v2 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
This patch is based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c (" virtio-pci: use ioeventfd even when KVM is disabled) Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) { return -ENOSYS; } -- 2.11.2
Re: [Qemu-devel] [PATCH 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/3 16:21, Christian Borntraeger 写道: On 07/03/2017 10:08 AM, QingFeng Hao wrote: 在 2017/7/3 15:41, Christian Borntraeger 写道: On 07/03/2017 09:38 AM, QingFeng Hao wrote: Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao Signed-off-by: Stefan Hajnoczi cut'n'paste mistake of adding Stefans signoff? Otherwise it looks good. I just want to mark that this patch is related with the former one from Stefan. Is that ok to add this sign-off? thanks! No, sign-off indicates who passes the patch along for integration, so only Stefan is allowed to add that - if he actually takes the patch. It is very important to not mangle the sign-off-chain as it is actually used to track how a patch moved from the developer into the tree. You can give credit to Stefan in the patch description - e.g. by saying in the patch description something like based on a similar patch from Stefan Hajnoczi - commit c324fd0a39c (" virtio-pci: use ioeventfd even when KVM is disabled) Thanks for your good explanation and I'll change the commit message. --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) { return -ENOSYS; } -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
在 2017/7/3 15:41, Christian Borntraeger 写道: On 07/03/2017 09:38 AM, QingFeng Hao wrote: Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao Signed-off-by: Stefan Hajnoczi cut'n'paste mistake of adding Stefans signoff? Otherwise it looks good. I just want to mark that this patch is related with the former one from Stefan. Is that ok to add this sign-off? thanks! --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) { return -ENOSYS; } -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH 0/4] migration: fix iotest 055, only-migratable break
I tested the 2 patches and they can make iotest 055 passed on both x86 and s390x. thanks 在 2017/7/3 10:44, Peter Xu 写道: Two breakage introduced during the migration objectify series: one for --only-migratable, another one for iotest 055. First two patches fixes the breakages. Latter two are documentation updates suggested by Eduardo. Please review. Thanks. Peter Xu (4): migration: fix handling for --only-migratable vl: move global property, migrate init earlier doc: add item for "-M enforce-config-section" doc: update TYPE_MIGRATION documents include/migration/misc.h | 1 - migration/migration.c| 20 +--- qemu-options.hx | 8 vl.c | 26 +- 4 files changed, 30 insertions(+), 25 deletions(-) -- Regards QingFeng Hao
[Qemu-devel] [PATCH 1/1] virtio-scsi-ccw: use ioeventfd even when KVM is disabled
Do not check kvm_eventfds_enabled() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-scsi-ccw,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-scsi-ccw works under tcg both with and without iothread. This patch fixes qemu-iotests 068, which was accidentally merged early despite the dependency on ioeventfd. Signed-off-by: QingFeng Hao Signed-off-by: Stefan Hajnoczi --- hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb9ff..35896eb007 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp) sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index a3d00196f4..c37f9c3b9e 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -2220,6 +2220,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, .addr = sch, .len = 8, }; +if (!kvm_enabled()) { +return 0; +} if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) { return -ENOSYS; } -- 2.11.2
[Qemu-devel] [PATCH 0/1] virtio-scsi-ccw: fix iotest 068 on s390x
This commit fixes iotest 068 for s390x as s390x uses virtio-scsi-ccw. The related commit is c324fd0a39c for other platforms by Stefan Hajnoczi. Thanks! QingFeng Hao (1): virtio-scsi-ccw: use ioeventfd even when KVM is disabled hw/s390x/virtio-ccw.c | 2 +- target/s390x/kvm.c| 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) -- 2.11.2
Re: [Qemu-devel] [Qemu-block] [PULL 11/61] virtio-pci: use ioeventfd even when KVM is disabled
在 2017/6/28 18:22, Kevin Wolf 写道: Am 28.06.2017 um 12:11 hat QingFeng Hao geschrieben: 在 2017/6/24 0:21, Kevin Wolf 写道: From: Stefan Hajnoczi Old kvm.ko versions only supported a tiny number of ioeventfds so virtio-pci avoids ioeventfds when kvm_has_many_ioeventfds() returns 0. Do not check kvm_has_many_ioeventfds() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-blk-pci,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-blk-pci works under TCG both with and without iothread. Cc: Michael S. Tsirkin Signed-off-by: Stefan Hajnoczi Reviewed-by: Michael S. Tsirkin Signed-off-by: Kevin Wolf --- hw/virtio/virtio-pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 20d6a08..301920e 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1740,7 +1740,7 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp) bool pcie_port = pci_bus_is_express(pci_dev->bus) && !pci_bus_is_root(pci_dev->bus); -if (!kvm_has_many_ioeventfds()) { +if (kvm_enabled() && !kvm_has_many_ioeventfds()) { proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD; } This response is actually for mail thread "Re: [Qemu-devel] [PATCH 1/5] virtio-pci: use ioeventfd even when KVM is disabled" which I didn't receive, sorry. I also saw the failed case of 068 as Fam due to the same cause on s390x and x86. With this patch applied, no failure found. Further investigation shows that the error is in virtio_scsi_dataplane_setup: if (!virtio_device_ioeventfd_enabled(vdev)) { error_setg(errp, "ioeventfd is required for iothread"); return; } call flow is: virtio_device_ioeventfd_enabled-->virtio_bus_ioeventfd_enabled -->k->ioeventfd_enabled-->virtio_pci_ioeventfd_enabled virtio_pci_ioeventfd_enabled checks flag VIRTIO_PCI_FLAG_USE_IOEVENTFD which was cleared in virtio_pci_realize if this patch isn't applied. Yes, we know all of this. However, this patch is not correct and causes 'make check' failures on some platforms. The open question is where that failure comes from. Before this is solved, the patch can't be applied. Sorry that I found case 068 of the latest master still fails on s390x (but passed on x86) and the cause is that s390x uses "-device virtio-scsi-ccw" instead of "-device virtio-scsi-pci", so the change in virtio_ccw_device_realize is also needed: diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 90d37cb..35896eb 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -711,7 +711,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error sch->cssid, sch->ssid, sch->schid, sch->devno, ccw_dev->devno.valid ? "user-configured" : "auto-configured"); -if (!kvm_eventfds_enabled()) { +if (kvm_enabled() && !kvm_eventfds_enabled()) { dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD; } I'll send out a patch for that. Thanks! Kevin -- Regards QingFeng Hao
Re: [Qemu-devel] [Qemu-block] [PULL 11/61] virtio-pci: use ioeventfd even when KVM is disabled
在 2017/6/28 18:22, Kevin Wolf 写道: Am 28.06.2017 um 12:11 hat QingFeng Hao geschrieben: 在 2017/6/24 0:21, Kevin Wolf 写道: From: Stefan Hajnoczi Old kvm.ko versions only supported a tiny number of ioeventfds so virtio-pci avoids ioeventfds when kvm_has_many_ioeventfds() returns 0. Do not check kvm_has_many_ioeventfds() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-blk-pci,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-blk-pci works under TCG both with and without iothread. Cc: Michael S. Tsirkin Signed-off-by: Stefan Hajnoczi Reviewed-by: Michael S. Tsirkin Signed-off-by: Kevin Wolf --- hw/virtio/virtio-pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 20d6a08..301920e 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1740,7 +1740,7 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp) bool pcie_port = pci_bus_is_express(pci_dev->bus) && !pci_bus_is_root(pci_dev->bus); -if (!kvm_has_many_ioeventfds()) { +if (kvm_enabled() && !kvm_has_many_ioeventfds()) { proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD; } This response is actually for mail thread "Re: [Qemu-devel] [PATCH 1/5] virtio-pci: use ioeventfd even when KVM is disabled" which I didn't receive, sorry. I also saw the failed case of 068 as Fam due to the same cause on s390x and x86. With this patch applied, no failure found. Further investigation shows that the error is in virtio_scsi_dataplane_setup: if (!virtio_device_ioeventfd_enabled(vdev)) { error_setg(errp, "ioeventfd is required for iothread"); return; } call flow is: virtio_device_ioeventfd_enabled-->virtio_bus_ioeventfd_enabled -->k->ioeventfd_enabled-->virtio_pci_ioeventfd_enabled virtio_pci_ioeventfd_enabled checks flag VIRTIO_PCI_FLAG_USE_IOEVENTFD which was cleared in virtio_pci_realize if this patch isn't applied. Yes, we know all of this. However, this patch is not correct and causes 'make check' failures on some platforms. The open question is where that failure comes from. Before this is solved, the patch can't be applied. Thanks Kevin. Maybe I am luck, I didn't encounter the failure when running 'make check' with this patch applied. thanks Kevin -- Regards QingFeng Hao
Re: [Qemu-devel] [Qemu-block] [PULL 11/61] virtio-pci: use ioeventfd even when KVM is disabled
在 2017/6/24 0:21, Kevin Wolf 写道: From: Stefan Hajnoczi Old kvm.ko versions only supported a tiny number of ioeventfds so virtio-pci avoids ioeventfds when kvm_has_many_ioeventfds() returns 0. Do not check kvm_has_many_ioeventfds() when KVM is disabled since it always returns 0. Since commit 8c56c1a592b5092d91da8d8943c1d6462a6f ("memory: emulate ioeventfd") it has been possible to use ioeventfds in qtest or TCG mode. This patch makes -device virtio-blk-pci,iothread=iothread0 work even when KVM is disabled. I have tested that virtio-blk-pci works under TCG both with and without iothread. Cc: Michael S. Tsirkin Signed-off-by: Stefan Hajnoczi Reviewed-by: Michael S. Tsirkin Signed-off-by: Kevin Wolf --- hw/virtio/virtio-pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 20d6a08..301920e 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1740,7 +1740,7 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp) bool pcie_port = pci_bus_is_express(pci_dev->bus) && !pci_bus_is_root(pci_dev->bus); -if (!kvm_has_many_ioeventfds()) { +if (kvm_enabled() && !kvm_has_many_ioeventfds()) { proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD; } This response is actually for mail thread "Re: [Qemu-devel] [PATCH 1/5] virtio-pci: use ioeventfd even when KVM is disabled" which I didn't receive, sorry. I also saw the failed case of 068 as Fam due to the same cause on s390x and x86. With this patch applied, no failure found. Further investigation shows that the error is in virtio_scsi_dataplane_setup: if (!virtio_device_ioeventfd_enabled(vdev)) { error_setg(errp, "ioeventfd is required for iothread"); return; } call flow is: virtio_device_ioeventfd_enabled-->virtio_bus_ioeventfd_enabled -->k->ioeventfd_enabled-->virtio_pci_ioeventfd_enabled virtio_pci_ioeventfd_enabled checks flag VIRTIO_PCI_FLAG_USE_IOEVENTFD which was cleared in virtio_pci_realize if this patch isn't applied. Thanks! -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2 1/1] qemu/migration: fix the double free problem on from_src_file
在 2017/6/7 20:18, Dr. David Alan Gilbert 写道: * QingFeng Hao (ha...@linux.vnet.ibm.com) wrote: 在 2017/6/6 20:49, Kevin Wolf 写道: Am 06.06.2017 um 07:24 hat QingFeng Hao geschrieben: I can't tell for postcopy_ram_listen_thread() - commit 660819b didn't seem to remove a qemu_fclose() call there, but I can't see one left behind either. Was the file leaked before commit 660819b or am I missing something? I don't think so because loadvm_postcopy_handle_listen creates thread postcopy_ram_listen_thread and passes mis->from_src_file as its arg, which will be closed by migration_incoming_state_destroy. What confuses me is in the series function calls of qemu_loadvm_state_main etc, argument f looks to be redundant as mis already contains from_src_file which equals to f. In postcopy qemu_loadvm_state_main is called with two different file arguments but the same mis argument; see loadvm_handle_cmd_packaged for the other case where it's called on a packaged-file blob. yes, you are right, I missed that one. :) Furthermore, mis may be also redundant as it can be got via migration_incoming_get_current. Thanks! We keep changing our minds about the preferred style. Sometimes we think it's best to pass the pointer, sometimes we think it's best to call get_current. Got it. Thanks! Dave Kevin -- Regards QingFeng Hao -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v2 1/1] qemu/migration: fix the double free problem on from_src_file
在 2017/6/6 20:49, Kevin Wolf 写道: Am 06.06.2017 um 07:24 hat QingFeng Hao geschrieben: In load_snapshot, mis->from_src_file is freed twice, the first free is by qemu_fclose, the second is by migration_incoming_state_destroy and it causes Illegal instruction exception. The fix is just to remove the first free. This problem is found by qemu-iotests case 068 since commit "660819b migration: shut src return path unconditionally". The error is: 068 1s ... - output mismatch (see 068.out.bad) --- tests/qemu-iotests/068.out 2017-05-06 01:00:26.417270437 +0200 +++ 068.out.bad2017-06-03 13:59:55.360274640 +0200 @@ -6,6 +6,8 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 (qemu) quit +./common.config: line 107: 242472 Illegal instruction (core dumped) ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information -(qemu) quit -*** done +(qemu) *** done Signed-off-by: QingFeng Hao Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu Dave, as you only gave R-b rather than merging the patch, should this be merged through the block tree? diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f59d0..853e14e34e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2290,7 +2290,6 @@ int load_snapshot(const char *name, Error **errp) aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); -qemu_fclose(f); aio_context_release(aio_context); migration_incoming_state_destroy(); Did we check other callers of migration_incoming_state_destroy()? For example, qmp_xen_load_devices_state() looks suspicious, too. Good reminder! Yes, I checked it and there is no assignment of from_src_file there and f is opened locally, so I think that qemu_fclose doesn't impact migration_incoming_state_destroy. migration_incoming_state_destroy is called in 4 places: process_incoming_migration_bh, postcopy_ram_listen_thread, qmp_xen_load_devices_state and load_snapshot. process_incoming_migration_bh is launched by process_incoming_migration_co whose qemu_fclose is removed by commit 660819b. For postcopy_ram_listen_thread, I didn't see where it calls qemu_fclose. Actually to simplify the check for the problem, I just searched where from_src_file is assigned to and got 2 places: process_incoming_migration_co and load_snapshot. qemu_fclose in the first function is removed by commit 660819b, and qemu_fclose in the second is removed by this one. I think a potential risk might be opaque is closed by anywhere else than process_incoming_migration_co, but there is legacy qemu_close before commit 660819b, so the risk might be low? thanks :) I can't tell for postcopy_ram_listen_thread() - commit 660819b didn't seem to remove a qemu_fclose() call there, but I can't see one left behind either. Was the file leaked before commit 660819b or am I missing something? I don't think so because loadvm_postcopy_handle_listen creates thread postcopy_ram_listen_thread and passes mis->from_src_file as its arg, which will be closed by migration_incoming_state_destroy. What confuses me is in the series function calls of qemu_loadvm_state_main etc, argument f looks to be redundant as mis already contains from_src_file which equals to f. Furthermore, mis may be also redundant as it can be got via migration_incoming_get_current. Thanks! Kevin -- Regards QingFeng Hao
[Qemu-devel] [PATCH v2 0/1] qemu/migration: fix the migration bug found by qemu-iotests case 068
Hi all, This patch is to fix the migration bug found by qemu-iotests case 068 and based on upstream master's commit: 199e19ee53: Merge remote-tracking branch 'remotes/mjt/tags/trivial-patches-fetch' into staging. The bug was introduced by commit "660819b migration: shut src return path unconditionally". Change Log(v2): Got reviewed-by from Dr. David Alan Gilbert and Peter Xu. Thanks! QingFeng Hao (1): qemu/migration: fix the double free problem on from_src_file migration/savevm.c | 1 - 1 file changed, 1 deletion(-) -- 2.11.2
[Qemu-devel] [PATCH v2 1/1] qemu/migration: fix the double free problem on from_src_file
In load_snapshot, mis->from_src_file is freed twice, the first free is by qemu_fclose, the second is by migration_incoming_state_destroy and it causes Illegal instruction exception. The fix is just to remove the first free. This problem is found by qemu-iotests case 068 since commit "660819b migration: shut src return path unconditionally". The error is: 068 1s ... - output mismatch (see 068.out.bad) --- tests/qemu-iotests/068.out 2017-05-06 01:00:26.417270437 +0200 +++ 068.out.bad 2017-06-03 13:59:55.360274640 +0200 @@ -6,6 +6,8 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 (qemu) quit +./common.config: line 107: 242472 Illegal instruction (core dumped) ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information -(qemu) quit -*** done +(qemu) *** done Signed-off-by: QingFeng Hao Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu --- migration/savevm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f59d0..853e14e34e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2290,7 +2290,6 @@ int load_snapshot(const char *name, Error **errp) aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); -qemu_fclose(f); aio_context_release(aio_context); migration_incoming_state_destroy(); -- 2.11.2
Re: [Qemu-devel] [PATCH v1 1/1] qemu/migration: fix the double free problem on from_src_file
在 2017/6/6 11:50, Peter Xu 写道: On Tue, Jun 06, 2017 at 11:38:05AM +0800, QingFeng Hao wrote: 在 2017/6/6 11:03, Peter Xu 写道: On Mon, Jun 05, 2017 at 12:48:51PM +0200, QingFeng Hao wrote: In load_vmstate, mis->from_src_file is freed twice, the first free is by qemu_fclose, the second is by migration_incoming_state_destroy and it causes Illegal instruction exception. The fix is just to remove the first free. This problem is found by qemu-iotests case 068 since commit "660819b migration: shut src return path unconditionally". The error is: 068 1s ... - output mismatch (see 068.out.bad) --- tests/qemu-iotests/068.out 2017-05-06 01:00:26.417270437 +0200 +++ 068.out.bad2017-06-03 13:59:55.360274640 +0200 @@ -6,6 +6,8 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 (qemu) quit +./common.config: line 107: 242472 Illegal instruction (core dumped) ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information -(qemu) quit -*** done +(qemu) *** done Signed-off-by: QingFeng Hao --- migration/savevm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f59d0..853e14e34e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2290,7 +2290,6 @@ int load_snapshot(const char *name, Error **errp) aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); -qemu_fclose(f); aio_context_release(aio_context); migration_incoming_state_destroy(); Thanks QingFeng for the fix! Reviewed-by: Peter Xu Though here instead of removing the fclose(), not sure whether this is nicer: diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f5..1feb519 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2233,7 +2233,6 @@ int load_snapshot(const char *name, Error **errp) QEMUFile *f; int ret; AioContext *aio_context; -MigrationIncomingState *mis = migration_incoming_get_current(); if (!bdrv_all_can_snapshot(&bs)) { error_setg(errp, @@ -2286,7 +2285,6 @@ int load_snapshot(const char *name, Error **errp) } qemu_system_reset(SHUTDOWN_CAUSE_NONE); -mis->from_src_file = f; aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); Thanks Peter. I have a doubt on this change because I see there are several places referencing from_src_file e.g. loadvm_postcopy_ram_handle_discard, and it seems to get byte from the file and it's called by qemu_loadvm_state. Anyway, you remind me for the description that is "In load_snapshot" rather than "In load_vmstate". thanks Oh I didn't really notice that. :) It shouldn't affect imho since load snapshot won't trigger postcopy codes. But sure current fix is good enough for me at least. Ok, thanks! Thanks, -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v1 1/1] qemu/migration: fix the double free problem on from_src_file
在 2017/6/6 11:03, Peter Xu 写道: On Mon, Jun 05, 2017 at 12:48:51PM +0200, QingFeng Hao wrote: In load_vmstate, mis->from_src_file is freed twice, the first free is by qemu_fclose, the second is by migration_incoming_state_destroy and it causes Illegal instruction exception. The fix is just to remove the first free. This problem is found by qemu-iotests case 068 since commit "660819b migration: shut src return path unconditionally". The error is: 068 1s ... - output mismatch (see 068.out.bad) --- tests/qemu-iotests/068.out 2017-05-06 01:00:26.417270437 +0200 +++ 068.out.bad2017-06-03 13:59:55.360274640 +0200 @@ -6,6 +6,8 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 (qemu) quit +./common.config: line 107: 242472 Illegal instruction (core dumped) ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information -(qemu) quit -*** done +(qemu) *** done Signed-off-by: QingFeng Hao --- migration/savevm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f59d0..853e14e34e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2290,7 +2290,6 @@ int load_snapshot(const char *name, Error **errp) aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); -qemu_fclose(f); aio_context_release(aio_context); migration_incoming_state_destroy(); Thanks QingFeng for the fix! Reviewed-by: Peter Xu Though here instead of removing the fclose(), not sure whether this is nicer: diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f5..1feb519 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2233,7 +2233,6 @@ int load_snapshot(const char *name, Error **errp) QEMUFile *f; int ret; AioContext *aio_context; -MigrationIncomingState *mis = migration_incoming_get_current(); if (!bdrv_all_can_snapshot(&bs)) { error_setg(errp, @@ -2286,7 +2285,6 @@ int load_snapshot(const char *name, Error **errp) } qemu_system_reset(SHUTDOWN_CAUSE_NONE); -mis->from_src_file = f; aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); Thanks Peter. I have a doubt on this change because I see there are several places referencing from_src_file e.g. loadvm_postcopy_ram_handle_discard, and it seems to get byte from the file and it's called by qemu_loadvm_state. Anyway, you remind me for the description that is "In load_snapshot" rather than "In load_vmstate". thanks Since I see we setup from_src_file but we don't really use it. If we remove that line, we can also remove the migration_incoming_get_current() call altogether. Either way work for me. So my r-b stands always. :-) -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v1 1/1] qemu/migration: fix the double free problem on from_src_file
在 2017/6/5 19:08, Dr. David Alan Gilbert 写道: * QingFeng Hao (ha...@linux.vnet.ibm.com) wrote: In load_vmstate, mis->from_src_file is freed twice, the first free is by qemu_fclose, the second is by migration_incoming_state_destroy and it causes Illegal instruction exception. The fix is just to remove the first free. This problem is found by qemu-iotests case 068 since commit "660819b migration: shut src return path unconditionally". The error is: 068 1s ... - output mismatch (see 068.out.bad) --- tests/qemu-iotests/068.out 2017-05-06 01:00:26.417270437 +0200 +++ 068.out.bad2017-06-03 13:59:55.360274640 +0200 @@ -6,6 +6,8 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 (qemu) quit +./common.config: line 107: 242472 Illegal instruction (core dumped) ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information -(qemu) quit -*** done +(qemu) *** done Signed-off-by: QingFeng Hao --- migration/savevm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f59d0..853e14e34e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2290,7 +2290,6 @@ int load_snapshot(const char *name, Error **errp) aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); -qemu_fclose(f); aio_context_release(aio_context); Thanks! Reviewed-by: Dr. David Alan Gilbert Thanks David! migration_incoming_state_destroy(); -- 2.11.2 -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK -- Regards QingFeng Hao
[Qemu-devel] [PATCH v1 1/1] qemu/migration: fix the double free problem on from_src_file
In load_vmstate, mis->from_src_file is freed twice, the first free is by qemu_fclose, the second is by migration_incoming_state_destroy and it causes Illegal instruction exception. The fix is just to remove the first free. This problem is found by qemu-iotests case 068 since commit "660819b migration: shut src return path unconditionally". The error is: 068 1s ... - output mismatch (see 068.out.bad) --- tests/qemu-iotests/068.out 2017-05-06 01:00:26.417270437 +0200 +++ 068.out.bad 2017-06-03 13:59:55.360274640 +0200 @@ -6,6 +6,8 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 (qemu) quit +./common.config: line 107: 242472 Illegal instruction (core dumped) ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information -(qemu) quit -*** done +(qemu) *** done Signed-off-by: QingFeng Hao --- migration/savevm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/migration/savevm.c b/migration/savevm.c index 9c320f59d0..853e14e34e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2290,7 +2290,6 @@ int load_snapshot(const char *name, Error **errp) aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); -qemu_fclose(f); aio_context_release(aio_context); migration_incoming_state_destroy(); -- 2.11.2
[Qemu-devel] [PATCH v1 0/1] qemu/migration: fix the migration bug found by qemu-iotests case 068
Hi all, This patch is to fix the migration bug found by qemu-iotests case 068 and based on upstream master's commit: cb8b8ef4578: Merge remote-tracking branch 'remotes/elmarco/tags/chrfe-pull-request' into staging. The bug was introduced by commit "660819b migration: shut src return path unconditionally". Thanks! QingFeng Hao (1): qemu/migration: fix the double free problem on from_src_file migration/savevm.c | 1 - 1 file changed, 1 deletion(-) -- 2.11.2
Re: [Qemu-devel] [PATCH v1 1/1] vmstate: fix failed iotests case 68 and 91
在 2017/3/16 16:01, Juan Quintela 写道: QingFeng Hao wrote: This problem affects s390x only if we are running without KVM. Basically, S390CPU.irqstate is unused if we do not use KVM, and thus no buffer is allocated. This causes size=0, first_elem=NULL and n_elems=1 in vmstate_load_state and vmstate_save_state. And the assert fails. With this fix we can go back to the old behavior and support VMS_VBUFFER with size 0 and nullptr. Signed-off-by: QingFeng Hao Signed-off-by: Halil Pasic queued Thanks! -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH v1 1/1] vmstate: fix failed iotests case 68 and 91
在 2017/3/14 22:13, Dr. David Alan Gilbert 写道: * QingFeng Hao (ha...@linux.vnet.ibm.com) wrote: This problem affects s390x only if we are running without KVM. Basically, S390CPU.irqstate is unused if we do not use KVM, and thus no buffer is allocated. This causes size=0, first_elem=NULL and n_elems=1 in vmstate_load_state and vmstate_save_state. And the assert fails. With this fix we can go back to the old behavior and support VMS_VBUFFER with size 0 and nullptr. Signed-off-by: QingFeng Hao Signed-off-by: Halil Pasic Thanks, and fixes problem with vmxnet3 migration. Reviewed-by: Dr. David Alan Gilbert Thank you, Dave! Dave --- migration/vmstate.c | 8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/migration/vmstate.c b/migration/vmstate.c index 78b3cd4..7b4a607 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -109,7 +109,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, vmstate_handle_alloc(first_elem, field, opaque); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; -assert(first_elem || !n_elems); +assert(first_elem || !n_elems || !size); } for (i = 0; i < n_elems; i++) { void *curr_elem = first_elem + size * i; @@ -117,7 +117,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, if (field->flags & VMS_ARRAY_OF_POINTER) { curr_elem = *(void **)curr_elem; } -if (!curr_elem) { +if (!curr_elem && size) { /* if null pointer check placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); ret = vmstate_info_nullptr.get(f, curr_elem, size, NULL); @@ -325,7 +325,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; -assert(first_elem || !n_elems); +assert(first_elem || !n_elems || !size); } for (i = 0; i < n_elems; i++) { void *curr_elem = first_elem + size * i; @@ -336,7 +336,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, assert(curr_elem); curr_elem = *(void **)curr_elem; } -if (!curr_elem) { +if (!curr_elem && size) { /* if null pointer write placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); vmstate_info_nullptr.put(f, curr_elem, size, NULL, NULL); -- 1.8.3.1 -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK -- Regards QingFeng Hao
[Qemu-devel] [PATCH v1 0/1] vmstate: fix failed iotests case 68 and 91
Hi All, This patch is to fix the failed iotests case 68 and 91 and has been tested. It's based on commit dd4d2578215 "Merge remote-tracking branch 'remotes/kraxel/tags/pull-fixes-20170309-1' into staging" and according to Halil and Dave's comments. Also thanks for Fam and Kevin. QingFeng Hao (1): vmstate: fix failed iotests case 68 and 91 migration/vmstate.c | 8 1 file changed, 4 insertions(+), 4 deletions(-) -- 1.8.3.1
[Qemu-devel] [PATCH v1 1/1] vmstate: fix failed iotests case 68 and 91
This problem affects s390x only if we are running without KVM. Basically, S390CPU.irqstate is unused if we do not use KVM, and thus no buffer is allocated. This causes size=0, first_elem=NULL and n_elems=1 in vmstate_load_state and vmstate_save_state. And the assert fails. With this fix we can go back to the old behavior and support VMS_VBUFFER with size 0 and nullptr. Signed-off-by: QingFeng Hao Signed-off-by: Halil Pasic --- migration/vmstate.c | 8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/migration/vmstate.c b/migration/vmstate.c index 78b3cd4..7b4a607 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -109,7 +109,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, vmstate_handle_alloc(first_elem, field, opaque); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; -assert(first_elem || !n_elems); +assert(first_elem || !n_elems || !size); } for (i = 0; i < n_elems; i++) { void *curr_elem = first_elem + size * i; @@ -117,7 +117,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, if (field->flags & VMS_ARRAY_OF_POINTER) { curr_elem = *(void **)curr_elem; } -if (!curr_elem) { +if (!curr_elem && size) { /* if null pointer check placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); ret = vmstate_info_nullptr.get(f, curr_elem, size, NULL); @@ -325,7 +325,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; -assert(first_elem || !n_elems); +assert(first_elem || !n_elems || !size); } for (i = 0; i < n_elems; i++) { void *curr_elem = first_elem + size * i; @@ -336,7 +336,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, assert(curr_elem); curr_elem = *(void **)curr_elem; } -if (!curr_elem) { +if (!curr_elem && size) { /* if null pointer write placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); vmstate_info_nullptr.put(f, curr_elem, size, NULL, NULL); -- 1.8.3.1
Re: [Qemu-devel] [PATCH RFC 1/1] vmstate: draft fix for failed iotests case 68 and 91
在 2017/3/9 19:45, Halil Pasic 写道: On 03/09/2017 03:55 AM, QingFeng Hao wrote: 在 2017/3/8 19:33, Halil Pasic 写道: On 03/08/2017 08:05 AM, QingFeng Hao wrote: 在 2017/3/7 18:19, Halil Pasic 写道: On 03/07/2017 11:05 AM, Kevin Wolf wrote: Am 07.03.2017 um 10:54 hat Halil Pasic geschrieben: On 03/07/2017 10:29 AM, Kevin Wolf wrote: Am 07.03.2017 um 03:53 hat QingFeng Hao geschrieben: [..] The question is: can we do that change and what the second assert of field's flags is used for? The assert is there to guard against unintended use of this nullptr-marker mechanism. I have tested so this should work. By the way a vmstate test covering this corner-case would be a good idea too (IMHO). Would you like to write one? Sorry, I don't know how to write that test case. Can you please write one? thanks! The test is just nice to have, but we definitely need the fix! Ok, I'll send out the discussed fix patch. Halil -- Regards QingFeng Hao
Re: [Qemu-devel] [PATCH RFC 1/1] vmstate: draft fix for failed iotests case 68 and 91
在 2017/3/8 19:33, Halil Pasic 写道: On 03/08/2017 08:05 AM, QingFeng Hao wrote: 在 2017/3/7 18:19, Halil Pasic 写道: On 03/07/2017 11:05 AM, Kevin Wolf wrote: Am 07.03.2017 um 10:54 hat Halil Pasic geschrieben: On 03/07/2017 10:29 AM, Kevin Wolf wrote: Am 07.03.2017 um 03:53 hat QingFeng Hao geschrieben: I am not very clear about the logic in vmstate.c, but from its context in vmstate_save_state, it seems size should not be 0, otherwise the followed for loop will keep working on the same element. So I just add a simple check to pass that case, not sure if it's right but it can pass iotest case 68 and 91 now. The iotest's failed output is: 068 1s ... - output mismatch (see 068.out.bad) --- /home/haoqf/KVMonz/gitcheck/work/qemu-master/tree/qemu/tests/qemu-iotests/068.out 2017-03-06 05:52:24.817328899 +0100 +++ 068.out.bad 2017-03-07 03:28:44.426714519 +0100 @@ -3,9 +3,13 @@ === Saving and reloading a VM state to/from a qcow2 image === Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 +qemu-system-s390x: migration/vmstate.c:336: vmstate_save_state: Assertion `first_elem || !n_elems' failed. +./common.config: line 109: 52497 Aborted ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) Signed-off-by: QingFeng Hao --- migration/vmstate.c | 8 1 file changed, 8 insertions(+) diff --git a/migration/vmstate.c b/migration/vmstate.c index 78b3cd4..ff28dde 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -106,6 +106,10 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, int i, n_elems = vmstate_n_elems(opaque, field); int size = vmstate_size(opaque, field); +if (size == 0) { +field++; +continue; +} vmstate_handle_alloc(first_elem, field, opaque); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; @@ -322,6 +326,10 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, int64_t old_offset, written_bytes; QJSON *vmdesc_loop = vmdesc; +if (size == 0) { +field++; +continue; +} trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; This is really a live migration fix, so I'm adding Juan and Dave to CC. You are right, this is migration stuff and has very little to do with qemu-block. I suspect the real question is why a field with size 0 was even stored in the vmstate to begin with. I have looked onto the issue. It affects s390x only if we are running without KVM. Basically, S390CPU.irqstate is unused if we do not use KVM, and thus no buffer is allocated. IMHO this is a missing field and the cleaner way to handle such missing fields is exist. However this used to work, and I recommended QuiFeng Hao to discuss the problem upstream. By the way, I think, if we want to go back to the old behavior and support VMS_VBUFFER with size 0 and nullptr, a much cleaner way to do the fix is to change the assert to: assert(first_elem || !n_elems || !size) Obviously the other clean way to fix is to implement exists. If you're right that this specific vmstate was valid in earlier versions, then I think it's clear that we need to make it work again. Otherwise we're breaking migration from old versions. Not really. We would not break migration because nothing was written to the stream for VMS_VBUFFER of size 0 except the vmdesc which is at the end, 'debug only', and does not affect migration compatibility. IMHO it is an API question. I would have said, there is no data, therefore there is no field if it's from scratch. But with prior history, I agree with Dave, we should restore old behavior -- which was changed unintentionally because I made a wrong assumption. Halil, Unfortunately, another assert failed after I change the code as below in vmstate_save_state and vmstate_load_state: assert(first_elem || !n_elems || !size); The error is: +qemu-system-s390x: migration/vmstate.c:341: vmstate_save_state: Assertion `field->flags & VMS_ARRAY_OF_POINTER' failed. It's the code as below: if (!curr_elem) { Sorry, I failed to mention this yesterday. You should also do - if (!curr_elem) { + if (!curr_elem && size) { yes, this works per my test! /* if null pointer write placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); After debug, I found that the assert failure was still of irqstate and its fiel
Re: [Qemu-devel] [PATCH RFC 1/1] vmstate: draft fix for failed iotests case 68 and 91
在 2017/3/7 18:19, Halil Pasic 写道: On 03/07/2017 11:05 AM, Kevin Wolf wrote: Am 07.03.2017 um 10:54 hat Halil Pasic geschrieben: On 03/07/2017 10:29 AM, Kevin Wolf wrote: Am 07.03.2017 um 03:53 hat QingFeng Hao geschrieben: I am not very clear about the logic in vmstate.c, but from its context in vmstate_save_state, it seems size should not be 0, otherwise the followed for loop will keep working on the same element. So I just add a simple check to pass that case, not sure if it's right but it can pass iotest case 68 and 91 now. The iotest's failed output is: 068 1s ... - output mismatch (see 068.out.bad) --- /home/haoqf/KVMonz/gitcheck/work/qemu-master/tree/qemu/tests/qemu-iotests/068.out 2017-03-06 05:52:24.817328899 +0100 +++ 068.out.bad 2017-03-07 03:28:44.426714519 +0100 @@ -3,9 +3,13 @@ === Saving and reloading a VM state to/from a qcow2 image === Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 +qemu-system-s390x: migration/vmstate.c:336: vmstate_save_state: Assertion `first_elem || !n_elems' failed. +./common.config: line 109: 52497 Aborted ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) Signed-off-by: QingFeng Hao --- migration/vmstate.c | 8 1 file changed, 8 insertions(+) diff --git a/migration/vmstate.c b/migration/vmstate.c index 78b3cd4..ff28dde 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -106,6 +106,10 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, int i, n_elems = vmstate_n_elems(opaque, field); int size = vmstate_size(opaque, field); +if (size == 0) { +field++; +continue; +} vmstate_handle_alloc(first_elem, field, opaque); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; @@ -322,6 +326,10 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, int64_t old_offset, written_bytes; QJSON *vmdesc_loop = vmdesc; +if (size == 0) { +field++; +continue; +} trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; This is really a live migration fix, so I'm adding Juan and Dave to CC. You are right, this is migration stuff and has very little to do with qemu-block. I suspect the real question is why a field with size 0 was even stored in the vmstate to begin with. I have looked onto the issue. It affects s390x only if we are running without KVM. Basically, S390CPU.irqstate is unused if we do not use KVM, and thus no buffer is allocated. IMHO this is a missing field and the cleaner way to handle such missing fields is exist. However this used to work, and I recommended QuiFeng Hao to discuss the problem upstream. By the way, I think, if we want to go back to the old behavior and support VMS_VBUFFER with size 0 and nullptr, a much cleaner way to do the fix is to change the assert to: assert(first_elem || !n_elems || !size) Obviously the other clean way to fix is to implement exists. If you're right that this specific vmstate was valid in earlier versions, then I think it's clear that we need to make it work again. Otherwise we're breaking migration from old versions. Not really. We would not break migration because nothing was written to the stream for VMS_VBUFFER of size 0 except the vmdesc which is at the end, 'debug only', and does not affect migration compatibility. IMHO it is an API question. I would have said, there is no data, therefore there is no field if it's from scratch. But with prior history, I agree with Dave, we should restore old behavior -- which was changed unintentionally because I made a wrong assumption. Halil, Unfortunately, another assert failed after I change the code as below in vmstate_save_state and vmstate_load_state: assert(first_elem || !n_elems || !size); The error is: +qemu-system-s390x: migration/vmstate.c:341: vmstate_save_state: Assertion `field->flags & VMS_ARRAY_OF_POINTER' failed. It's the code as below: if (!curr_elem) { /* if null pointer write placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); After debug, I found that the assert failure was still of irqstate and its field flags is 0x102(VMS_VBUFFER | VMS_POINTER), while VMS_ARRAY_OF_POINTER is 0x040. The flags's value matches Dave's former assumption on machine.c although machine.c wasn't compiled, which also confuses me. Then I commented out that assert(field->flags & VMS_AR
Re: [Qemu-devel] [PATCH RFC 0/1] vmstate: fix the failed iotests case 68 and 91
在 2017/3/7 14:37, Fam Zheng 写道: On Tue, 03/07 03:53, QingFeng Hao wrote: Hi All, I am not sure if the fix is correct because I am not very clear about the logic in vmstate.c. From my test, once size=0, the iotests case 68 failed due to the assert. So just send this draft patch for your comments! The patch is based on commit 17783ac828a "Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-2.9-20170303' into staging". I cannot reproduce the failure on either 17783ac828a or current head 56b51708e9e. Both passes for me. I wonder where do you get the size=0. The error happens when running "savevm 0" in case 068. It can be manually reproduced by "./check -qcow2 68" or "./s390x-softmmu/qemu-system-s390x -nodefaults \ -machine accel=qtest -no-shutdown -nographic -monitor stdio -serial none \ -hda /home/mc/gitcheck/work/qemu-master/tree/qemu/tests/t.img.bak", then type "savevm 0". t.img.bak is the backup image for t.img generated by 068. I added the print in vmstate_save_state: QJSON *vmdesc_loop = vmdesc; + error_report("haoqf:%s:opaque:%p, offset:%lx, size:%d, field name:%s, vname:%s\n", __FUNCTION__, opaque, field->offset, size, field->name, vmsd->name); And here is the test log: haoqf:vmstate_save_state:opaque:0x2aa5a5715c0, offset:122e1, size:1, field name:env.sigp_order, vname:cpu haoqf:vmstate_size: field size:4, offset:0 haoqf:vmstate_save_state:opaque:0x2aa5a5715c0, offset:12300, size:4, field name:irqstate_saved_size, vname:cpu haoqf:vmstate_size: field size:0, offset:74496 haoqf:vmstate_size: calculated size:0 haoqf:vmstate_save_state:opaque:0x2aa5a5715c0, offset:122f8, size:0, field name:irqstate, vname:cpu haoqf:vmstate_save_state:firstelem:(nil), elements: 1 qemu-system-s390x: ../migration/vmstate.c:336: vmstate_save_state: Assertion `first_elem || !n_elems' failed. Aborted (core dumped) I also did the test for x86 with: "./x86_64-softmmu/qemu-system-x86_64 -nodefaults \ -machine accel=qtest -no-shutdown -nographic -monitor stdio -serial none \ -hda /home/mc/gitcheck/work/qemu-master/tree/qemu/tests/t.img.bak", and then ran "savevm 0", but it didn't core and the size are all non-zero: haoqf:vmstate_save calling vmstate_save_state: haoqf:vmstate_size: field size:4, offset:0 haoqf:vmstate_save_state:opaque:0x2aa13325438, offset:4, size:4, field name:size, vname:globalstate haoqf:vmstate_size: field size:100, offset:0 haoqf:vmstate_save_state:opaque:0x2aa13325438, offset:8, size:100, field name:runstate, vname:globalstate haoqf:vmstate_save:called vmstate_save_state So probably x86 doesn't have this problem. Fam -- Regards QingFeng Hao
[Qemu-devel] [PATCH RFC 0/1] vmstate: fix the failed iotests case 68 and 91
Hi All, I am not sure if the fix is correct because I am not very clear about the logic in vmstate.c. From my test, once size=0, the iotests case 68 failed due to the assert. So just send this draft patch for your comments! The patch is based on commit 17783ac828a "Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-2.9-20170303' into staging". Thanks! QingFeng Hao (1): vmstate: fix the failure of iotests cases 68 and 91 migration/vmstate.c | 8 1 file changed, 8 insertions(+) -- 2.8.4
[Qemu-devel] [PATCH RFC 1/1] vmstate: draft fix for failed iotests case 68 and 91
I am not very clear about the logic in vmstate.c, but from its context in vmstate_save_state, it seems size should not be 0, otherwise the followed for loop will keep working on the same element. So I just add a simple check to pass that case, not sure if it's right but it can pass iotest case 68 and 91 now. The iotest's failed output is: 068 1s ... - output mismatch (see 068.out.bad) --- /home/haoqf/KVMonz/gitcheck/work/qemu-master/tree/qemu/tests/qemu-iotests/068.out 2017-03-06 05:52:24.817328899 +0100 +++ 068.out.bad 2017-03-07 03:28:44.426714519 +0100 @@ -3,9 +3,13 @@ === Saving and reloading a VM state to/from a qcow2 image === Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 +qemu-system-s390x: migration/vmstate.c:336: vmstate_save_state: Assertion `first_elem || !n_elems' failed. +./common.config: line 109: 52497 Aborted ( if [ -n "${QEMU_NEED_PID}" ]; then +echo $BASHPID > "${QEMU_TEST_DIR}/qemu-${_QEMU_HANDLE}.pid"; +fi; exec "$QEMU_PROG" $QEMU_OPTIONS "$@" ) QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm 0 -(qemu) quit +qemu-system-s390x: Device 'virtio0' does not have the requested snapshot '0' QEMU X.Y.Z monitor - type 'help' for more information (qemu) quit *** done 091 1s ... [failed, exit status 1] - output mismatch (see 091.out.bad) --- tests/qemu-iotests/091.out 2016-08-30 12:35:04.207683276 +0200 +++ 091.out.bad 2017-03-06 13:08:03.717135426 +0100 @@ -11,18 +11,23 @@ vm1: qemu-io disk write complete vm1: live migration started -vm1: live migration completed - -=== VM 2: Post-migration, write to disk, verify running === - -vm2: qemu-io disk write complete -vm2: qemu process running successfully -vm2: flush io, and quit -Check image pattern -read 4194304/4194304 bytes at offset 0 -4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -Running 'qemu-img check -r all $TEST_IMG' -No errors were found on the image. -80/16384 = 0.49% allocated, 0.00% fragmented, 0.00% compressed clusters -Image end offset: 5570560 -*** done +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +./common.qemu: line 110: write error: Broken pipe +Timeout waiting for completed on handle 0 Signed-off-by: QingFeng Hao --- migration/vmstate.c | 8 1 file changed, 8 insertions(+) diff --git a/migration/vmstate.c b/migration/vmstate.c index 78b3cd4..ff28dde 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -106,6 +106,10 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, int i, n_elems = vmstate_n_elems(opaque, field); int size = vmstate_size(opaque, field); +if (size == 0) { +field++; +continue; +} vmstate_handle_alloc(first_elem, field, opaque); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; @@ -322,6 +326,10 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, int64_t old_offset, written_bytes; QJSON *vmdesc_loop = vmdesc; +if (size == 0) { +field++; +continue; +} trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; -- 2.8.4
[Qemu-devel] [PATCH v3 1/1] block/vmdk: Fix the endian problem of buf_len and lba
The problem was triggered by qemu-iotests case 055. It failed when it was comparing the compressed vmdk image with original test.img. The cause is that buf_len in vmdk_write_extent wasn't converted to little-endian before it was stored to disk. But later vmdk_read_extent read it and converted it from little-endian to cpu endian. If the cpu is big-endian like s390, the problem will happen and the data length read by vmdk_read_extent will become invalid! The fix is to add the conversion in vmdk_write_extent, meanwhile, repair the endianness problem of lba field which shall also be converted to little-endian before storing to disk. Cc: qemu-sta...@nongnu.org Signed-off-by: QingFeng Hao Signed-off-by: Jing Liu Signed-off-by: Kevin Wolf Reviewed-by: Fam Zheng --- block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index a11c27a..26e5f95 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1354,8 +1354,8 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, goto out; } -data->lba = offset >> BDRV_SECTOR_BITS; -data->size = buf_len; +data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS); +data->size = cpu_to_le32(buf_len); n_bytes = buf_len + sizeof(VmdkGrainMarker); iov = (struct iovec) { -- 2.8.4
[Qemu-devel] [PATCH v3 0/1] qemu: fix the bug reported by qemu-iotests case 055
Hi all, v3 doesn't have code change but got the reviewed-by from Fam Zheng(thanks to Fam). v2 includes changes due to review comments by Kevin Wolf(thanks to Kevin). v3: * Got reviewed-by from Fam Zheng. * Based on master's commit: 6a928d25b6: Update version for v2.8.0-rc4 release v2: * Add endian conversion for lba field in vmdk_write_extent. * Based on master's commit: 00227fefd205: Update version for v2.8.0-rc1 release v1: * Add patch to fix the bug reported by qemu-iotests case 055. Jing Liu and I found the cause was in vmdk and the fix is in the followed patch. Based on master's commit: 00227fefd205: Update version for v2.8.0-rc1 release Upstream master's qemu-iotests case 055 reports the following error: +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument Thanks! QingFeng Hao Cc: qemu-sta...@nongnu.org QingFeng Hao (1): block/vmdk: Fix the endian problem of buf_len and lba block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -- 2.8.4
[Qemu-devel] [PATCH v2 1/1] block/vmdk: Fix the endian problem of buf_len and lba
The problem was triggered by qemu-iotests case 055. It failed when it was comparing the compressed vmdk image with original test.img. The cause is that buf_len in vmdk_write_extent wasn't converted to little-endian before it was stored to disk. But later vmdk_read_extent read it and converted it from little-endian to cpu endian. If the cpu is big-endian like s390, the problem will happen and the data length read by vmdk_read_extent will become invalid! The fix is to add the conversion in vmdk_write_extent, meanwhile, repair the endianness problem of lba field which shall also be converted to little-endian before storing to disk. Cc: qemu-sta...@nongnu.org Signed-off-by: QingFeng Hao Signed-off-by: Jing Liu Signed-off-by: Kevin Wolf --- block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index a11c27a..26e5f95 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1354,8 +1354,8 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, goto out; } -data->lba = offset >> BDRV_SECTOR_BITS; -data->size = buf_len; +data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS); +data->size = cpu_to_le32(buf_len); n_bytes = buf_len + sizeof(VmdkGrainMarker); iov = (struct iovec) { -- 2.8.4
[Qemu-devel] [PATCH v2 0/1] qemu: fix the bug reported by qemu-iotests case 055
Hi all, v2 includes changes due to review comments by Kevin Wolf(thanks to Kevin). v2: * Add endian conversion for lba field in vmdk_write_extent. Based on master's commit: 00227fefd205: Update version for v2.8.0-rc1 release v1: * Add patch to fix the bug reported by qemu-iotests case 055. Jing Liu and I found the cause was in vmdk and the fix is in the followed patch. Based on master's commit: 00227fefd205: Update version for v2.8.0-rc1 release Upstream master's qemu-iotests case 055 reports the following error: +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument Thanks! QingFeng Hao (1): block/vmdk: Fix the endian problem of buf_len and lba block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -- 2.8.4
[Qemu-devel] [PATCH v1 1/1] block/vmdk: Fix the endian problem of buf_len
The problem was triggered by qemu-iotests case 055. It failed when it was comparing the compressed vmdk image with original test.img. The cause is that buf_len in vmdk_write_extent wasn't converted to little-endian before it was stored to disk. But later vmdk_read_extent read it and converted it from little-endian to cpu endian. If the cpu is big-endian like s390, the problem will happen and the data length read by vmdk_read_extent will become invalid! The fix is to add the conversion in vmdk_write_extent. Signed-off-by: QingFeng Hao Signed-off-by: Jing Liu --- block/vmdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/vmdk.c b/block/vmdk.c index a11c27a..bf6667f 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1355,7 +1355,7 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, } data->lba = offset >> BDRV_SECTOR_BITS; -data->size = buf_len; +data->size = cpu_to_le32(buf_len); n_bytes = buf_len + sizeof(VmdkGrainMarker); iov = (struct iovec) { -- 2.8.4
[Qemu-devel] [PATCH v1 0/1] qemu: fix the bug reported by qemu-iotests case 055
Hi all, This patch is to fix the bug reported by qemu-iotests case 055 and based on upstream master's commit: 00227fefd205: Update version for v2.8.0-rc1 release Jing Liu and I found the cause was in vmdk and the fix is in the followed patch. Thanks! Upstream master's qemu-iotests case 055 reports the following error: +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument +qemu-img: Error while reading offset 0 of tests/qemu-iotests/scratch/blockdev-target.img: Invalid argument QingFeng Hao (1): block/vmdk: Fix the endian problem of buf_len block/vmdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.8.4