Loading...
Searching...
No Matches
L4virtio::Virtqueue Class Reference

Low-level Virtqueue. More...

`#include <virtqueue>`

Inheritance diagram for L4virtio::Virtqueue:
Collaboration diagram for L4virtio::Virtqueue:

## Data Structures

class | Desc
| Descriptor in the descriptor table. More...
class | Avail
| Type of available ring, this is read-only for the host. More...
struct | Used_elem
| Type of an element of the used ring. More...
class | Used
| Used ring. More...

## Public Types

enum |
| Fixed alignment values for different parts of a virtqueue.

## Public Member Functions

void | disable ()
| Completely disable the queue.
unsigned long | total_size () const
| Calculate the total size of this virtqueue.
unsigned long | avail_offset () const
| Get the offset of the available ring from the descriptor table.
unsigned long | used_offset () const
| Get the offset of the used ring from the descriptor table.
void | setup (unsigned num, void *desc, void *avail, void *used)
| Enable this queue.
void | setup_simple (unsigned num, void *ring)
| Enable this queue.
void | dump (Desc const *d) const
| Dump descriptors for this queue.
bool | ready () const
| Test if this queue is in working state.
unsigned | num () const
bool | no_notify_guest () const
| Get the no IRQ flag of this queue.
bool | no_notify_host () const
| Get the no notify flag of this queue.
void | no_notify_host (bool value)
| Set the no-notify flag for this queue.
l4_uint16_t | get_avail_idx () const
| Get available index from available ring (for debugging).
l4_uint16_t | get_tail_avail_idx () const
| Get tail-available index stored in local state (for debugging).

## Static Public Member Functions

static unsigned long | total_size (unsigned num)
| Calculate the total size for a virtqueue of the given dimensions.
static unsigned long | desc_size (unsigned num)
| Calculate the size of the descriptor table for num entries.
static unsigned long | desc_align ()
| Get the alignment in zero LSBs needed for the descriptor table.
static unsigned long | avail_size (unsigned num)
| Calculate the size of the available ring for num entries.
static unsigned long | avail_align ()
| Get the alignment in zero LSBs needed for the available ring.
static unsigned long | used_size (unsigned num)
| Calculate the size of the used ring for num entries.
static unsigned long | used_align ()
| Get the alignment in zero LSBs needed for the used ring.

## Protected Member Functions

| Virtqueue ()=default
| Create a disabled virtqueue.

## Protected Attributes

Desc * | _desc = nullptr
| pointer to descriptor table, NULL if queue is off.
Avail * | _avail = nullptr
| pointer to available ring.
Used * | _used = nullptr
| pointer to used ring.
l4_uint16_t | _current_avail = 0
| The life counter for the queue.
l4_uint16_t | _idx_mask = 0
| mask used for indexing into the descriptor table and the rings.

## Detailed Description

Low-level Virtqueue.

This class represents a single virtqueue, with a local running available index.

Note
  The Virtqueue implementation is not thread-safe.

Definition at line 80 of file virtqueue.

## Member Function Documentation

## avail_align()

unsigned long L4virtio::Virtqueue::avail_align | ( |  | ) |

inlinestatic

Get the alignment in zero LSBs needed for the available ring.

Returns
  The alignment in zero LSBs needed for an available ring.

Definition at line 287 of file virtqueue.

## avail_size()

unsigned long L4virtio::Virtqueue::avail_size | ( | unsigned | num | ) |

inlinestatic

Calculate the size of the available ring for num entries.

Parameters

  num | The number of entries in the available ring.

Returns
  The size in bytes needed for an available ring with num entries.

Definition at line 279 of file virtqueue.

References num().

Referenced by L4virtio::Svr::Device_t< No_custom_data >::setup_queue(), setup_simple(), and total_size().

Here is the call graph for this function:
Here is the caller graph for this function:

## desc_align()

unsigned long L4virtio::Virtqueue::desc_align | ( |  | ) |

inlinestatic

Get the alignment in zero LSBs needed for the descriptor table.

Returns
  The alignment in zero LSBs needed for a descriptor table.

Definition at line 269 of file virtqueue.

## desc_size()

unsigned long L4virtio::Virtqueue::desc_size | ( | unsigned | num | ) |

inlinestatic

Calculate the size of the descriptor table for num entries.

Parameters

  num | The number of entries in the descriptor table.

Returns
  The size in bytes needed for a descriptor table with num entries.

Definition at line 261 of file virtqueue.

References num().

Referenced by L4virtio::Svr::Device_t< No_custom_data >::setup_queue(), setup_simple(), and total_size().

Here is the call graph for this function:
Here is the caller graph for this function:

## disable()

void L4virtio::Virtqueue::disable | ( |  | ) |

inline

Completely disable the queue.

setup() must be used to enable the queue again.

Definition at line 224 of file virtqueue.

References _desc.

Referenced by L4virtio::Svr::Device_t< No_custom_data >::setup_queue().

Here is the caller graph for this function:

## dump()

void L4virtio::Virtqueue::dump | ( | Desc const * | d | ) | const

inline

Dump descriptors for this queue.

Precondition
  the queue must be in working state.

Definition at line 392 of file virtqueue.

References _desc, and L4virtio::Virtqueue::Desc::dump().

Here is the call graph for this function:

## get_avail_idx()

l4_uint16_t L4virtio::Virtqueue::get_avail_idx | ( |  | ) | const

inline

Get available index from available ring (for debugging).

Precondition
  Queue must be in a working state.

Returns
  current index in the available ring (shared between device model and device driver).

Definition at line 449 of file virtqueue.

References _avail.

## get_tail_avail_idx()

