Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Dec 2015 12:30:19 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r292987 - in head/sys/compat/linuxkpi/common: include/linux src
Message-ID:  <201512311230.tBVCUJB7094023@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Thu Dec 31 12:30:19 2015
New Revision: 292987
URL: https://svnweb.freebsd.org/changeset/base/292987

Log:
  Minor LinuxKPI code cleanup:
  - Declare some static functions in linux_compat.c instead if inside
    various header files.
  - Prefix FreeBSD local functions in the LinuxKPI with "linux_" to
    avoid symbol name conflicts in the future and to make debugging
    easier.
  - Make the "struct kobj_ktype" declaractions constant to shave off a
    few bytes from the data segment.
  
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/cdev.h
  head/sys/compat/linuxkpi/common/include/linux/device.h
  head/sys/compat/linuxkpi/common/include/linux/kobject.h
  head/sys/compat/linuxkpi/common/include/linux/miscdevice.h
  head/sys/compat/linuxkpi/common/src/linux_compat.c
  head/sys/compat/linuxkpi/common/src/linux_pci.c

Modified: head/sys/compat/linuxkpi/common/include/linux/cdev.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/cdev.h	Thu Dec 31 11:27:36 2015	(r292986)
+++ head/sys/compat/linuxkpi/common/include/linux/cdev.h	Thu Dec 31 12:30:19 2015	(r292987)
@@ -41,6 +41,8 @@ struct inode;
 struct module;
 
 extern struct cdevsw linuxcdevsw;
+extern const struct kobj_type linux_cdev_ktype;
+extern const struct kobj_type linux_cdev_static_ktype;
 
 struct linux_cdev {
 	struct kobject	kobj;
@@ -51,45 +53,10 @@ struct linux_cdev {
 };
 
 static inline void
-cdev_release(struct kobject *kobj)
-{
-	struct linux_cdev *cdev;
-	struct kobject *parent;
-
-	cdev = container_of(kobj, struct linux_cdev, kobj);
-	parent = kobj->parent;
-	if (cdev->cdev)
-		destroy_dev(cdev->cdev);
-	kfree(cdev);
-	kobject_put(parent);
-}
-
-static inline void
-cdev_static_release(struct kobject *kobj)
-{
-	struct linux_cdev *cdev;
-	struct kobject *parent;
-
-	cdev = container_of(kobj, struct linux_cdev, kobj);
-	parent = kobj->parent;
-	if (cdev->cdev)
-		destroy_dev(cdev->cdev);
-	kobject_put(parent);
-}
-
-static struct kobj_type cdev_ktype = {
-	.release = cdev_release,
-};
-
-static struct kobj_type cdev_static_ktype = {
-	.release = cdev_static_release,
-};
-
-static inline void
 cdev_init(struct linux_cdev *cdev, const struct file_operations *ops)
 {
 
-	kobject_init(&cdev->kobj, &cdev_static_ktype);
+	kobject_init(&cdev->kobj, &linux_cdev_static_ktype);
 	cdev->ops = ops;
 }
 
@@ -100,7 +67,7 @@ cdev_alloc(void)
 
 	cdev = kzalloc(sizeof(struct linux_cdev), M_WAITOK);
 	if (cdev)
-		kobject_init(&cdev->kobj, &cdev_ktype);
+		kobject_init(&cdev->kobj, &linux_cdev_ktype);
 	return (cdev);
 }
 

Modified: head/sys/compat/linuxkpi/common/include/linux/device.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/device.h	Thu Dec 31 11:27:36 2015	(r292986)
+++ head/sys/compat/linuxkpi/common/include/linux/device.h	Thu Dec 31 12:30:19 2015	(r292987)
@@ -73,8 +73,10 @@ struct device {
 	unsigned int	msix_max;
 };
 
