Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 055422dd authored by Alexander Chiang's avatar Alexander Chiang Committed by Roland Dreier
Browse files

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: default avatarAlex Chiang <achiang@hp.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 676ad585
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#include <linux/idr.h>
#include <linux/mutex.h>
#include <linux/completion.h>
#include <linux/cdev.h>

#include <rdma/ib_verbs.h>
#include <rdma/ib_umem.h>
@@ -69,12 +70,12 @@

struct ib_uverbs_device {
	struct kref				ref;
	int					num_comp_vectors;
	struct completion			comp;
	int					devnum;
	struct cdev			       *cdev;
	struct device			       *dev;
	struct ib_device		       *ib_dev;
	int					num_comp_vectors;
	int					devnum;
	struct cdev			        cdev;
};

struct ib_uverbs_event_file {
+10 −13
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/mount.h>
#include <linux/cdev.h>

#include <asm/uaccess.h>

@@ -761,17 +760,15 @@ static void ib_uverbs_add_one(struct ib_device *device)
	uverbs_dev->ib_dev           = device;
	uverbs_dev->num_comp_vectors = device->num_comp_vectors;

	uverbs_dev->cdev = cdev_alloc();
	if (!uverbs_dev->cdev)
		goto err;
	uverbs_dev->cdev->owner = THIS_MODULE;
	uverbs_dev->cdev->ops = device->mmap ? &uverbs_mmap_fops : &uverbs_fops;
	kobject_set_name(&uverbs_dev->cdev->kobj, "uverbs%d", uverbs_dev->devnum);
	if (cdev_add(uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
	cdev_init(&uverbs_dev->cdev, NULL);
	uverbs_dev->cdev.owner = THIS_MODULE;
	uverbs_dev->cdev.ops = device->mmap ? &uverbs_mmap_fops : &uverbs_fops;
	kobject_set_name(&uverbs_dev->cdev.kobj, "uverbs%d", uverbs_dev->devnum);
	if (cdev_add(&uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
		goto err_cdev;

	uverbs_dev->dev = device_create(uverbs_class, device->dma_device,
					uverbs_dev->cdev->dev, uverbs_dev,
					uverbs_dev->cdev.dev, uverbs_dev,
					"uverbs%d", uverbs_dev->devnum);
	if (IS_ERR(uverbs_dev->dev))
		goto err_cdev;
@@ -790,10 +787,10 @@ static void ib_uverbs_add_one(struct ib_device *device)
	return;

err_class:
	device_destroy(uverbs_class, uverbs_dev->cdev->dev);
	device_destroy(uverbs_class, uverbs_dev->cdev.dev);

err_cdev:
	cdev_del(uverbs_dev->cdev);
	cdev_del(&uverbs_dev->cdev);
	clear_bit(uverbs_dev->devnum, dev_map);

err:
@@ -811,8 +808,8 @@ static void ib_uverbs_remove_one(struct ib_device *device)
		return;

	dev_set_drvdata(uverbs_dev->dev, NULL);
	device_destroy(uverbs_class, uverbs_dev->cdev->dev);
	cdev_del(uverbs_dev->cdev);
	device_destroy(uverbs_class, uverbs_dev->cdev.dev);
	cdev_del(&uverbs_dev->cdev);

	spin_lock(&map_lock);
	dev_table[uverbs_dev->devnum] = NULL;