summaryrefslogtreecommitdiffstats
path: root/results/classifier/002/boot/60339453
diff options
context:
space:
mode:
authorChristian Krinitsin <mail@krinitsin.com>2025-06-03 12:04:13 +0000
committerChristian Krinitsin <mail@krinitsin.com>2025-06-03 12:04:13 +0000
commit256709d2eb3fd80d768a99964be5caa61effa2a0 (patch)
tree05b2352fba70923126836a64b6a0de43902e976a /results/classifier/002/boot/60339453
parent2ab14fa96a6c5484b5e4ba8337551bb8dcc79cc5 (diff)
downloademulator-bug-study-256709d2eb3fd80d768a99964be5caa61effa2a0.tar.gz
emulator-bug-study-256709d2eb3fd80d768a99964be5caa61effa2a0.zip
add new classifier result
Diffstat (limited to 'results/classifier/002/boot/60339453')
-rw-r--r--results/classifier/002/boot/6033945362
1 files changed, 62 insertions, 0 deletions
diff --git a/results/classifier/002/boot/60339453 b/results/classifier/002/boot/60339453
new file mode 100644
index 00000000..f42e1fe0
--- /dev/null
+++ b/results/classifier/002/boot/60339453
@@ -0,0 +1,62 @@
+boot: 0.782
+other: 0.776
+instruction: 0.713
+mistranslation: 0.699
+semantic: 0.662
+
+[BUG] scsi: vmw_pvscsi: Boot hangs during scsi under qemu, post commit e662502b3a78
+
+Hi,
+
+Commit e662502b3a78 ("scsi: vmw_pvscsi: Set correct residual data length"),
+and its backports to stable trees, makes kernel hang during boot, when
+ran as a VM under qemu with following parameters:
+
+ -drive file=$DISKFILE,if=none,id=sda
+ -device pvscsi
+ -device scsi-hd,bus=scsi.0,drive=sda
+
+Diving deeper, commit e662502b3a78
+
+ @@ -585,7 +585,13 @@ static void pvscsi_complete_request(struct
+pvscsi_adapter *adapter,
+ case BTSTAT_SUCCESS:
+ + /*
+ + * Commands like INQUIRY may transfer less data than
+ + * requested by the initiator via bufflen. Set residual
+ + * count to make upper layer aware of the actual amount
+ + * of data returned.
+ + */
+ + scsi_set_resid(cmd, scsi_bufflen(cmd) - e->dataLen);
+
+assumes 'e->dataLen' is properly armed with actual num of bytes
+transferred; alas qemu's hw/scsi/vmw_pvscsi.c never arms the 'dataLen'
+field of the completion descriptor (kept zero).
+
+As a result, the residual count is set as the *entire* 'scsi_bufflen' of a
+good transfer, which makes upper scsi layers repeatedly ignore this
+valid transfer.
+
+Not properly arming 'dataLen' seems as an oversight in qemu, which needs
+to be fixed.
+
+However, since kernels with commit e662502b3a78 (and backports) now fail
+to boot under qemu's "-device pvscsi", a suggested workaround is to set
+the residual count *only* if 'e->dataLen' is armed, e.g:
+
+ @@ -588,7 +588,8 @@ static void pvscsi_complete_request(struct pvscsi_adapter
+*adapter,
+ * count to make upper layer aware of the actual
+amount
+ * of data returned.
+ */
+ - scsi_set_resid(cmd, scsi_bufflen(cmd) - e->dataLen);
+ + if (e->dataLen)
+ + scsi_set_resid(cmd, scsi_bufflen(cmd) -
+e->dataLen);
+
+in order to make kernels boot on old qemu binaries.
+
+Best,
+Shmulik
+