Skip to content

Commit 0a5f33f

Browse files
committed
virtio api change
1 parent d089039 commit 0a5f33f

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

drivers/virtio/virtio_pci.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,16 @@ static int virtio_pci_set_virtqueue(
323323
}
324324

325325
static int virtio_pci_set_virtqueues(
326-
const struct device *dev, virtio_enumerate_queues cb, void *opaque)
326+
const struct device *dev, uint16_t num_queues, virtio_enumerate_queues cb, void *opaque)
327327
{
328328
struct virtio_pci_data *data = dev->data;
329329
uint16_t queue_count = sys_le16_to_cpu(data->common_cfg->num_queues);
330330

331+
if (num_queues > queue_count) {
332+
LOG_ERR("too many queues are requested");
333+
return -EINVAL;
334+
}
335+
331336
data->virtqueues = k_malloc(queue_count * sizeof(struct virtq));
332337
if (!data->virtqueues) {
333338
LOG_ERR("failed to allocate virtqueue array");
@@ -608,9 +613,9 @@ void *virtio_pci_get_device_specific_config(const struct device *dev)
608613
return data->device_specific_cfg;
609614
}
610615

611-
int virtio_pci_init_virtqueues(const struct device *dev, virtio_enumerate_queues cb, void *opaque)
616+
int virtio_pci_init_virtqueues(const struct device *dev, uint16_t num_queues, virtio_enumerate_queues cb, void *opaque)
612617
{
613-
int ret = virtio_pci_set_virtqueues(dev, cb, opaque);
618+
int ret = virtio_pci_set_virtqueues(dev, num_queues, cb, opaque);
614619

615620
if (ret != 0) {
616621
return ret;

include/zephyr/virtio/virtio.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ __subsystem struct virtio_driver_api {
4343
bool (*read_driver_feature_bit)(const struct device *dev, int bit);
4444
int (*write_driver_feature_bit)(const struct device *dev, int bit, bool value);
4545
int (*commit_feature_bits)(const struct device *dev);
46-
int (*init_virtqueues)(const struct device *dev, virtio_enumerate_queues cb, void *opaque);
46+
int (*init_virtqueues)(const struct device *dev, uint16_t num_queues, virtio_enumerate_queues cb, void *opaque);
4747
void (*finalize_init)(const struct device *dev);
4848
};
4949

@@ -147,16 +147,17 @@ static inline int virtio_commit_feature_bits(const struct device *dev)
147147
* Initializes virtqueues
148148
*
149149
* @param dev virtio device it operates on
150+
* @param num_queues number of queues to initialize
150151
* @param cb callback called for each available virtqueue
151152
* @param opaque pointer to user provided data that will be passed to the callback
152153
* @return 0 on success or negative error code on failure
153154
*/
154155
static inline int virtio_init_virtqueues(
155-
const struct device *dev, virtio_enumerate_queues cb, void *opaque)
156+
const struct device *dev, uint16_t num_queues, virtio_enumerate_queues cb, void *opaque)
156157
{
157158
const struct virtio_driver_api *api = dev->api;
158159

159-
return api->init_virtqueues(dev, cb, opaque);
160+
return api->init_virtqueues(dev, num_queues, cb, opaque);
160161
}
161162

162163
/**

0 commit comments

Comments
 (0)