xref: /dpdk/lib/vhost/iotlb.h (revision ede563fa886dff691ab076b2e45adec8415f619b)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright (c) 2017 Red Hat, Inc.
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _VHOST_IOTLB_H_
699a2dd95SBruce Richardson #define _VHOST_IOTLB_H_
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson #include <stdbool.h>
999a2dd95SBruce Richardson 
1099a2dd95SBruce Richardson #include "vhost.h"
1199a2dd95SBruce Richardson 
1299a2dd95SBruce Richardson static __rte_always_inline void
vhost_user_iotlb_rd_lock(struct vhost_virtqueue * vq)1399a2dd95SBruce Richardson vhost_user_iotlb_rd_lock(struct vhost_virtqueue *vq)
14bf42fb30SDavid Marchand 	__rte_shared_lock_function(&vq->iotlb_lock)
1599a2dd95SBruce Richardson {
1699a2dd95SBruce Richardson 	rte_rwlock_read_lock(&vq->iotlb_lock);
1799a2dd95SBruce Richardson }
1899a2dd95SBruce Richardson 
1999a2dd95SBruce Richardson static __rte_always_inline void
vhost_user_iotlb_rd_unlock(struct vhost_virtqueue * vq)2099a2dd95SBruce Richardson vhost_user_iotlb_rd_unlock(struct vhost_virtqueue *vq)
21bf42fb30SDavid Marchand 	__rte_unlock_function(&vq->iotlb_lock)
2299a2dd95SBruce Richardson {
2399a2dd95SBruce Richardson 	rte_rwlock_read_unlock(&vq->iotlb_lock);
2499a2dd95SBruce Richardson }
2599a2dd95SBruce Richardson 
2699a2dd95SBruce Richardson static __rte_always_inline void
vhost_user_iotlb_wr_lock(struct vhost_virtqueue * vq)2799a2dd95SBruce Richardson vhost_user_iotlb_wr_lock(struct vhost_virtqueue *vq)
28bf42fb30SDavid Marchand 	__rte_exclusive_lock_function(&vq->iotlb_lock)
2999a2dd95SBruce Richardson {
3099a2dd95SBruce Richardson 	rte_rwlock_write_lock(&vq->iotlb_lock);
3199a2dd95SBruce Richardson }
3299a2dd95SBruce Richardson 
3399a2dd95SBruce Richardson static __rte_always_inline void
vhost_user_iotlb_wr_unlock(struct vhost_virtqueue * vq)3499a2dd95SBruce Richardson vhost_user_iotlb_wr_unlock(struct vhost_virtqueue *vq)
35bf42fb30SDavid Marchand 	__rte_unlock_function(&vq->iotlb_lock)
3699a2dd95SBruce Richardson {
3799a2dd95SBruce Richardson 	rte_rwlock_write_unlock(&vq->iotlb_lock);
3899a2dd95SBruce Richardson }
3999a2dd95SBruce Richardson 
40a54f046dSMaxime Coquelin static __rte_always_inline void
vhost_user_iotlb_wr_lock_all(struct virtio_net * dev)41a54f046dSMaxime Coquelin vhost_user_iotlb_wr_lock_all(struct virtio_net *dev)
42a54f046dSMaxime Coquelin 	__rte_no_thread_safety_analysis
43a54f046dSMaxime Coquelin {
44a54f046dSMaxime Coquelin 	uint32_t i;
45a54f046dSMaxime Coquelin 
46a54f046dSMaxime Coquelin 	for (i = 0; i < dev->nr_vring; i++)
47a54f046dSMaxime Coquelin 		rte_rwlock_write_lock(&dev->virtqueue[i]->iotlb_lock);
48a54f046dSMaxime Coquelin }
49a54f046dSMaxime Coquelin 
50a54f046dSMaxime Coquelin static __rte_always_inline void
vhost_user_iotlb_wr_unlock_all(struct virtio_net * dev)51a54f046dSMaxime Coquelin vhost_user_iotlb_wr_unlock_all(struct virtio_net *dev)
52a54f046dSMaxime Coquelin 	__rte_no_thread_safety_analysis
53a54f046dSMaxime Coquelin {
54a54f046dSMaxime Coquelin 	uint32_t i;
55a54f046dSMaxime Coquelin 
56a54f046dSMaxime Coquelin 	for (i = 0; i < dev->nr_vring; i++)
57a54f046dSMaxime Coquelin 		rte_rwlock_write_unlock(&dev->virtqueue[i]->iotlb_lock);
58a54f046dSMaxime Coquelin }
59a54f046dSMaxime Coquelin 
60a54f046dSMaxime Coquelin void vhost_user_iotlb_cache_insert(struct virtio_net *dev, uint64_t iova, uint64_t uaddr,
61*ede563faSMaxime Coquelin 		uint64_t uoffset, uint64_t size, uint64_t page_size, uint8_t perm);
62a54f046dSMaxime Coquelin void vhost_user_iotlb_cache_remove(struct virtio_net *dev, uint64_t iova, uint64_t size);
63a54f046dSMaxime Coquelin uint64_t vhost_user_iotlb_cache_find(struct virtio_net *dev, uint64_t iova,
6499a2dd95SBruce Richardson 					uint64_t *size, uint8_t perm);
65a54f046dSMaxime Coquelin bool vhost_user_iotlb_pending_miss(struct virtio_net *dev, uint64_t iova, uint8_t perm);
66a54f046dSMaxime Coquelin void vhost_user_iotlb_pending_insert(struct virtio_net *dev, uint64_t iova, uint8_t perm);
67a54f046dSMaxime Coquelin void vhost_user_iotlb_pending_remove(struct virtio_net *dev, uint64_t iova,
6899a2dd95SBruce Richardson 						uint64_t size, uint8_t perm);
69a54f046dSMaxime Coquelin void vhost_user_iotlb_flush_all(struct virtio_net *dev);
70a54f046dSMaxime Coquelin int vhost_user_iotlb_init(struct virtio_net *dev);
71a54f046dSMaxime Coquelin void vhost_user_iotlb_destroy(struct virtio_net *dev);
72a54f046dSMaxime Coquelin 
7399a2dd95SBruce Richardson #endif /* _VHOST_IOTLB_H_ */
74