Merge branch 'lro'
[firefly-linux-kernel-4.4.55.git] / drivers / infiniband / core / ucm.c
index d208ea29e07acd38b738063b4065726dcdefdf52..f6a05965a4e8ab79c3529fa71884c792ea8e8c4e 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/mount.h>
 #include <linux/cdev.h>
 #include <linux/idr.h>
+#include <linux/mutex.h>
 
 #include <asm/uaccess.h>
 
@@ -113,15 +114,15 @@ static struct ib_client ucm_client = {
        .remove = ib_ucm_remove_one
 };
 
-DECLARE_MUTEX(ctx_id_mutex);
-DEFINE_IDR(ctx_id_table);
+static DEFINE_MUTEX(ctx_id_mutex);
+static DEFINE_IDR(ctx_id_table);
 static DECLARE_BITMAP(dev_map, IB_UCM_MAX_DEVICES);
 
 static struct ib_ucm_context *ib_ucm_ctx_get(struct ib_ucm_file *file, int id)
 {
        struct ib_ucm_context *ctx;
 
-       down(&ctx_id_mutex);
+       mutex_lock(&ctx_id_mutex);
        ctx = idr_find(&ctx_id_table, id);
        if (!ctx)
                ctx = ERR_PTR(-ENOENT);
@@ -129,7 +130,7 @@ static struct ib_ucm_context *ib_ucm_ctx_get(struct ib_ucm_file *file, int id)
                ctx = ERR_PTR(-EINVAL);
        else
                atomic_inc(&ctx->ref);
-       up(&ctx_id_mutex);
+       mutex_unlock(&ctx_id_mutex);
 
        return ctx;
 }
@@ -172,11 +173,10 @@ static struct ib_ucm_context *ib_ucm_ctx_alloc(struct ib_ucm_file *file)
        struct ib_ucm_context *ctx;
        int result;
 
-       ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
+       ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
        if (!ctx)
                return NULL;
 
-       memset(ctx, 0, sizeof *ctx);
        atomic_set(&ctx->ref, 1);
        init_waitqueue_head(&ctx->wait);
        ctx->file = file;
@@ -187,9 +187,9 @@ static struct ib_ucm_context *ib_ucm_ctx_alloc(struct ib_ucm_file *file)
                if (!result)
                        goto error;
 
-               down(&ctx_id_mutex);
+               mutex_lock(&ctx_id_mutex);
                result = idr_get_new(&ctx_id_table, ctx, &ctx->id);
-               up(&ctx_id_mutex);
+               mutex_unlock(&ctx_id_mutex);
        } while (result == -EAGAIN);
 
        if (result)
@@ -386,11 +386,10 @@ static int ib_ucm_event_handler(struct ib_cm_id *cm_id,
 
        ctx = cm_id->context;
 
-       uevent = kmalloc(sizeof(*uevent), GFP_KERNEL);
+       uevent = kzalloc(sizeof *uevent, GFP_KERNEL);
        if (!uevent)
                goto err1;
 
-       memset(uevent, 0, sizeof(*uevent));
        uevent->ctx = ctx;
        uevent->cm_id = cm_id;
        uevent->resp.uid = ctx->uid;
@@ -552,9 +551,9 @@ static ssize_t ib_ucm_create_id(struct ib_ucm_file *file,
 err2:
        ib_destroy_cm_id(ctx->cm_id);
 err1:
-       down(&ctx_id_mutex);
+       mutex_lock(&ctx_id_mutex);
        idr_remove(&ctx_id_table, ctx->id);
-       up(&ctx_id_mutex);
+       mutex_unlock(&ctx_id_mutex);
        kfree(ctx);
        return result;
 }
@@ -574,7 +573,7 @@ static ssize_t ib_ucm_destroy_id(struct ib_ucm_file *file,
        if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
                return -EFAULT;
 
-       down(&ctx_id_mutex);
+       mutex_lock(&ctx_id_mutex);
        ctx = idr_find(&ctx_id_table, cmd.id);
        if (!ctx)
                ctx = ERR_PTR(-ENOENT);
@@ -582,7 +581,7 @@ static ssize_t ib_ucm_destroy_id(struct ib_ucm_file *file,
                ctx = ERR_PTR(-EINVAL);
        else
                idr_remove(&ctx_id_table, ctx->id);
-       up(&ctx_id_mutex);
+       mutex_unlock(&ctx_id_mutex);
 
        if (IS_ERR(ctx))
                return PTR_ERR(ctx);
@@ -1282,9 +1281,9 @@ static int ib_ucm_close(struct inode *inode, struct file *filp)
                                 struct ib_ucm_context, file_list);
                up(&file->mutex);
 
-               down(&ctx_id_mutex);
+               mutex_lock(&ctx_id_mutex);
                idr_remove(&ctx_id_table, ctx->id);
-               up(&ctx_id_mutex);
+               mutex_unlock(&ctx_id_mutex);
 
                ib_destroy_cm_id(ctx->cm_id);
                ib_ucm_cleanup_events(ctx);
@@ -1320,15 +1319,6 @@ static struct class ucm_class = {
        .release = ib_ucm_release_class_dev
 };
 
-static ssize_t show_dev(struct class_device *class_dev, char *buf)
-{
-       struct ib_ucm_device *dev;
-       
-       dev = container_of(class_dev, struct ib_ucm_device, class_dev);
-       return print_dev_t(buf, dev->dev.dev);
-}
-static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
-
 static ssize_t show_ibdev(struct class_device *class_dev, char *buf)
 {
        struct ib_ucm_device *dev;
@@ -1345,11 +1335,10 @@ static void ib_ucm_add_one(struct ib_device *device)
        if (!device->alloc_ucontext)
                return;
 
-       ucm_dev = kmalloc(sizeof *ucm_dev, GFP_KERNEL);
+       ucm_dev = kzalloc(sizeof *ucm_dev, GFP_KERNEL);
        if (!ucm_dev)
                return;
 
-       memset(ucm_dev, 0, sizeof *ucm_dev);
        ucm_dev->ib_dev = device;
 
        ucm_dev->devnum = find_first_zero_bit(dev_map, IB_UCM_MAX_DEVICES);
@@ -1366,14 +1355,12 @@ static void ib_ucm_add_one(struct ib_device *device)
 
        ucm_dev->class_dev.class = &ucm_class;
        ucm_dev->class_dev.dev = device->dma_device;
+       ucm_dev->class_dev.devt = ucm_dev->dev.dev;
        snprintf(ucm_dev->class_dev.class_id, BUS_ID_SIZE, "ucm%d",
                 ucm_dev->devnum);
        if (class_device_register(&ucm_dev->class_dev))
                goto err_cdev;
 
-       if (class_device_create_file(&ucm_dev->class_dev,
-                                    &class_device_attr_dev))
-               goto err_class;
        if (class_device_create_file(&ucm_dev->class_dev,
                                     &class_device_attr_ibdev))
                goto err_class;
@@ -1450,6 +1437,7 @@ static void __exit ib_ucm_cleanup(void)
        ib_unregister_client(&ucm_client);
        class_unregister(&ucm_class);
        unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
+       idr_destroy(&ctx_id_table);
 }
 
 module_init(ib_ucm_init);