summary refs log tree commit diff stats
path: root/results/classifier/zero-shot/015/peripherals/60339453
blob: a0503d6c5516dd2a76dda61e7c121e3d03afef01 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
peripherals: 0.824
kernel: 0.805
register: 0.787
boot: 0.782
arm: 0.780
performance: 0.764
permissions: 0.750
TCG: 0.748
alpha: 0.718
VMM: 0.712
risc-v: 0.707
device: 0.706
mistranslation: 0.699
hypervisor: 0.697
PID: 0.685
network: 0.682
vnc: 0.680
debug: 0.672
graphic: 0.671
operating system: 0.670
KVM: 0.669
user-level: 0.663
semantic: 0.662
architecture: 0.649
x86: 0.647
virtual: 0.630
files: 0.623
ppc: 0.615
socket: 0.607
i386: 0.533
assembly: 0.486

[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