-extern struct device linux_rootdev;
-extern struct kobject class_root;
+extern struct device linux_root_device;
+extern struct kobject linux_class_root;
+extern const struct kobj_type linux_dev_ktype;
+extern const struct kobj_type linux_class_ktype;
 
 struct class_attribute {
         struct attribute attr;
@@ -170,62 +172,14 @@ put_device(struct device *dev)
 		kobject_put(&dev->kobj);
 }
 
-static inline ssize_t
-class_show(struct kobject *kobj, struct attribute *attr, char *buf)
-{
-	struct class_attribute *dattr;
-	ssize_t error;
-
-	dattr = container_of(attr, struct class_attribute, attr);
-	error = -EIO;
-	if (dattr->show)
-		error = dattr->show(container_of(kobj, struct class, kobj),
-		    dattr, buf);
-	return (error);
-}
-
-static inline ssize_t
-class_store(struct kobject *kobj, struct attribute *attr, const char *buf,
-    size_t count)
-{
-	struct class_attribute *dattr;
-	ssize_t error;
-
-	dattr = container_of(attr, struct class_attribute, attr);
-	error = -EIO;
-	if (dattr->store)
-		error = dattr->store(container_of(kobj, struct class, kobj),
-		    dattr, buf, count);
-	return (error);
-}
-
-static inline void
-class_release(struct kobject *kobj)
-{
-	struct class *class;
-
-	class = container_of(kobj, struct class, kobj);
-	if (class->class_release)
-		class->class_release(class);
-}
-
-static struct sysfs_ops class_sysfs = {
-	.show  = class_show,
-	.store = class_store,
-};
-static struct kobj_type class_ktype = {
-	.release = class_release,
-	.sysfs_ops = &class_sysfs
-};
-
 static inline int
 class_register(struct class *class)
 {
 
 	class->bsdclass = devclass_create(class->name);
-	kobject_init(&class->kobj, &class_ktype);
+	kobject_init(&class->kobj, &linux_class_ktype);
 	kobject_set_name(&class->kobj, class->name);
-	kobject_add(&class->kobj, &class_root, class->name);
+	kobject_add(&class->kobj, &linux_class_root, class->name);
 
 	return (0);
 }
@@ -237,54 +191,6 @@ class_unregister(struct class *class)
 	kobject_put(&class->kobj);
 }
 
