On Thu, Aug 31, 2017 at 11:50:09AM +0200, Maxime Coquelin wrote:
[...]
> +
> +#define IOTLB_CACHE_SIZE 1024
> +
> +static void vhost_user_iotlb_cache_remove_all(struct vhost_virtqueue *vq)
> +{
> +     struct vhost_iotlb_entry *node, *temp_node;
> +
> +     rte_rwlock_write_lock(&vq->iotlb_lock);
> +
> +     TAILQ_FOREACH_SAFE(node, &vq->iotlb_list, next, temp_node) {
> +             TAILQ_REMOVE(&vq->iotlb_list, node, next);
> +             rte_mempool_put(vq->iotlb_pool, node);
> +     }
> +
> +     rte_rwlock_write_unlock(&vq->iotlb_lock);
> +}
> +
> +void vhost_user_iotlb_cache_insert(struct vhost_virtqueue *vq, uint64_t iova,
> +                             uint64_t uaddr, uint64_t size, uint8_t perm)
> +{
> +     struct vhost_iotlb_entry *node, *new_node;
> +     int ret;
> +
> +     ret = rte_mempool_get(vq->iotlb_pool, (void **)&new_node);
> +     if (ret) {
> +             RTE_LOG(ERR, VHOST_CONFIG, "IOTLB pool empty, invalidate 
> cache\n");

I think the log level should be DEBUG or INFO or the likes, not ERR.

> +             vhost_user_iotlb_cache_remove_all(vq);
> +             ret = rte_mempool_get(vq->iotlb_pool, (void **)&new_node);
> +             if (ret) {
> +                     RTE_LOG(ERR, VHOST_CONFIG, "IOTLB pool still empty, 
> failure\n");
> +                     return;
> +             }
> +     }
> +
[...]
> +
> +void vhost_user_iotlb_cache_remove(struct vhost_virtqueue *vq,
> +                                     uint64_t iova, uint64_t size)
> +{
> +     struct vhost_iotlb_entry *node, *temp_node;
> +
> +     if (unlikely(!size))
> +             return;
> +
> +     rte_rwlock_write_lock(&vq->iotlb_lock);
> +
> +     TAILQ_FOREACH_SAFE(node, &vq->iotlb_list, next, temp_node) {
> +             /* Sorted list */
> +             if (unlikely(node->iova >= iova + size)) {
> +                     break;
> +             } else if ((node->iova < iova + size) &&
> +                                     (iova < node->iova + node->size)) {

The `else' can be removed.
And the check of (node->iova < iova + size) can also be removed.

> +                     TAILQ_REMOVE(&vq->iotlb_list, node, next);
> +                     rte_mempool_put(vq->iotlb_pool, node);
> +                     continue;
> +             }
> +     }
> +
> +     rte_rwlock_write_unlock(&vq->iotlb_lock);
> +}
> +
> +

Only one empty line is needed here.

> +uint64_t vhost_user_iotlb_cache_find(struct vhost_virtqueue *vq, uint64_t 
> iova,
> +                                             uint64_t *size, uint8_t perm)
> +{
[...]
> +#ifndef _VHOST_IOTLB_H_
> +#define _VHOST_IOTLB_H_
> +
> +#include "vhost.h"
> +void vhost_user_iotlb_cache_insert(struct vhost_virtqueue *vq, uint64_t iova,
> +                                     uint64_t uaddr, uint64_t size,
> +                                     uint8_t perm);

An empty line should be added after #include "vhost.h".

Best regards,
Tiwei Bie

Reply via email to