IB/umad: Remove port_table[]
We no longer need this data structure, as it was used to associate an inode back to a struct ib_umad_port during ->open(). But now that we're embedding a struct cdev in struct ib_umad_port, we can use the container_of() macro to go from the inode back to the device instead. Signed-off-by: Alex Chiang <achiang@hp.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
2b937afcab
commit
6aa2a86ec4
|
@ -65,12 +65,9 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Our lifetime rules for these structs are the following: each time a
|
* Our lifetime rules for these structs are the following:
|
||||||
* device special file is opened, we look up the corresponding struct
|
* device special file is opened, we take a reference on the
|
||||||
* ib_umad_port by minor in the umad_port[] table while holding the
|
* ib_umad_port's struct ib_umad_device. We drop these
|
||||||
* port_lock. If this lookup succeeds, we take a reference on the
|
|
||||||
* ib_umad_port's struct ib_umad_device while still holding the
|
|
||||||
* port_lock; if the lookup fails, we fail the open(). We drop these
|
|
||||||
* references in the corresponding close().
|
* references in the corresponding close().
|
||||||
*
|
*
|
||||||
* In addition to references coming from open character devices, there
|
* In addition to references coming from open character devices, there
|
||||||
|
@ -78,12 +75,7 @@ enum {
|
||||||
* module's reference taken when allocating the ib_umad_device in
|
* module's reference taken when allocating the ib_umad_device in
|
||||||
* ib_umad_add_one().
|
* ib_umad_add_one().
|
||||||
*
|
*
|
||||||
* When destroying an ib_umad_device, we clear all of its
|
* When destroying an ib_umad_device, we drop the module's reference.
|
||||||
* ib_umad_ports from umad_port[] while holding port_lock before
|
|
||||||
* dropping the module's reference to the ib_umad_device. This is
|
|
||||||
* always safe because any open() calls will either succeed and obtain
|
|
||||||
* a reference before we clear the umad_port[] entries, or fail after
|
|
||||||
* we clear the umad_port[] entries.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct ib_umad_port {
|
struct ib_umad_port {
|
||||||
|
@ -136,7 +128,6 @@ static struct class *umad_class;
|
||||||
static const dev_t base_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE);
|
static const dev_t base_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE);
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(port_lock);
|
static DEFINE_SPINLOCK(port_lock);
|
||||||
static struct ib_umad_port *umad_port[IB_UMAD_MAX_PORTS];
|
|
||||||
static DECLARE_BITMAP(dev_map, IB_UMAD_MAX_PORTS);
|
static DECLARE_BITMAP(dev_map, IB_UMAD_MAX_PORTS);
|
||||||
|
|
||||||
static void ib_umad_add_one(struct ib_device *device);
|
static void ib_umad_add_one(struct ib_device *device);
|
||||||
|
@ -779,15 +770,11 @@ static long ib_umad_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||||
/*
|
/*
|
||||||
* ib_umad_open() does not need the BKL:
|
* ib_umad_open() does not need the BKL:
|
||||||
*
|
*
|
||||||
* - umad_port[] accesses are protected by port_lock, the
|
* - the ib_umad_port structures are properly reference counted, and
|
||||||
* ib_umad_port structures are properly reference counted, and
|
|
||||||
* everything else is purely local to the file being created, so
|
* everything else is purely local to the file being created, so
|
||||||
* races against other open calls are not a problem;
|
* races against other open calls are not a problem;
|
||||||
* - the ioctl method does not affect any global state outside of the
|
* - the ioctl method does not affect any global state outside of the
|
||||||
* file structure being operated on;
|
* file structure being operated on;
|
||||||
* - the port is added to umad_port[] as the last part of module
|
|
||||||
* initialization so the open method will either immediately run
|
|
||||||
* -ENXIO, or all required initialization will be done.
|
|
||||||
*/
|
*/
|
||||||
static int ib_umad_open(struct inode *inode, struct file *filp)
|
static int ib_umad_open(struct inode *inode, struct file *filp)
|
||||||
{
|
{
|
||||||
|
@ -795,13 +782,10 @@ static int ib_umad_open(struct inode *inode, struct file *filp)
|
||||||
struct ib_umad_file *file;
|
struct ib_umad_file *file;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
spin_lock(&port_lock);
|
port = container_of(inode->i_cdev, struct ib_umad_port, cdev);
|
||||||
port = umad_port[iminor(inode) - IB_UMAD_MINOR_BASE];
|
|
||||||
if (port)
|
if (port)
|
||||||
kref_get(&port->umad_dev->ref);
|
kref_get(&port->umad_dev->ref);
|
||||||
spin_unlock(&port_lock);
|
else
|
||||||
|
|
||||||
if (!port)
|
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
mutex_lock(&port->file_mutex);
|
mutex_lock(&port->file_mutex);
|
||||||
|
@ -892,13 +876,10 @@ static int ib_umad_sm_open(struct inode *inode, struct file *filp)
|
||||||
};
|
};
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock(&port_lock);
|
port = container_of(inode->i_cdev, struct ib_umad_port, sm_cdev);
|
||||||
port = umad_port[iminor(inode) - IB_UMAD_MINOR_BASE - IB_UMAD_MAX_PORTS];
|
|
||||||
if (port)
|
if (port)
|
||||||
kref_get(&port->umad_dev->ref);
|
kref_get(&port->umad_dev->ref);
|
||||||
spin_unlock(&port_lock);
|
else
|
||||||
|
|
||||||
if (!port)
|
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
if (filp->f_flags & O_NONBLOCK) {
|
if (filp->f_flags & O_NONBLOCK) {
|
||||||
|
@ -1042,10 +1023,6 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
|
||||||
if (device_create_file(port->sm_dev, &dev_attr_port))
|
if (device_create_file(port->sm_dev, &dev_attr_port))
|
||||||
goto err_sm_dev;
|
goto err_sm_dev;
|
||||||
|
|
||||||
spin_lock(&port_lock);
|
|
||||||
umad_port[port->dev_num] = port;
|
|
||||||
spin_unlock(&port_lock);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_sm_dev:
|
err_sm_dev:
|
||||||
|
@ -1079,10 +1056,6 @@ static void ib_umad_kill_port(struct ib_umad_port *port)
|
||||||
cdev_del(&port->cdev);
|
cdev_del(&port->cdev);
|
||||||
cdev_del(&port->sm_cdev);
|
cdev_del(&port->sm_cdev);
|
||||||
|
|
||||||
spin_lock(&port_lock);
|
|
||||||
umad_port[port->dev_num] = NULL;
|
|
||||||
spin_unlock(&port_lock);
|
|
||||||
|
|
||||||
mutex_lock(&port->file_mutex);
|
mutex_lock(&port->file_mutex);
|
||||||
|
|
||||||
port->ib_dev = NULL;
|
port->ib_dev = NULL;
|
||||||
|
|
Loading…
Reference in New Issue