Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Dec 2016 10:38:30 +0100
From:      Michal Meloun <melounmichal@gmail.com>
To:        Hans Petter Selasky <hselasky@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r310559 - in head/sys/compat/linuxkpi/common: include/linux src
Message-ID:  <eb3ae7ea-0881-d76f-788e-c200aa22fc45@freebsd.org>
In-Reply-To: <201612260118.uBQ1I8Dm015288@repo.freebsd.org>
References:  <201612260118.uBQ1I8Dm015288@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help


On 26.12.2016 2:18, Hans Petter Selasky wrote:
> Author: hselasky
> Date: Mon Dec 26 01:18:07 2016
> New Revision: 310559
> URL: https://svnweb.freebsd.org/changeset/base/310559
> 
> Log:
>   Implement register and unregister chrdev in the LinuxKPI.
>   
>   Obtained from:	kmacy @
>   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/fs.h
>   head/sys/compat/linuxkpi/common/src/linux_compat.c
> 
> Modified: head/sys/compat/linuxkpi/common/include/linux/cdev.h
> ==============================================================================
> --- head/sys/compat/linuxkpi/common/include/linux/cdev.h	Sun Dec 25 22:32:16 2016	(r310558)
> +++ head/sys/compat/linuxkpi/common/include/linux/cdev.h	Mon Dec 26 01:18:07 2016	(r310559)
> @@ -95,7 +95,7 @@ cdev_add(struct linux_cdev *cdev, dev_t 
>  	args.mda_gid = 0;
>  	args.mda_mode = 0700;
>  	args.mda_si_drv1 = cdev;
> -	args.mda_unit = MINOR(dev);
> +	args.mda_unit = dev;
>  
>  	error = make_dev_s(&args, &cdev->cdev, "%s",
>  	    kobject_name(&cdev->kobj));
> @@ -121,7 +121,7 @@ cdev_add_ext(struct linux_cdev *cdev, de
>  	args.mda_gid = gid;
>  	args.mda_mode = mode;
>  	args.mda_si_drv1 = cdev;
> -	args.mda_unit = MINOR(dev);
> +	args.mda_unit = dev;
>  
>  	error = make_dev_s(&args, &cdev->cdev, "%s/%d",
>  	    kobject_name(&cdev->kobj), MINOR(dev));
> @@ -142,6 +142,8 @@ cdev_del(struct linux_cdev *cdev)
>  	kobject_put(&cdev->kobj);
>  }
>  
> +struct linux_cdev *linux_find_cdev(const char *name, unsigned major, unsigned minor);
> +
>  #define	cdev	linux_cdev
>  
>  #endif	/* _LINUX_CDEV_H_ */
> 
> Modified: head/sys/compat/linuxkpi/common/include/linux/fs.h
> ==============================================================================
> --- head/sys/compat/linuxkpi/common/include/linux/fs.h	Sun Dec 25 22:32:16 2016	(r310558)
> +++ head/sys/compat/linuxkpi/common/include/linux/fs.h	Mon Dec 26 01:18:07 2016	(r310559)
> @@ -2,7 +2,7 @@
>   * Copyright (c) 2010 Isilon Systems, Inc.
>   * Copyright (c) 2010 iX Systems, Inc.
>   * Copyright (c) 2010 Panasas, Inc.
> - * Copyright (c) 2013 Mellanox Technologies, Ltd.
> + * Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms, with or without
> @@ -151,6 +151,39 @@ struct file_operations {
>  #define	FMODE_WRITE	FWRITE
>  #define	FMODE_EXEC	FEXEC
>  
> +int __register_chrdev(unsigned int major, unsigned int baseminor,
> +    unsigned int count, const char *name,
> +    const struct file_operations *fops);
> +int __register_chrdev_p(unsigned int major, unsigned int baseminor,
> +    unsigned int count, const char *name,
> +    const struct file_operations *fops, uid_t uid,
> +    gid_t gid, int mode);
> +void __unregister_chrdev(unsigned int major, unsigned int baseminor,
> +    unsigned int count, const char *name);
> +
> +static inline void
> +unregister_chrdev(unsigned int major, const char *name)
> +{
> +
> +	__unregister_chrdev(major, 0, 256, name);
> +}
> +
> +static inline int
> +register_chrdev(unsigned int major, const char *name,
> +    const struct file_operations *fops)
> +{
> +
> +	return (__register_chrdev(major, 0, 256, name, fops));
> +}
> +
> +static inline int
> +register_chrdev_p(unsigned int major, const char *name,
> +    const struct file_operations *fops, uid_t uid, gid_t gid, int mode)
> +{
> +
> +	return (__register_chrdev_p(major, 0, 256, name, fops, uid, gid, mode));
> +}
> +
>  static inline int
>  register_chrdev_region(dev_t dev, unsigned range, const char *name)
>  {
> @@ -184,7 +217,7 @@ static inline dev_t
>  iminor(struct inode *inode)
>  {
>  
> -	return dev2unit(inode->v_rdev);
> +	return (MINOR(dev2unit(inode->v_rdev)));

This breaks many kernels:

 --- all_subdir_ibcore ---
 In file included from
/usr2/Meloun/svn/src/sys/modules/ibcore/../../ofed/drivers/infiniband/core/ucma.c:34:
 In file included from
/usr2/Meloun/svn/src/sys/modules/ibcore/../../compat/linuxkpi/common/include/linux/file.h:41:
 /usr2/Meloun/svn/src/sys/modules/ibcore/../../compat/linuxkpi/common/include/linux/fs.h:220:10: error: implicit declaration of function 'MINOR' is invalid in C99
 [-Werror,-Wimplicit-function-declaration]
         return (MINOR(dev2unit(inode->v_rdev)));
                 ^



>  }
>  
>  static inline struct inode *
> 
> Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
> ==============================================================================
> --- head/sys/compat/linuxkpi/common/src/linux_compat.c	Sun Dec 25 22:32:16 2016	(r310558)
> +++ head/sys/compat/linuxkpi/common/src/linux_compat.c	Mon Dec 26 01:18:07 2016	(r310559)
> @@ -1418,6 +1418,82 @@ linux_irq_handler(void *ent)
>  	irqe->handler(irqe->irq, irqe->arg);
>  }
>  
> +struct linux_cdev *
> +linux_find_cdev(const char *name, unsigned major, unsigned minor)
> +{
> +	int unit = MKDEV(major, minor);
> +	struct cdev *cdev;
> +
> +	dev_lock();
> +	LIST_FOREACH(cdev, &linuxcdevsw.d_devs, si_list) {
> +		struct linux_cdev *ldev = cdev->si_drv1;
> +		if (dev2unit(cdev) == unit &&
> +		    strcmp(kobject_name(&ldev->kobj), name) == 0) {
> +			break;
> +		}
> +	}
> +	dev_unlock();
> +
> +	return (cdev != NULL ? cdev->si_drv1 : NULL);
> +}
> +
> +int
> +__register_chrdev(unsigned int major, unsigned int baseminor,
> +    unsigned int count, const char *name,
> +    const struct file_operations *fops)
> +{
> +	struct linux_cdev *cdev;
> +	int ret = 0;
> +	int i;
> +
> +	for (i = baseminor; i < baseminor + count; i++) {
> +		cdev = cdev_alloc();
> +		cdev_init(cdev, fops);
> +		kobject_set_name(&cdev->kobj, name);
> +
> +		ret = cdev_add(cdev, makedev(major, i), 1);
> +		if (ret != 0)
> +			break;
> +	}
> +	return (ret);
> +}
> +
> +int
> +__register_chrdev_p(unsigned int major, unsigned int baseminor,
> +    unsigned int count, const char *name,
> +    const struct file_operations *fops, uid_t uid,
> +    gid_t gid, int mode)
> +{
> +	struct linux_cdev *cdev;
> +	int ret = 0;
> +	int i;
> +
> +	for (i = baseminor; i < baseminor + count; i++) {
> +		cdev = cdev_alloc();
> +		cdev_init(cdev, fops);
> +		kobject_set_name(&cdev->kobj, name);
> +
> +		ret = cdev_add_ext(cdev, makedev(major, i), uid, gid, mode);
> +		if (ret != 0)
> +			break;
> +	}
> +	return (ret);
> +}
> +
> +void
> +__unregister_chrdev(unsigned int major, unsigned int baseminor,
> +    unsigned int count, const char *name)
> +{
> +	struct linux_cdev *cdevp;
> +	int i;
> +
> +	for (i = baseminor; i < baseminor + count; i++) {
> +		cdevp = linux_find_cdev(name, major, i);
> +		if (cdevp != NULL)
> +			cdev_del(cdevp);
> +	}
> +}
> +
>  #if defined(__i386__) || defined(__amd64__)
>  bool linux_cpu_has_clflush;
>  #endif
> 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?eb3ae7ea-0881-d76f-788e-c200aa22fc45>