Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Convert markdown to normal doc

...

Running

...

two

...

virtio-sound

...

devices

...

on

...

top

...

of

...

virtio-loopback

...

on

...

AGL

...

Reference

...

Hardware

...

platform

...

(RefHw)

...

An

...

overview

...

This

...

guide

...

contains

...

instructions

...

and

...

sources/binaries

...

to

...

manually

...

compile,

...

test

...

and

...

experiment

...

virtio-loopback

...

with

...

two

...

vhost-user

...

sound

...

devices

...

on

...

**AGL

...

reference

...

hardware**.

...

This

...

initial

...

multi-device

...

support

...

was

...

developed

...

to

...

demonstrate

...

the

...

flexibility

...

of

...

virtio-loopback,

...

but

...

it

...

is

...

by

...

no

...

means

...

stable

...

and

...

optimized.

...

The

...

yocto

...

integration

...

of

...

virtio-loopback

...

and

...

vhost-user-sound

...

in

...

AGL

...

is

...

ongoing

...

and

...

is

...

targeting

...

single

...

device

...

support

...

only.

...

Future

...

work

...

idea

...

is

...

to

...

properly

...

support

...

multi-devices

...

in

...

2024.

...

This

...

work

...

was

...

presented

...

at

...

OSS

...

Japan

...

by

...

Virtual

...

Open

...

Systems

...

(https://

...

ossjapan2023.sched.com/event/

...

1TvYP/virtio-loopback-

...

the-agl-hardware-abstraction-layer

...

-for-non-virtualized-environments-michele-paolino-virtual-open-systems).

...

The

...

code

...

of

...

this

...

demo

...

diverges

...

a

...

bit

...

from

...

the

...

single-device

...

that

...

is

...

targeting

...

upstream

...

in

...

AGL.

...

For

...

instance,

...

it

...

contains

...

makefiles

...

to

...

build

...

two

...

identical

...

virtio-loopback-drivers

...

with

...

different

...

names.

...

For

...

this

...

reason,

...

we

...

placed

...

all

...

the

...

sources/binaries

...

in

...

a

...

temporary

...

public

...

repository

...

available

...

here

...

: https://git.virtualopensystems.com/virtio-loopback/docs/-/tree/multi-sound-guide

...

.

...

 

Alt textImage Added

Description of two virtio-sound

...

device

...

running

...

on

...

top

...

of

...

virtio-loopback

...

architecture

Components

The architecture we want to put in place is composed by the following components:

  • Virtio Loopback Transport, a Linux module which acts as a transport for the virtio-devices and redirects the virtio messages to the user-space (virtio-loopback-adapter).

...

...

...

...

  • application

...

  • which

...

  • is

...

  • the

...

  • intermediate

...

  • between

...

  • virtio-loopback-transport

...

  • and

...

  • vhost-user-rng

...

  • device

...

  • and

...

  • bridges

...

  • the

...

  • communication

...

  • between

...

  • them.

...

...

  • is

...

  • the

...

  • upstream

...

  • vhost-user-sound

...

  • device

...

  • #

...

  • Instructions

...

  • for

...

  • reproducing

...

  • the

...

  • VOSYS

...

  • OSS23

...

  • demo

...

1.

...

Prerequisites

...

Before

...

start

...

compiling

...

and

...

running

...

the

...

components

...

of

...

the

...

architecture

...

you

...

need:

...

  • RefHw Linux kernel dependencies:
    •  The following configuration flags need to be enabled: *CONFIG_VIRTIO*,

...

    • *CONFIG_SND_VIRTIO*

...

    • -

...

  • RefHw

...

  • filesystem

...

  • dependencies:

...

    • alsa-utils

...

    • so

...

    • to

...

    • use

...

    • aplay

...

    • command,

...

    • in

...

    • order

...

    • to

...

    • feed

...

    • audio

...

    • stream

...

    • to

...

    • a

...

    • sound

...

    • device

...

    • of

...

    • the

...

    • system

...

  • Host

...

  • system dependencies
    • git to fetch the sources and patch them before compilation

Since RefHw current kernel version is older than v5.13,

...

the

...

