On 11/11/19 7:57 AM, Jan Kiszka wrote: > To get the ball rolling after my presentation of the topic at KVM Forum > [1] and many fruitful discussions around it, this is a first concrete > code series. As discussed, I'm starting with the IVSHMEM implementation > of a QEMU device and server. It's RFC because, besides specification and > implementation details, there will still be some decisions needed about > how to integrate the new version best into the existing code bases. > > If you want to play with this, the basic setup of the shared memory > device is described in patch 1 and 3. UIO driver and also the > virtio-ivshmem prototype can be found at > > http://git.kiszka.org/?p=linux.git;a=shortlog;h=refs/heads/queues/ivshmem2 > > Accessing the device via UIO is trivial enough. If you want to use it > for virtio, this is additionally to the description in patch 3 needed on > the virtio console backend side: > > modprobe uio_ivshmem > echo "1af4 1110 1af4 1100 ffc003 ffffff" > > /sys/bus/pci/drivers/uio_ivshmem/new_id > linux/tools/virtio/virtio-ivshmem-console /dev/uio0 > > And for virtio block: > > echo "1af4 1110 1af4 1100 ffc002 ffffff" > > /sys/bus/pci/drivers/uio_ivshmem/new_id > linux/tools/virtio/virtio-ivshmem-console /dev/uio0 /path/to/disk.img > > After that, you can start the QEMU frontend instance with the > virtio-ivshmem driver installed which can use the new /dev/hvc* or > /dev/vda* as usual. > > Any feedback welcome!
Hi, Jan, I have been playing your code for last few weeks, mostly study and test, of course. Really nice work. I have a few questions here: First, qemu part looks good, I tried test between couple VMs, and device could pop up correctly for all of them, but I had some problems when trying load driver. For example, if set up two VMs, vm1 and vm2, start ivshmem server as you suggested. vm1 could load uio_ivshmem and virtio_ivshmem correctly, vm2 could load uio_ivshmem but could not show up "/dev/uio0", virtio_ivshmem could not be loaded at all, these still exist even I switch the load sequence of vm1 and vm2, and sometimes reset "virtio_ivshmem" could crash both vm1 and vm2. Not quite sure this is bug or "Ivshmem Mode" issue, but I went through ivshmem-server code, did not related information. I started some code work recently, such as fix code style issues and some work based on above testing, however I know you are also working on RFC V2, beside the protocol between server-client and client-client is not finalized yet either, things may change, so much appreciate if you could squeeze me into your develop schedule and share with me some plans, :-) Maybe I could send some pull request in your github repo? I personally like this project a lot, there would be a lot of potential and user case for it, especially some devices like ivshmem-net/ivshmem-block. Anyway, thanks for adding me to the list, and looking forward to your reply. Best, Liang > > Jan > > PS: Let me know if I missed someone potentially interested in this topic > on CC - or if you would like to be dropped from the list. > > PPS: The Jailhouse queues are currently out of sync /wrt minor details > of this one, primarily the device ID. Will update them when the general > direction is clear. > > [1] https://kvmforum2019.sched.com/event/TmxI > > Jan Kiszka (3): > hw/misc: Add implementation of ivshmem revision 2 device > docs/specs: Add specification of ivshmem device revision 2 > contrib: Add server for ivshmem revision 2 > > Makefile | 3 + > Makefile.objs | 1 + > configure | 1 + > contrib/ivshmem2-server/Makefile.objs | 1 + > contrib/ivshmem2-server/ivshmem2-server.c | 462 ++++++++++++ > contrib/ivshmem2-server/ivshmem2-server.h | 158 +++++ > contrib/ivshmem2-server/main.c | 313 +++++++++ > docs/specs/ivshmem-2-device-spec.md | 333 +++++++++ > hw/misc/Makefile.objs | 2 +- > hw/misc/ivshmem2.c | 1091 > +++++++++++++++++++++++++++++ > include/hw/misc/ivshmem2.h | 48 ++ > 11 files changed, 2412 insertions(+), 1 deletion(-) > create mode 100644 contrib/ivshmem2-server/Makefile.objs > create mode 100644 contrib/ivshmem2-server/ivshmem2-server.c > create mode 100644 contrib/ivshmem2-server/ivshmem2-server.h > create mode 100644 contrib/ivshmem2-server/main.c > create mode 100644 docs/specs/ivshmem-2-device-spec.md > create mode 100644 hw/misc/ivshmem2.c > create mode 100644 include/hw/misc/ivshmem2.h >