-static inline void
-device_release(struct kobject *kobj)
-{
-	struct device *dev;
-
-	dev = container_of(kobj, struct device, kobj);
-	/* This is the precedence defined by linux. */
-	if (dev->release)
-		dev->release(dev);
-	else if (dev->class && dev->class->dev_release)
-		dev->class->dev_release(dev);
-}
-
-static inline ssize_t
-dev_show(struct kobject *kobj, struct attribute *attr, char *buf)
-{
-	struct device_attribute *dattr;
-	ssize_t error;
-
-	dattr = container_of(attr, struct device_attribute, attr);
-	error = -EIO;
-	if (dattr->show)
-		error = dattr->show(container_of(kobj, struct device, kobj),
-		    dattr, buf);
-	return (error);
-}
-
-static inline ssize_t
-dev_store(struct kobject *kobj, struct attribute *attr, const char *buf,
-    size_t count)
-{
-	struct device_attribute *dattr;
-	ssize_t error;
-
-	dattr = container_of(attr, struct device_attribute, attr);
-	error = -EIO;
-	if (dattr->store)
-		error = dattr->store(container_of(kobj, struct device, kobj),
-		    dattr, buf, count);
-	return (error);
-}
-
-static struct sysfs_ops dev_sysfs = { .show  = dev_show, .store = dev_store, };
-static struct kobj_type dev_ktype = {
-	.release = device_release,
-	.sysfs_ops = &dev_sysfs
-};
-
 /*
  * Devices are registered and created for exporting to sysfs.  create
  * implies register and register assumes the device fields have been
@@ -311,7 +217,7 @@ device_register(struct device *dev)
 		device_set_softc(bsddev, dev);
 	}
 	dev->bsddev = bsddev;
-	kobject_init(&dev->kobj, &dev_ktype);
+	kobject_init(&dev->kobj, &linux_dev_ktype);
 	kobject_add(&dev->kobj, &dev->class->kobj, dev_name(dev));
 
 	return (0);
@@ -346,7 +252,7 @@ device_destroy(struct class *class, dev_
 }
 
 static inline void
-class_kfree(struct class *class)
+linux_class_kfree(struct class *class)
 {
 
 	kfree(class);
@@ -361,7 +267,7 @@ class_create(struct module *owner, const
 	class = kzalloc(sizeof(*class), M_WAITOK);
 	class->owner = owner;
 	class->name= name;
-	class->class_release = class_kfree;
+	class->class_release = linux_class_kfree;
 	error = class_register(class);
 	if (error) {
 		kfree(class);
@@ -414,7 +320,8 @@ class_remove_file(struct class *class, c
 		sysfs_remove_file(&class->kobj, &attr->attr);
 }
 
-static inline int dev_to_node(struct device *dev)
+static inline int
+dev_to_node(struct device *dev)
 {
                 return -1;
 }

Modified: head/sys/compat/linuxkpi/common/include/linux/kobject.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/kobject.h	Thu Dec 31 11:27:36 2015	(r292986)
+++ head/sys/compat/linuxkpi/common/include/linux/kobject.h	Thu Dec 31 12:30:19 2015	(r292987)
@@ -46,13 +46,13 @@ struct kobj_type {
 	struct attribute **default_attrs;
 };
 
-extern struct kobj_type kfree_type;
+extern const struct kobj_type linux_kfree_type;
 
 struct kobject {
 	struct kobject		*parent;
 	char			*name;
 	struct kref		kref;
-	struct kobj_type	*ktype;
+	const struct kobj_type	*ktype;
 	struct list_head	entry;
 	struct sysctl_oid	*oidp;
 };
@@ -74,7 +74,7 @@ struct kobj_attribute {
 };
 
 static inline void
-kobject_init(struct kobject *kobj, struct kobj_type *ktype)
+kobject_init(struct kobject *kobj, const struct kobj_type *ktype)
 {
 
 	kref_init(&kobj->kref);
@@ -83,15 +83,14 @@ kobject_init(struct kobject *kobj, struc
 	kobj->oidp = NULL;
 }
 
-static inline void kobject_put(struct kobject *kobj);
-void kobject_release(struct kref *kref);
+void linux_kobject_release(struct kref *kref);
 
 static inline void
 kobject_put(struct kobject *kobj)
 {
 
 	if (kobj)
-		kref_put(&kobj->kref, kobject_release);
+		kref_put(&kobj->kref, linux_kobject_release);
 }
 
 static inline struct kobject *
@@ -115,7 +114,7 @@ kobject_create(void)
 	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
 	if (kobj == NULL)
 		return (NULL);
-	kobject_init(kobj, &kfree_type);
+	kobject_init(kobj, &linux_kfree_type);
 
 	return (kobj);
 }
@@ -135,7 +134,6 @@ kobject_create_and_add(const char *name,
 	return (NULL);
 }
 
-
 static inline char *
 kobject_name(const struct kobject *kobj)
 {
@@ -144,7 +142,7 @@ kobject_name(const struct kobject *kobj)
 }
 
 int	kobject_set_name(struct kobject *kobj, const char *fmt, ...);
-int	kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
+int	kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype,
 	    struct kobject *parent, const char *fmt, ...);
 
 #endif /* _LINUX_KOBJECT_H_ */

Modified: head/sys/compat/linuxkpi/common/include/linux/miscdevice.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/miscdevice.h	Thu Dec 31 11:27:36 2015	(r292986)
+++ head/sys/compat/linuxkpi/common/include/linux/miscdevice.h	Thu Dec 31 12:30:19 2015	(r292987)
@@ -46,13 +46,13 @@ struct miscdevice  {
 	umode_t mode;
 };
 