virtio-sound

...

driver

...

is

...

not

...

available

...

in

...

the

...

kernel.

...

In

...

that

...

case,

...

patches

...

provided

...

in

...

the

...

virtio_snd_patches

...

subdirectory of the current repo should be applied to the kernel sources. Please find more information about that in the next section (3.1).

2. Build virtio-loopback components

This section focuses on the steps need to be followed in order all the required components of the architecture be compiled.

NOTE: For simplicity, we will consider to execute all the operations in "$HOME/virtio-loopback-test".

2.1 Backport virtio-sound on kernel v5.10

Patches which backport the virtio-sound driver on kernel v5.10 (used by AGL reference HW) can be found under "virtio_snd_patches/" of the current repo. To apply them to the target kernel (assuming you have sources in the "linux_kernel_source" folder) the following steps are required:

  • `cd linux_kernel_source`
  • `git am $HOME/virtio-loopback-test/virtio_loopback_guide/virtio_snd_patches/000*`
  • `make sound/virtio/virtio_snd.ko`
  • For cross-compile please use: `make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- sound/virtio/virtio_snd.ko`>

NOTE: A prebuilt virtio_snd.ko module can be found under "prebuilt_binaries" directory

2.2 virtio-loopback driver

The loopback driver is one of two core components of the presented design. It is a kernel module responsible of re-routing virtio messages to the user-space and provides a way to user-space applications to access the vrings. The instructions about how to clone the corresponding repository and build it are the following:

Clone and build loopback driver by executing the following commands:

  • cd $HOME/virtio-loopback-test
  • git clone git@git.virtualopensystems.com:virtio-loopback/loopback_driver.git
  • git checkout multi-sound-demo
  • cd loopback_driver/
  • ./make_loopback.sh or ./make_loopback.sh 1 for enabling logs

More in details, the make command (used inside the make_loopback.sh script) takes as an argument:

  • 'DEBUG=1' which defines if the driver is going to print logs.

Note: Please update the variable LINUX_DIR in the "Makefile", pointing to the target linux sources.

A prebuilt version of loopback modules can be found under "prebuilt_binaries":

  • loopback_driver0.ko, logs disabled
  • loopback_driver1.ko, logs disabled
  • loopback_driver0_logs.ko
  • loopback_driver1_logs.ko

The kernel side component of the virtio-loopback architecture is now ready to be used. Before proceeding, let's build the user-space component virtio-loopback adapter.

2.3 virtio-loopback adapter

The adapter is the second important component of the presented design and it is responsible of bridging the communication between the vhost-user-device (user-space) and the loopback driver (described in the previous section).

Instructions to clone and build this component are the following:

  • cd $HOME/virtio-loopback-test
  • git clone git@git.virtualopensystems.com:virtio-loopback/

...

  • adapter_

...

  • app.git
  • git checkout multi-sound-

...

  • demo
  • cd adapter_app/
  • make ARCH=arm64

More in details, the make command takes as an argument:

  • 'DEBUG=1'

...

  • which

...

  • defines

...

  • if

...

  • the

...

  • adapter is

...

  • going

...

  • to

...

  • print

...

  • logs.

...

NOTE: A prebuilt version of adapter's binary can be found under "prebuilt_binaries" directory:

  • adapter, logs disabled
  • adapter_logs

Next step is to compile vhost-user-sound device to be able to test the architecture.

2.4 Vhost-user-sound

The third component of the virtio-loopback architecture is the vhost-user-device. Vhost-user-device is the component with whom virtio driver communicates via the path "loopback driver" <-> "adapter". Essentially, it is a user-space driver which virtio tries communicate with.

Instructions to clone and build this modified version are the following:

  • cd $HOME/
  • git clone https://github.com/rust-vmm/vhost-device.git
  • cd ./vhost-device/staging/
  • cargo build --bin vhost-device-sound

NOTE: A prebuilt version of vhost-device-sound can be found under "prebuilt_binaries/vhost-device/" directory:  - vhost-device-sound  - vhost-device-sound.d

Both files needs to be in the same directory

