Lines Matching +full:out +full:- +full:masks

1 // SPDX-License-Identifier: GPL-2.0-only
54 return to_virtio_vdpa_device(vdev)->vdpa; in vd_get_vdpa()
76 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_generation()
78 if (ops->get_generation) in virtio_vdpa_generation()
79 return ops->get_generation(vdpa); in virtio_vdpa_generation()
87 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_get_status()
89 return ops->get_status(vdpa); in virtio_vdpa_get_status()
108 struct vdpa_device *vdpa = vd_get_vdpa(vq->vdev); in virtio_vdpa_notify()
109 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_notify()
111 ops->kick_vq(vdpa, vq->index); in virtio_vdpa_notify()
118 struct vdpa_device *vdpa = vd_get_vdpa(vq->vdev); in virtio_vdpa_notify_with_data()
119 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_notify_with_data()
122 ops->kick_vq_with_data(vdpa, data); in virtio_vdpa_notify_with_data()
131 virtio_config_changed(&vd_dev->vdev); in virtio_vdpa_config_cb()
140 return vring_interrupt(0, info->vq); in virtio_vdpa_virtqueue_cb()
151 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_setup_vq()
167 if (index >= vdpa->nvqs) in virtio_vdpa_setup_vq()
168 return ERR_PTR(-ENOENT); in virtio_vdpa_setup_vq()
172 if (ops->kick_vq_with_data) in virtio_vdpa_setup_vq()
179 if (ops->get_vq_ready(vdpa, index)) in virtio_vdpa_setup_vq()
180 return ERR_PTR(-ENOENT); in virtio_vdpa_setup_vq()
182 /* Allocate and fill out our active queue description */ in virtio_vdpa_setup_vq()
185 return ERR_PTR(-ENOMEM); in virtio_vdpa_setup_vq()
186 if (ops->get_vq_size) in virtio_vdpa_setup_vq()
187 max_num = ops->get_vq_size(vdpa, index); in virtio_vdpa_setup_vq()
189 max_num = ops->get_vq_num_max(vdpa); in virtio_vdpa_setup_vq()
192 err = -ENOENT; in virtio_vdpa_setup_vq()
196 if (ops->get_vq_num_min) in virtio_vdpa_setup_vq()
197 min_num = ops->get_vq_num_min(vdpa); in virtio_vdpa_setup_vq()
202 align = ops->get_vq_align(vdpa); in virtio_vdpa_setup_vq()
204 if (ops->get_vq_dma_dev) in virtio_vdpa_setup_vq()
205 dma_dev = ops->get_vq_dma_dev(vdpa, index); in virtio_vdpa_setup_vq()
212 err = -ENOMEM; in virtio_vdpa_setup_vq()
216 vq->num_max = max_num; in virtio_vdpa_setup_vq()
222 ops->set_vq_cb(vdpa, index, &cb); in virtio_vdpa_setup_vq()
223 ops->set_vq_num(vdpa, index, virtqueue_get_vring_size(vq)); in virtio_vdpa_setup_vq()
229 if (ops->set_vq_address(vdpa, index, in virtio_vdpa_setup_vq()
232 err = -EINVAL; in virtio_vdpa_setup_vq()
240 s->last_avail_counter = 1; in virtio_vdpa_setup_vq()
241 s->last_avail_idx = 0; in virtio_vdpa_setup_vq()
242 s->last_used_counter = 1; in virtio_vdpa_setup_vq()
243 s->last_used_idx = 0; in virtio_vdpa_setup_vq()
245 err = ops->set_vq_state(vdpa, index, &state); in virtio_vdpa_setup_vq()
249 ops->set_vq_ready(vdpa, index, 1); in virtio_vdpa_setup_vq()
251 vq->priv = info; in virtio_vdpa_setup_vq()
252 info->vq = vq; in virtio_vdpa_setup_vq()
254 spin_lock_irqsave(&vd_dev->lock, flags); in virtio_vdpa_setup_vq()
255 list_add(&info->node, &vd_dev->virtqueues); in virtio_vdpa_setup_vq()
256 spin_unlock_irqrestore(&vd_dev->lock, flags); in virtio_vdpa_setup_vq()
263 ops->set_vq_ready(vdpa, index, 0); in virtio_vdpa_setup_vq()
265 WARN_ON(ops->get_vq_ready(vdpa, index)); in virtio_vdpa_setup_vq()
272 struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vq->vdev); in virtio_vdpa_del_vq()
273 struct vdpa_device *vdpa = vd_dev->vdpa; in virtio_vdpa_del_vq()
274 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_del_vq()
275 struct virtio_vdpa_vq_info *info = vq->priv; in virtio_vdpa_del_vq()
276 unsigned int index = vq->index; in virtio_vdpa_del_vq()
279 spin_lock_irqsave(&vd_dev->lock, flags); in virtio_vdpa_del_vq()
280 list_del(&info->node); in virtio_vdpa_del_vq()
281 spin_unlock_irqrestore(&vd_dev->lock, flags); in virtio_vdpa_del_vq()
284 ops->set_vq_ready(vdpa, index, 0); in virtio_vdpa_del_vq()
295 list_for_each_entry_safe(vq, n, &vdev->vqs, list) in virtio_vdpa_del_vqs()
301 affd->nr_sets = 1; in default_calc_sets()
302 affd->set_size[0] = affvecs; in default_calc_sets()
309 struct cpumask *masks = NULL; in create_affinity_masks() local
311 if (nvecs > affd->pre_vectors + affd->post_vectors) in create_affinity_masks()
312 affvecs = nvecs - affd->pre_vectors - affd->post_vectors; in create_affinity_masks()
314 if (!affd->calc_sets) in create_affinity_masks()
315 affd->calc_sets = default_calc_sets; in create_affinity_masks()
317 affd->calc_sets(affd, affvecs); in create_affinity_masks()
322 masks = kcalloc(nvecs, sizeof(*masks), GFP_KERNEL); in create_affinity_masks()
323 if (!masks) in create_affinity_masks()
326 /* Fill out vectors at the beginning that don't need affinity */ in create_affinity_masks()
327 for (curvec = 0; curvec < affd->pre_vectors; curvec++) in create_affinity_masks()
328 cpumask_setall(&masks[curvec]); in create_affinity_masks()
330 for (i = 0, usedvecs = 0; i < affd->nr_sets; i++) { in create_affinity_masks()
331 unsigned int this_vecs = affd->set_size[i]; in create_affinity_masks()
336 kfree(masks); in create_affinity_masks()
341 cpumask_copy(&masks[curvec + j], &result[j]); in create_affinity_masks()
348 /* Fill out vectors at the end that don't need affinity */ in create_affinity_masks()
350 curvec = affd->pre_vectors + affvecs; in create_affinity_masks()
352 curvec = affd->pre_vectors + usedvecs; in create_affinity_masks()
354 cpumask_setall(&masks[curvec]); in create_affinity_masks()
356 return masks; in create_affinity_masks()
366 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_find_vqs()
368 struct cpumask *masks; in virtio_vdpa_find_vqs() local
370 bool has_affinity = desc && ops->set_vq_affinity; in virtio_vdpa_find_vqs()
374 masks = create_affinity_masks(nvqs, desc ? desc : &default_affd); in virtio_vdpa_find_vqs()
375 if (!masks) in virtio_vdpa_find_vqs()
376 return -ENOMEM; in virtio_vdpa_find_vqs()
382 if (!vqi->name) { in virtio_vdpa_find_vqs()
387 vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++, vqi->callback, in virtio_vdpa_find_vqs()
388 vqi->name, vqi->ctx); in virtio_vdpa_find_vqs()
395 ops->set_vq_affinity(vdpa, i, &masks[i]); in virtio_vdpa_find_vqs()
400 ops->set_config_cb(vdpa, &cb); in virtio_vdpa_find_vqs()
402 kfree(masks); in virtio_vdpa_find_vqs()
409 kfree(masks); in virtio_vdpa_find_vqs()
416 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_get_features()
418 return ops->get_device_features(vdpa); in virtio_vdpa_get_features()
428 return vdpa_set_features(vdpa, vdev->features); in virtio_vdpa_finalize_features()
434 struct vdpa_device *vdpa = vd_dev->vdpa; in virtio_vdpa_bus_name()
436 return dev_name(&vdpa->dev); in virtio_vdpa_bus_name()
442 struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vq->vdev); in virtio_vdpa_set_vq_affinity()
443 struct vdpa_device *vdpa = vd_dev->vdpa; in virtio_vdpa_set_vq_affinity()
444 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_set_vq_affinity()
445 unsigned int index = vq->index; in virtio_vdpa_set_vq_affinity()
447 if (ops->set_vq_affinity) in virtio_vdpa_set_vq_affinity()
448 return ops->set_vq_affinity(vdpa, index, cpu_mask); in virtio_vdpa_set_vq_affinity()
457 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_get_vq_affinity()
459 if (ops->get_vq_affinity) in virtio_vdpa_get_vq_affinity()
460 return ops->get_vq_affinity(vdpa, index); in virtio_vdpa_get_vq_affinity()
493 const struct vdpa_config_ops *ops = vdpa->config; in virtio_vdpa_probe()
495 int ret = -EINVAL; in virtio_vdpa_probe()
499 return -ENOMEM; in virtio_vdpa_probe()
501 vd_dev->vdev.dev.parent = vdpa_get_dma_dev(vdpa); in virtio_vdpa_probe()
502 vd_dev->vdev.dev.release = virtio_vdpa_release_dev; in virtio_vdpa_probe()
503 vd_dev->vdev.config = &virtio_vdpa_config_ops; in virtio_vdpa_probe()
504 vd_dev->vdpa = vdpa; in virtio_vdpa_probe()
505 INIT_LIST_HEAD(&vd_dev->virtqueues); in virtio_vdpa_probe()
506 spin_lock_init(&vd_dev->lock); in virtio_vdpa_probe()
508 vd_dev->vdev.id.device = ops->get_device_id(vdpa); in virtio_vdpa_probe()
509 if (vd_dev->vdev.id.device == 0) in virtio_vdpa_probe()
512 vd_dev->vdev.id.vendor = ops->get_vendor_id(vdpa); in virtio_vdpa_probe()
513 ret = register_virtio_device(&vd_dev->vdev); in virtio_vdpa_probe()
524 put_device(&vd_dev->vdev.dev); in virtio_vdpa_probe()
534 unregister_virtio_device(&vd_dev->vdev); in virtio_vdpa_remove()