mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2026-03-18 11:04:12 +00:00
Prior to this patch, one single iothread instance is created and initialized in the `main` function. This single iothread monitors all the registered fds and handles all the corresponding requests. It leads to the limited flexibility of the iothread support. To improve the flexibility of the iothread support, this patch does: - add the support of multiple iothread instances. `iothread_create` is introduced to create a certain number of iothread instances. It shall be called at first by each virtual device owner (such as virtio-blk BE) on initialization phase. Then, `iothread_add` can be called to add the to be monitored fd to the specified iothread. - update virtio-blk BE to let the acrn-dm option `iothread` accept a number as the number of iothread instances to be created. If `iothread` is contained in the parameters, but the number is not specified, one iothread instance would be created by default. Examples to specify the number of iothread instances: 1. Create 2 iothread instances `add_virtual_device 9 virtio-blk iothread=2,mq=2,/dev/nvme1n1,writeback,aio=io_uring` 2. Create 1 iothread instances (by default) `add_virtual_device 9 virtio-blk iothread,mq=2,/dev/nvme1n1,writeback,aio=io_uring` - update virtio-blk BE to separate the request handling of different virtqueues to different iothreads. The request from one or more virtqueues can be handled in one iothread. The mapping between virtqueues and iothreads is based on round robin. v1 -> v2: * add a mutex to protect the free ioctx slot allocation Tracked-On: #8612 Signed-off-by: Shiqing Gao <shiqing.gao@intel.com> Acked-by: Wang, Yu1 <yu1.wang@intel.com>
37 lines
646 B
C
37 lines
646 B
C
/* Copyright (C) 2022 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
*/
|
|
|
|
#ifndef _iothread_CTX_H_
|
|
#define _iothread_CTX_H_
|
|
|
|
#define IOTHREAD_NUM 40
|
|
|
|
struct iothread_mevent {
|
|
void (*run)(void *);
|
|
void *arg;
|
|
int fd;
|
|
};
|
|
|
|
struct iothread_ctx {
|
|
pthread_t tid;
|
|
int epfd;
|
|
bool started;
|
|
pthread_mutex_t mtx;
|
|
int idx;
|
|
};
|
|
|
|
struct iothreads_info {
|
|
struct iothread_ctx *ioctx_base;
|
|
int num;
|
|
};
|
|
|
|
int iothread_add(struct iothread_ctx *ioctx_x, int fd, struct iothread_mevent *aevt);
|
|
int iothread_del(struct iothread_ctx *ioctx_x, int fd);
|
|
void iothread_deinit(void);
|
|
struct iothread_ctx *iothread_create(int ioctx_num);
|
|
|
|
#endif
|