Skip to content

Commit dddb600

Browse files
committed
[DNM] virtio api change
To be solved Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent d089039 commit dddb600

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

drivers/virtio/virtio_pci.c

Lines changed: 9 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,10 @@ 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,
617+
virtio_enumerate_queues cb, void *opaque)
612618
{
613-
int ret = virtio_pci_set_virtqueues(dev, cb, opaque);
619+
int ret = virtio_pci_set_virtqueues(dev, num_queues, cb, opaque);
614620

615621
if (ret != 0) {
616622
return ret;

include/zephyr/virtio/virtio.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ __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,
47+
virtio_enumerate_queues cb, void *opaque);
4748
void (*finalize_init)(const struct device *dev);
4849
};
4950

@@ -147,16 +148,18 @@ static inline int virtio_commit_feature_bits(const struct device *dev)
147148
* Initializes virtqueues
148149
*
149150
* @param dev virtio device it operates on
151+
* @param num_queues number of queues to initialize
150152
* @param cb callback called for each available virtqueue
151153
* @param opaque pointer to user provided data that will be passed to the callback
152154
* @return 0 on success or negative error code on failure
153155
*/
154156
static inline int virtio_init_virtqueues(
155-
const struct device *dev, virtio_enumerate_queues cb, void *opaque)
157+
const struct device *dev, uint16_t num_queues,
158+
virtio_enumerate_queues cb, void *opaque)
156159
{
157160
const struct virtio_driver_api *api = dev->api;
158161

159-
return api->init_virtqueues(dev, cb, opaque);
162+
return api->init_virtqueues(dev, num_queues, cb, opaque);
160163
}
161164

162165
/**

0 commit comments

Comments
 (0)