aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Chiang <achiang@hp.com>2010-02-02 14:07:49 -0500
committerRoland Dreier <rolandd@cisco.com>2010-02-24 13:23:39 -0500
commit055422ddbb0a7610c5f57a056743d7336a39e90f (patch)
tree656f63c23151a9b582bc570daa38398d5269246f
parent676ad585531e965416fd958747894541dabcec96 (diff)
IB/uverbs: Convert *cdev to cdev in struct ib_uverbs_device
Instead of storing a pointer to a cdev, embed the entire struct cdev. This change allows us to use the container_of() macro in ib_uverbs_open() in a future patch. This change increases the size of struct ib_uverbs_device to 168 bytes across 3 cachelines from 80 bytes in 2 cachelines. However, we rearrange the members so that everything fits into the first cacheline except for the struct cdev. Finally, we don't touch the cdev in any fastpaths, so this change shouldn't negatively affect performance. Signed-off-by: Alex Chiang <achiang@hp.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/core/uverbs.h7
-rw-r--r--drivers/infiniband/core/uverbs_main.c23
2 files changed, 14 insertions, 16 deletions
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h
index b3ea9587dc80..e695f65328a3 100644
--- a/drivers/infiniband/core/uverbs.h
+++ b/drivers/infiniband/core/uverbs.h
@@ -41,6 +41,7 @@
41#include <linux/idr.h> 41#include <linux/idr.h>
42#include <linux/mutex.h> 42#include <linux/mutex.h>
43#include <linux/completion.h> 43#include <linux/completion.h>
44#include <linux/cdev.h>
44 45
45#include <rdma/ib_verbs.h> 46#include <rdma/ib_verbs.h>
46#include <rdma/ib_umem.h> 47#include <rdma/ib_umem.h>
@@ -69,12 +70,12 @@
69 70
70struct ib_uverbs_device { 71struct ib_uverbs_device {
71 struct kref ref; 72 struct kref ref;
73 int num_comp_vectors;
72 struct completion comp; 74 struct completion comp;
73 int devnum;
74 struct cdev *cdev;
75 struct device *dev; 75 struct device *dev;
76 struct ib_device *ib_dev; 76 struct ib_device *ib_dev;
77 int num_comp_vectors; 77 int devnum;
78 struct cdev cdev;
78}; 79};
79 80
80struct ib_uverbs_event_file { 81struct ib_uverbs_event_file {
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index 5f284ffd430e..5da9a734959a 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -43,7 +43,6 @@
43#include <linux/sched.h> 43#include <linux/sched.h>
44#include <linux/file.h> 44#include <linux/file.h>
45#include <linux/mount.h> 45#include <linux/mount.h>
46#include <linux/cdev.h>
47 46
48#include <asm/uaccess.h> 47#include <asm/uaccess.h>
49 48
@@ -761,17 +760,15 @@ static void ib_uverbs_add_one(struct ib_device *device)
761 uverbs_dev->ib_dev = device; 760 uverbs_dev->ib_dev = device;
762 uverbs_dev->num_comp_vectors = device->num_comp_vectors; 761 uverbs_dev->num_comp_vectors = device->num_comp_vectors;
763 762
764 uverbs_dev->cdev = cdev_alloc(); 763 cdev_init(&uverbs_dev->cdev, NULL);
765 if (!uverbs_dev->cdev) 764 uverbs_dev->cdev.owner = THIS_MODULE;
766 goto err; 765 uverbs_dev->cdev.ops = device->mmap ? &uverbs_mmap_fops : &uverbs_fops;
767 uverbs_dev->cdev->owner = THIS_MODULE; 766 kobject_set_name(&uverbs_dev->cdev.kobj, "uverbs%d", uverbs_dev->devnum);
768 uverbs_dev->cdev->ops = device->mmap ? &uverbs_mmap_fops : &uverbs_fops; 767 if (cdev_add(&uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
769 kobject_set_name(&uverbs_dev->cdev->kobj, "uverbs%d", uverbs_dev->devnum);
770 if (cdev_add(uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
771 goto err_cdev; 768 goto err_cdev;
772 769
773 uverbs_dev->dev = device_create(uverbs_class, device->dma_device, 770 uverbs_dev->dev = device_create(uverbs_class, device->dma_device,
774 uverbs_dev->cdev->dev, uverbs_dev, 771 uverbs_dev->cdev.dev, uverbs_dev,
775 "uverbs%d", uverbs_dev->devnum); 772 "uverbs%d", uverbs_dev->devnum);
776 if (IS_ERR(uverbs_dev->dev)) 773 if (IS_ERR(uverbs_dev->dev))
777 goto err_cdev; 774 goto err_cdev;
@@ -790,10 +787,10 @@ static void ib_uverbs_add_one(struct ib_device *device)
790 return; 787 return;
791 788
792err_class: 789err_class:
793 device_destroy(uverbs_class, uverbs_dev->cdev->dev); 790 device_destroy(uverbs_class, uverbs_dev->cdev.dev);
794 791
795err_cdev: 792err_cdev:
796 cdev_del(uverbs_dev->cdev); 793 cdev_del(&uverbs_dev->cdev);
797 clear_bit(uverbs_dev->devnum, dev_map); 794 clear_bit(uverbs_dev->devnum, dev_map);
798 795
799err: 796err:
@@ -811,8 +808,8 @@ static void ib_uverbs_remove_one(struct ib_device *device)
811 return; 808 return;
812 809
813 dev_set_drvdata(uverbs_dev->dev, NULL); 810 dev_set_drvdata(uverbs_dev->dev, NULL);
814 device_destroy(uverbs_class, uverbs_dev->cdev->dev); 811 device_destroy(uverbs_class, uverbs_dev->cdev.dev);
815 cdev_del(uverbs_dev->cdev); 812 cdev_del(&uverbs_dev->cdev);
816 813
817 spin_lock(&map_lock); 814 spin_lock(&map_lock);
818 dev_table[uverbs_dev->devnum] = NULL; 815 dev_table[uverbs_dev->devnum] = NULL;