-extern struct class	miscclass;
+extern struct class linux_class_misc;
 
 static inline int
 misc_register(struct miscdevice *misc)
 {
-	misc->this_device = device_create(&miscclass, &linux_rootdev, 0, misc, 
-	    misc->name);
+	misc->this_device = device_create(&linux_class_misc,
+	    &linux_root_device, 0, misc, misc->name);
 	misc->cdev = cdev_alloc();
 	if (misc->cdev == NULL)
 		return -ENOMEM;
@@ -67,7 +67,7 @@ misc_register(struct miscdevice *misc)
 static inline int
 misc_deregister(struct miscdevice *misc)
 {
-	device_destroy(&miscclass, misc->this_device->devt);
+	device_destroy(&linux_class_misc, misc->this_device->devt);
 	cdev_del(misc->cdev);
 
 	return (0);

Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c	Thu Dec 31 11:27:36 2015	(r292986)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c	Thu Dec 31 12:30:19 2015	(r292987)
@@ -77,9 +77,9 @@ MALLOC_DEFINE(M_KMALLOC, "linux", "Linux
 #undef cdev
 #define	RB_ROOT(head)	(head)->rbh_root
 
-struct kobject class_root;
-struct device linux_rootdev;
-struct class miscclass;
+struct kobject linux_class_root;
+struct device linux_root_device;
+struct class linux_class_misc;
 struct list_head pci_drivers;
 struct list_head pci_devices;
 struct net init_net;
@@ -151,10 +151,10 @@ kobject_set_name(struct kobject *kobj, c
 	return (error);
 }
 
-static inline int
+static int
 kobject_add_complete(struct kobject *kobj, struct kobject *parent)
 {
-	struct kobj_type *t;
+	const struct kobj_type *t;
 	int error;
 
 	kobj->parent = parent;
@@ -191,7 +191,7 @@ kobject_add(struct kobject *kobj, struct
 }
 
 void
-kobject_release(struct kref *kref)
+linux_kobject_release(struct kref *kref)
 {
 	struct kobject *kobj;
 	char *name;
@@ -205,28 +205,131 @@ kobject_release(struct kref *kref)
 }
 
 static void
-kobject_kfree(struct kobject *kobj)
+linux_kobject_kfree(struct kobject *kobj)
 {
 	kfree(kobj);
 }
 
 static void
-kobject_kfree_name(struct kobject *kobj)
+linux_kobject_kfree_name(struct kobject *kobj)
 {
 	if (kobj) {
 		kfree(kobj->name);
 	}
 }
 
-struct kobj_type kfree_type = { .release = kobject_kfree };
+const struct kobj_type linux_kfree_type = {
+	.release = linux_kobject_kfree
+};
 
 static void
-dev_release(struct device *dev)
+linux_device_release(struct device *dev)
 {
-	pr_debug("dev_release: %s\n", dev_name(dev));
+	pr_debug("linux_device_release: %s\n", dev_name(dev));
 	kfree(dev);
 }
 
+static ssize_t
+linux_class_show(struct kobject *kobj, struct attribute *attr, char *buf)
+{
+	struct class_attribute *dattr;
+	ssize_t error;
+
+	dattr = container_of(attr, struct class_attribute, attr);
+	error = -EIO;
+	if (dattr->show)
+		error = dattr->show(container_of(kobj, struct class, kobj),
+		    dattr, buf);
+	return (error);
+}
+
+static ssize_t
+linux_class_store(struct kobject *kobj, struct attribute *attr, const char *buf,
+    size_t count)
+{
+	struct class_attribute *dattr;
+	ssize_t error;
+
+	dattr = container_of(attr, struct class_attribute, attr);
+	error = -EIO;
+	if (dattr->store)
+		error = dattr->store(container_of(kobj, struct class, kobj),
+		    dattr, buf, count);
+	return (error);
+}
+
+static void
+linux_class_release(struct kobject *kobj)
+{
+	struct class *class;
+
+	class = container_of(kobj, struct class, kobj);
+	if (class->class_release)
+		class->class_release(class);
+}
+
+static const struct sysfs_ops linux_class_sysfs = {
+	.show  = linux_class_show,
+	.store = linux_class_store,
+};
+
+const struct kobj_type linux_class_ktype = {
+	.release = linux_class_release,
+	.sysfs_ops = &linux_class_sysfs
+};
+
+static void
+linux_dev_release(struct kobject *kobj)
+{
+	struct device *dev;
+
+	dev = container_of(kobj, struct device, kobj);
+	/* This is the precedence defined by linux. */
+	if (dev->release)
+		dev->release(dev);
+	else if (dev->class && dev->class->dev_release)
+		dev->class->dev_release(dev);
+}
+
+static ssize_t
+linux_dev_show(struct kobject *kobj, struct attribute *attr, char *buf)
+{
+	struct device_attribute *dattr;
+	ssize_t error;
+
+	dattr = container_of(attr, struct device_attribute, attr);
+	error = -EIO;
+	if (dattr->show)
+		error = dattr->show(container_of(kobj, struct device, kobj),
+		    dattr, buf);
+	return (error);
+}
+
+static ssize_t
+linux_dev_store(struct kobject *kobj, struct attribute *attr, const char *buf,
+    size_t count)
+{
+	struct device_attribute *dattr;
+	ssize_t error;
+
+	dattr = container_of(attr, struct device_attribute, attr);
+	error = -EIO;
+	if (dattr->store)
+		error = dattr->store(container_of(kobj, struct device, kobj),
+		    dattr, buf, count);
+	return (error);
+}
+
+static const struct sysfs_ops linux_dev_sysfs = {
+	.show  = linux_dev_show,
+	.store = linux_dev_store,
+};
+
+const struct kobj_type linux_dev_ktype = {
+	.release = linux_dev_release,
+	.sysfs_ops = &linux_dev_sysfs
+};
+
 struct device *
 device_create(struct class *class, struct device *parent, dev_t devt,
     void *drvdata, const char *fmt, ...)
@@ -239,7 +342,7 @@ device_create(struct class *class, struc
 	dev->class = class;
 	dev->devt = devt;
 	dev->driver_data = drvdata;
-	dev->release = dev_release;
+	dev->release = linux_device_release;
 	va_start(args, fmt);
 	kobject_set_name_vargs(&dev->kobj, fmt, args);
 	va_end(args);
@@ -249,7 +352,7 @@ device_create(struct class *class, struc
 }
 
 int
-kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
+kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype,
     struct kobject *parent, const char *fmt, ...)
 {
 	va_list args;
@@ -999,6 +1102,41 @@ destroy_workqueue(struct workqueue_struc
 }
 
 static void
+linux_cdev_release(struct kobject *kobj)
+{
+	struct linux_cdev *cdev;
+	struct kobject *parent;
+
+	cdev = container_of(kobj, struct linux_cdev, kobj);
+	parent = kobj->parent;
+	if (cdev->cdev)
+		destroy_dev(cdev->cdev);
+	kfree(cdev);
+	kobject_put(parent);
+}
+
+static void
+linux_cdev_static_release(struct kobject *kobj)
+{
+	struct linux_cdev *cdev;
+	struct kobject *parent;
+
+	cdev = container_of(kobj, struct linux_cdev, kobj);
+	parent = kobj->parent;
+	if (cdev->cdev)
+		destroy_dev(cdev->cdev);
+	kobject_put(parent);
+}
+
+const struct kobj_type linux_cdev_ktype = {
+	.release = linux_cdev_release,
+};
+
+const struct kobj_type linux_cdev_static_ktype = {
+	.release = linux_cdev_static_release,
+};
+
+static void
 linux_compat_init(void *arg)
 {
 	struct sysctl_oid *rootoid;
@@ -1006,18 +1144,18 @@ linux_compat_init(void *arg)
 
 	rootoid = SYSCTL_ADD_ROOT_NODE(NULL,
 	    OID_AUTO, "sys", CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, "sys");
-	kobject_init(&class_root, &class_ktype);
-	kobject_set_name(&class_root, "class");
-	class_root.oidp = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(rootoid),
+	kobject_init(&linux_class_root, &linux_class_ktype);
+	kobject_set_name(&linux_class_root, "class");
+	linux_class_root.oidp = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(rootoid),
 	    OID_AUTO, "class", CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, "class");
-	kobject_init(&linux_rootdev.kobj, &dev_ktype);
-	kobject_set_name(&linux_rootdev.kobj, "device");
-	linux_rootdev.kobj.oidp = SYSCTL_ADD_NODE(NULL,
+	kobject_init(&linux_root_device.kobj, &linux_dev_ktype);
+	kobject_set_name(&linux_root_device.kobj, "device");
+	linux_root_device.kobj.oidp = SYSCTL_ADD_NODE(NULL,
 	    SYSCTL_CHILDREN(rootoid), OID_AUTO, "device", CTLFLAG_RD, NULL,
 	    "device");
-	linux_rootdev.bsddev = root_bus;
-	miscclass.name = "misc";
-	class_register(&miscclass);
+	linux_root_device.bsddev = root_bus;
+	linux_class_misc.name = "misc";
+	class_register(&linux_class_misc);
 	INIT_LIST_HEAD(&pci_drivers);
 	INIT_LIST_HEAD(&pci_devices);
 	spin_lock_init(&pci_lock);
@@ -1030,9 +1168,9 @@ SYSINIT(linux_compat, SI_SUB_DRIVERS, SI
 static void
 linux_compat_uninit(void *arg)
 {
-	kobject_kfree_name(&class_root);
-	kobject_kfree_name(&linux_rootdev.kobj);
-	kobject_kfree_name(&miscclass.kobj);
+	linux_kobject_kfree_name(&linux_class_root);
+	linux_kobject_kfree_name(&linux_root_device.kobj);
+	linux_kobject_kfree_name(&linux_class_misc.kobj);
 }
 SYSUNINIT(linux_compat, SI_SUB_DRIVERS, SI_ORDER_SECOND, linux_compat_uninit, NULL);
 

Modified: head/sys/compat/linuxkpi/common/src/linux_pci.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_pci.c	Thu Dec 31 11:27:36 2015	(r292986)
+++ head/sys/compat/linuxkpi/common/src/linux_pci.c	Thu Dec 31 12:30:19 2015	(r292987)
@@ -119,16 +119,16 @@ linux_pci_attach(device_t dev)
 
 	pdrv = linux_pci_find(dev, &id);
 	pdev = device_get_softc(dev);
-	pdev->dev.parent = &linux_rootdev;
+	pdev->dev.parent = &linux_root_device;
 	pdev->dev.bsddev = dev;
 	INIT_LIST_HEAD(&pdev->dev.irqents);
 	pdev->device = id->device;
 	pdev->vendor = id->vendor;
 	pdev->dev.dma_mask = &pdev->dma_mask;
 	pdev->pdrv = pdrv;
-	kobject_init(&pdev->dev.kobj, &dev_ktype);
+	kobject_init(&pdev->dev.kobj, &linux_dev_ktype);
 	kobject_set_name(&pdev->dev.kobj, device_get_nameunit(dev));
-	kobject_add(&pdev->dev.kobj, &linux_rootdev.kobj,
+	kobject_add(&pdev->dev.kobj, &linux_root_device.kobj,
 	    kobject_name(&pdev->dev.kobj));
 	rle = _pci_get_rle(pdev, SYS_RES_IRQ, 0);
 	if (rle)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201512311230.tBVCUJB7094023>