I'm trying to create a hook that attaches several virtio-scsi disks to a starting vm,

and it seems like the hook enters a deadlock while attempting to do so.

 

Is there any workaround around this? Any better way, forking virsh execution somehow?

 

Could anyone explain why this is creating a deadlock in the first place? Isn't libvirt multithreaded?

 

Thanks for the help!

 

Shlomi

 

### hook script:

 

#!/bin/bash

 

enum_scsi() {

    scsi_devices=`cd /dev;ls sd[^a]*`

}

 

gen_hba_xml() {

    cat > ./hba.xml << EOF

    <controller type='scsi' model='virtio-scsi'/>

EOF

}

 

passthrough_start() {

    # create virtio-scsi HBA

    gen_hba_xml

    virsh attach-device --persistent $domain_name ./hba.xml

    rm -f ./hba.xml

   

    # attache scsi devices to guest 

    enum_scsi

    for sd in ${scsi_devices[@]}

    do

        virsh attach-disk --persistent $domain_name /dev/${sd} ${sd} 

    done

}

 

domain_name=$1

domain_event=$2

 

case $domain_event in

    start)

        passthrough_start

        ;;

    *)

                echo "qemu hook called with unexpected options $*" >&2

        ;;

esac

 

 

### starce libvirt:

 

[root@localhost ~]# strace -f -p 14630

Process 14630 attached with 11 threads - interrupt to quit

[pid 14640] futex(0xc34ebc, FUTEX_WAIT_PRIVATE, 2303, NULL <unfinished ...>

[pid 14638] futex(0xc34ebc, FUTEX_WAIT_PRIVATE, 2303, NULL <unfinished ...>

[pid 14637] futex(0xc34ebc, FUTEX_WAIT_PRIVATE, 2303, NULL <unfinished ...>

[pid 14636] futex(0xc34ebc, FUTEX_WAIT_PRIVATE, 2303, NULL <unfinished ...>

[pid 14635] futex(0x7fcc240ccd80, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>

[pid 14639] futex(0xc34ebc, FUTEX_WAIT_PRIVATE, 2303, NULL <unfinished ...>

[pid 14634] futex(0x7fcc240ccd80, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>

[pid 14631] restart_syscall(<... resuming interrupted call ...> <unfinished ...>

[pid 14633] futex(0x7fcc240ccd80, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>

[pid 14630] restart_syscall(<... resuming interrupted call ...> <unfinished ...>

[pid 14632] futex(0xc34e24, FUTEX_WAIT_PRIVATE, 3091, NULL^C <unfinished ...>

 

 

[pid 14630] poll([{fd=7, events=POLLIN}, {fd=9, events=POLLIN}, {fd=12, events=POLLIN}, {fd=13, events=POLLIN}, {fd=6, events=POLLIN}, {fd=14, events=POLLIN}, {fd=16, events=POLLIN}, {fd=18, events=POLLIN|POLLOUT}, {fd=24, events=POLLIN}], 9, 1927) = 1 ([{fd=18, revents=POLLOUT}])

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] gettid()                    = 14630

[pid 14630] write(18, "\0\0\0\34keep\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\0\0\0\0\0", 28) = 28

 

 

 

### strace bash:

 

[root@localhost ~]# strace -f -p 14783

Process 14783 attached - interrupt to quit

wait4(-1,