l4_uint16_t L4virtio::Virtqueue::get_tail_avail_idx | ( |  | ) | const

inline

Get tail-available index stored in local state (for debugging).

Returns
  current tail index for the the available ring.

Definition at line 456 of file virtqueue.

References _current_avail.

## no_notify_guest()

bool L4virtio::Virtqueue::no_notify_guest | ( |  | ) | const

inline

Get the no IRQ flag of this queue.

Precondition
  queue must be in working state.

Returns
  true if the guest does not want to get IRQs (currently).

Definition at line 414 of file virtqueue.

References _avail.

Referenced by L4virtio::Svr::Block_dev_base< Ds_data >::finalize_request(), and L4virtio::Svr::Console::Device::notify_queue().

Here is the caller graph for this function:

## no_notify_host() [1/2]

bool L4virtio::Virtqueue::no_notify_host | ( |  | ) | const

inline

Get the no notify flag of this queue.

Precondition
  queue must be in working state.

Returns
  true if the host does not want to get IRQs (currently).

Definition at line 426 of file virtqueue.

References _used.

## no_notify_host() [2/2]

void L4virtio::Virtqueue::no_notify_host | ( | bool | value | ) |

inline

Set the no-notify flag for this queue.

Precondition
  Queue must be in a working state.

Definition at line 436 of file virtqueue.

References _used.

## num()

unsigned L4virtio::Virtqueue::num | ( |  | ) | const

inline

Returns
  The number of entries in the ring.

Definition at line 404 of file virtqueue.

References _idx_mask.

Referenced by avail_size(), desc_size(), L4virtio::Driver::Virtqueue::init_queue(), L4virtio::Driver::Virtqueue::init_queue(), L4virtio::Driver::Virtqueue::initialize_rings(), setup(), setup_simple(), L4virtio::Svr::Request_processor::start(), total_size(), total_size(), and used_size().

Here is the caller graph for this function:

## ready()

bool L4virtio::Virtqueue::ready | ( |  | ) | const

inline

Test if this queue is in working state.

Returns
  true when the queue is in working state, false else.

Definition at line 400 of file virtqueue.

References _desc, and L4_LIKELY.

Referenced by L4virtio::Svr::Virtqueue::disable_notify(), Virtio_net_request::drop_requests(), L4virtio::Svr::Virtqueue::enable_notify(), Virtio_net_request::get_request(), L4virtio::Svr::Console::Virtio_con::handle_control_message(), and L4virtio::Svr::Console::Virtio_con::send_control_message().

Here is the caller graph for this function:

## setup()

void L4virtio::Virtqueue::setup | ( | unsigned | num,
|  | void * | desc,
|  | void * | avail,
|  | void * | used )

inline

Enable this queue.

Parameters

  num | The number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2).
  desc | The address of the descriptor table. (Must be Desc_align aligned and at least desc_size(num) bytes in size.)
  avail | The address of the available ring. (Must be Avail_align aligned and at least avail_size(num) bytes in size.)
  used | The address of the used ring. (Must be Used_align aligned and at least used_size(num) bytes in size.)

Due to the data type of the descriptors, the queue can have a maximum size of 2^16.

Definition at line 349 of file virtqueue.

References _avail, _current_avail, _desc, _idx_mask, _used, L4_EINVAL, and num().

Referenced by L4virtio::Driver::Virtqueue::init_queue(), L4virtio::Svr::Device_t< No_custom_data >::setup_queue(), and setup_simple().

Here is the call graph for this function:
Here is the caller graph for this function:

## setup_simple()

void L4virtio::Virtqueue::setup_simple | ( | unsigned | num,
|  | void * | ring )

inline

Enable this queue.

Parameters

  num | The number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2).
  ring | The base address for the queue data structure. The memory block at ring must be at least total_size(num) bytes in size and have an alignment of Desc_align (desc_align()) bits.

Due to the data type of the descriptors, the queue can have a maximum size of 2^16.

Definition at line 378 of file virtqueue.

References avail_size(), desc_size(), l4_round_size(), num(), and setup().

Referenced by L4virtio::Driver::Virtqueue::init_queue().

Here is the call graph for this function:
Here is the caller graph for this function:

## total_size() [1/2]

unsigned long L4virtio::Virtqueue::total_size | ( |  | ) | const

inline

Calculate the total size of this virtqueue.

Precondition
  The queue has been set up.

Definition at line 314 of file virtqueue.

References _desc, _used, num(), and used_size().

Here is the call graph for this function:

## total_size() [2/2]

unsigned long L4virtio::Virtqueue::total_size | ( | unsigned | num | ) |

inlinestatic

Calculate the total size for a virtqueue of the given dimensions.

Parameters

  num | The number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2).

Returns
  The total size in bytes of the queue data structures.

Definition at line 245 of file virtqueue.

References avail_size(), desc_size(), l4_round_size(), num(), and used_size().

Here is the call graph for this function:

## used_align()

unsigned long L4virtio::Virtqueue::used_align | ( |  | ) |

inlinestatic

Get the alignment in zero LSBs needed for the used ring.

Returns
  The alignment in zero LSBs needed for an used ring.

Definition at line 306 of file virtqueue.

## used_size()

unsigned long L4virtio::Virtqueue::used_size | ( | unsigned | num | ) |

inlinestatic

Calculate the size of the used ring for num entries.

Parameters

  num | The number of entries in the used ring.

Returns
  The size in bytes needed for an used ring with num entries.

Definition at line 298 of file virtqueue.

References num().

Referenced by L4virtio::Svr::Device_t< No_custom_data >::setup_queue(), total_size(), and total_size().

Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following file:

- l4/l4virtio/virtqueue