After the above process is completed we should be able to locate vhost-device-sound to the following paths:

  • $HOME/vhost-device/staging/target/debug/vhost-device-sound

2.5 Application plays audio stream to a sound system device

In order to perform the multi-virtio-sound demo, we need a simple user-space application that plays a sound stream to a sound device. This application is "aplay" command included in the Pike rootfs with target agl-demo-platform. Also sound samples played during that demo can be found in the subdirectory *sound-samples/*.

3. Run the demonstration

At this point all the components required to start the demo should have been downloaded or built.

3.1 System Initialization

This section is an example of how to run two vhost-user-sound on top of the virtio-loopback architecture. It consists of three steps:

  • Insert the virtio-sound and virtio-loopback-transport drivers into the kernel
    • insmod the virtio_snd.ko binary
    • insmod $HOME/loopback_driver/virtio-loopback0.ko
    • insmod $HOME/loopback_driver/virtio-loopback1.ko

By using insmod virtio-loopback*_logs.ko prebuilt modules, driver's logs can be seen with dmesg but this will affect performance.

As a result of that process we can see that two new virtio-loopback-driver has been registered in the kernel. This can be verified by running:

$ ls /dev/| grep "loopback-"
loopback-X
loopback-Y

X and Y are used to discriminate the two virtio-loopback driver instances.

  • Run the vhost-user-devices
    • $HOME/vhost-device/staging/target/debug/vhost-device-sound --socket $HOME/sound.sock0 --backend pipewire
    • $HOME/vhost-device/staging/target/debug/vhost-device-sound --socket $HOME/sound.sock1 --backend pipewire

The "vhost-device-sound" has two arguments "--socket-path=" and "--backend". The socket argument is the connection between and instance of the vhost-user-device and the virtio-loopback-adapter. Lastly, the backend can be one of the three choices: "null", "alsa", "pipewire". The current demo focuses on "pipewire".

By using RUST_LOG=trace you will be able to see vhost-device-sound's logs but this might affect performance.

  • Start two instances of virtio-loopback-adapter
    • $HOME/adapter_app/adapter -s /home/root/agl/sound.sock0 -d vhusnd -l X
    • $HOME/adapter_app/adapter -s /home/root/agl/sound.sock1 -d vhusnd -l Y

By using adapter_logs prebuilt binary, adapter's logs can be seen in the same terminal but this might affect performance.

After executing those steps, two new virtio-sound devices should appear in the system. We can verify that and find their names by running:

$ aplay -l
card 1: SoundCard [VirtIO SoundCard], device 0: virtio-snd [VirtIO PCM 0]

...


  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: SoundCard_1 [VirtIO SoundCard], device 0: virtio-snd [VirtIO PCM 0]
  Subdevices: 1/1
  

...

Subdevice #0: 

...

subdevice #0

3.2 Playing

...

audio

...

on

...

Speakers

...

All

...

the

...

virtio-loopback

...

infrastructure

...

is

...

now

...

in

...

place.

...

Every

...

request

...

to

...

the

...

virtio-sound

...

driver

...

in

...

kernel

...

space,

...

will

...

be

...

forwarded

...

through

...

virtio-loopback

...

driver

...

and

...

adapter

...

components

...

to

...

the

...

vhost-device-sound

...

device

...

running

...

in

...

user

...

space.

...

At

...

last

...

the

...

vhost-device-sound

...

device

...

via

...

"pipewire"

...

and

...

"ALSA"

...

outputs

...

the

...

audio

...

on

...

speakers.

...

Playing

...

audio

...

to

...

the

...

speakers

...

is

...

done

...

via

...

two

...

simple

...

commands:

...

  • aplay -D

...

  • sysdefault:CARD=SoundCard

...

  • $HOME/sound-pacthes/agl_demo.

...

  • wav
    • Playing sound to the speakers via virtio-sound

...

    • first

...

    • instance

...

    • (SoundCard)

...

  • aplay -D sysdefault:CARD=SoundCard_1

...

  • $HOME/sound-pacthes/agl_ic.

...

  • wav
    • Playing sound to the speakers via virtio-sound

...

    • second

...

    • instance

...

    • (SoundCard_1)

...