Loading drivers/infiniband/hw/mthca/mthca_cmd.c +5 −8 Original line number Diff line number Diff line Loading @@ -199,8 +199,7 @@ static int mthca_cmd_post(struct mthca_dev *dev, { int err = 0; if (down_interruptible(&dev->cmd.hcr_sem)) return -EINTR; mutex_lock(&dev->cmd.hcr_mutex); if (event) { unsigned long end = jiffies + GO_BIT_TIMEOUT; Loading Loading @@ -238,7 +237,7 @@ static int mthca_cmd_post(struct mthca_dev *dev, op), dev->hcr + 6 * 4); out: up(&dev->cmd.hcr_sem); mutex_unlock(&dev->cmd.hcr_mutex); return err; } Loading @@ -255,8 +254,7 @@ static int mthca_cmd_poll(struct mthca_dev *dev, int err = 0; unsigned long end; if (down_interruptible(&dev->cmd.poll_sem)) return -EINTR; down(&dev->cmd.poll_sem); err = mthca_cmd_post(dev, in_param, out_param ? *out_param : 0, Loading Loading @@ -333,8 +331,7 @@ static int mthca_cmd_wait(struct mthca_dev *dev, int err = 0; struct mthca_cmd_context *context; if (down_interruptible(&dev->cmd.event_sem)) return -EINTR; down(&dev->cmd.event_sem); spin_lock(&dev->cmd.context_lock); BUG_ON(dev->cmd.free_head < 0); Loading Loading @@ -438,7 +435,7 @@ static int mthca_cmd_imm(struct mthca_dev *dev, int mthca_cmd_init(struct mthca_dev *dev) { sema_init(&dev->cmd.hcr_sem, 1); mutex_init(&dev->cmd.hcr_mutex); sema_init(&dev->cmd.poll_sem, 1); dev->cmd.use_events = 0; Loading drivers/infiniband/hw/mthca/mthca_dev.h +5 −3 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ #include <linux/pci.h> #include <linux/dma-mapping.h> #include <linux/timer.h> #include <linux/mutex.h> #include <asm/semaphore.h> #include "mthca_provider.h" Loading Loading @@ -111,7 +113,7 @@ enum { struct mthca_cmd { struct pci_pool *pool; int use_events; struct semaphore hcr_sem; struct mutex hcr_mutex; struct semaphore poll_sem; struct semaphore event_sem; int max_cmds; Loading Loading @@ -256,7 +258,7 @@ struct mthca_av_table { }; struct mthca_mcg_table { struct semaphore sem; struct mutex mutex; struct mthca_alloc alloc; struct mthca_icm_table *table; }; Loading Loading @@ -301,7 +303,7 @@ struct mthca_dev { u64 ddr_end; MTHCA_DECLARE_DOORBELL_LOCK(doorbell_lock) struct semaphore cap_mask_mutex; struct mutex cap_mask_mutex; void __iomem *hcr; void __iomem *kar; Loading drivers/infiniband/hw/mthca/mthca_main.c +8 −2 Original line number Diff line number Diff line Loading @@ -155,6 +155,13 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim return -ENODEV; } if (dev_lim->uar_size > pci_resource_len(mdev->pdev, 2)) { mthca_err(mdev, "HCA reported UAR size of 0x%x bigger than " "PCI resource 2 size of 0x%lx, aborting.\n", dev_lim->uar_size, pci_resource_len(mdev->pdev, 2)); return -ENODEV; } mdev->limits.num_ports = dev_lim->num_ports; mdev->limits.vl_cap = dev_lim->max_vl; mdev->limits.mtu_cap = dev_lim->max_mtu; Loading Loading @@ -976,8 +983,7 @@ static int __devinit mthca_init_one(struct pci_dev *pdev, err = -ENODEV; goto err_disable_pdev; } if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM) || pci_resource_len(pdev, 2) != 1 << 23) { if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) { dev_err(&pdev->dev, "Missing UAR, aborting.\n"); err = -ENODEV; goto err_disable_pdev; Loading drivers/infiniband/hw/mthca/mthca_mcg.c +7 −13 Original line number Diff line number Diff line Loading @@ -154,10 +154,7 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) return PTR_ERR(mailbox); mgm = mailbox->buf; if (down_interruptible(&dev->mcg_table.sem)) { err = -EINTR; goto err_sem; } mutex_lock(&dev->mcg_table.mutex); err = find_mgm(dev, gid->raw, mailbox, &hash, &prev, &index); if (err) Loading Loading @@ -241,8 +238,8 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) BUG_ON(index < dev->limits.num_mgms); mthca_free(&dev->mcg_table.alloc, index); } up(&dev->mcg_table.sem); err_sem: mutex_unlock(&dev->mcg_table.mutex); mthca_free_mailbox(dev, mailbox); return err; } Loading @@ -263,10 +260,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) return PTR_ERR(mailbox); mgm = mailbox->buf; if (down_interruptible(&dev->mcg_table.sem)) { err = -EINTR; goto err_sem; } mutex_lock(&dev->mcg_table.mutex); err = find_mgm(dev, gid->raw, mailbox, &hash, &prev, &index); if (err) Loading Loading @@ -371,8 +365,8 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) } out: up(&dev->mcg_table.sem); err_sem: mutex_unlock(&dev->mcg_table.mutex); mthca_free_mailbox(dev, mailbox); return err; } Loading @@ -389,7 +383,7 @@ int __devinit mthca_init_mcg_table(struct mthca_dev *dev) if (err) return err; init_MUTEX(&dev->mcg_table.sem); mutex_init(&dev->mcg_table.mutex); return 0; } Loading drivers/infiniband/hw/mthca/mthca_memfree.c +18 −18 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ enum { }; struct mthca_user_db_table { struct semaphore mutex; struct mutex mutex; struct { u64 uvirt; struct scatterlist mem; Loading Loading @@ -158,7 +158,7 @@ int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int ob int ret = 0; u8 status; down(&table->mutex); mutex_lock(&table->mutex); if (table->icm[i]) { ++table->icm[i]->refcount; Loading @@ -184,7 +184,7 @@ int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int ob ++table->icm[i]->refcount; out: up(&table->mutex); mutex_unlock(&table->mutex); return ret; } Loading @@ -198,7 +198,7 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o i = (obj & (table->num_obj - 1)) * table->obj_size / MTHCA_TABLE_CHUNK_SIZE; down(&table->mutex); mutex_lock(&table->mutex); if (--table->icm[i]->refcount == 0) { mthca_UNMAP_ICM(dev, table->virt + i * MTHCA_TABLE_CHUNK_SIZE, Loading @@ -207,7 +207,7 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o table->icm[i] = NULL; } up(&table->mutex); mutex_unlock(&table->mutex); } void *mthca_table_find(struct mthca_icm_table *table, int obj) Loading @@ -220,7 +220,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj) if (!table->lowmem) return NULL; down(&table->mutex); mutex_lock(&table->mutex); idx = (obj & (table->num_obj - 1)) * table->obj_size; icm = table->icm[idx / MTHCA_TABLE_CHUNK_SIZE]; Loading @@ -240,7 +240,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj) } out: up(&table->mutex); mutex_unlock(&table->mutex); return page ? lowmem_page_address(page) + offset : NULL; } Loading Loading @@ -301,7 +301,7 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev, table->num_obj = nobj; table->obj_size = obj_size; table->lowmem = use_lowmem; init_MUTEX(&table->mutex); mutex_init(&table->mutex); for (i = 0; i < num_icm; ++i) table->icm[i] = NULL; Loading Loading @@ -380,7 +380,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, if (index < 0 || index > dev->uar_table.uarc_size / 8) return -EINVAL; down(&db_tab->mutex); mutex_lock(&db_tab->mutex); i = index / MTHCA_DB_REC_PER_PAGE; Loading Loading @@ -424,7 +424,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, db_tab->page[i].refcount = 1; out: up(&db_tab->mutex); mutex_unlock(&db_tab->mutex); return ret; } Loading @@ -439,11 +439,11 @@ void mthca_unmap_user_db(struct mthca_dev *dev, struct mthca_uar *uar, * pages until we clean up the whole db table. */ down(&db_tab->mutex); mutex_lock(&db_tab->mutex); --db_tab->page[index / MTHCA_DB_REC_PER_PAGE].refcount; up(&db_tab->mutex); mutex_unlock(&db_tab->mutex); } struct mthca_user_db_table *mthca_init_user_db_tab(struct mthca_dev *dev) Loading @@ -460,7 +460,7 @@ struct mthca_user_db_table *mthca_init_user_db_tab(struct mthca_dev *dev) if (!db_tab) return ERR_PTR(-ENOMEM); init_MUTEX(&db_tab->mutex); mutex_init(&db_tab->mutex); for (i = 0; i < npages; ++i) { db_tab->page[i].refcount = 0; db_tab->page[i].uvirt = 0; Loading Loading @@ -499,7 +499,7 @@ int mthca_alloc_db(struct mthca_dev *dev, enum mthca_db_type type, int ret = 0; u8 status; down(&dev->db_tab->mutex); mutex_lock(&dev->db_tab->mutex); switch (type) { case MTHCA_DB_TYPE_CQ_ARM: Loading Loading @@ -585,7 +585,7 @@ int mthca_alloc_db(struct mthca_dev *dev, enum mthca_db_type type, *db = (__be32 *) &page->db_rec[j]; out: up(&dev->db_tab->mutex); mutex_unlock(&dev->db_tab->mutex); return ret; } Loading @@ -601,7 +601,7 @@ void mthca_free_db(struct mthca_dev *dev, int type, int db_index) page = dev->db_tab->page + i; down(&dev->db_tab->mutex); mutex_lock(&dev->db_tab->mutex); page->db_rec[j] = 0; if (i >= dev->db_tab->min_group2) Loading @@ -624,7 +624,7 @@ void mthca_free_db(struct mthca_dev *dev, int type, int db_index) ++dev->db_tab->min_group2; } up(&dev->db_tab->mutex); mutex_unlock(&dev->db_tab->mutex); } int mthca_init_db_tab(struct mthca_dev *dev) Loading @@ -638,7 +638,7 @@ int mthca_init_db_tab(struct mthca_dev *dev) if (!dev->db_tab) return -ENOMEM; init_MUTEX(&dev->db_tab->mutex); mutex_init(&dev->db_tab->mutex); dev->db_tab->npages = dev->uar_table.uarc_size / 4096; dev->db_tab->max_group1 = 0; Loading Loading
drivers/infiniband/hw/mthca/mthca_cmd.c +5 −8 Original line number Diff line number Diff line Loading @@ -199,8 +199,7 @@ static int mthca_cmd_post(struct mthca_dev *dev, { int err = 0; if (down_interruptible(&dev->cmd.hcr_sem)) return -EINTR; mutex_lock(&dev->cmd.hcr_mutex); if (event) { unsigned long end = jiffies + GO_BIT_TIMEOUT; Loading Loading @@ -238,7 +237,7 @@ static int mthca_cmd_post(struct mthca_dev *dev, op), dev->hcr + 6 * 4); out: up(&dev->cmd.hcr_sem); mutex_unlock(&dev->cmd.hcr_mutex); return err; } Loading @@ -255,8 +254,7 @@ static int mthca_cmd_poll(struct mthca_dev *dev, int err = 0; unsigned long end; if (down_interruptible(&dev->cmd.poll_sem)) return -EINTR; down(&dev->cmd.poll_sem); err = mthca_cmd_post(dev, in_param, out_param ? *out_param : 0, Loading Loading @@ -333,8 +331,7 @@ static int mthca_cmd_wait(struct mthca_dev *dev, int err = 0; struct mthca_cmd_context *context; if (down_interruptible(&dev->cmd.event_sem)) return -EINTR; down(&dev->cmd.event_sem); spin_lock(&dev->cmd.context_lock); BUG_ON(dev->cmd.free_head < 0); Loading Loading @@ -438,7 +435,7 @@ static int mthca_cmd_imm(struct mthca_dev *dev, int mthca_cmd_init(struct mthca_dev *dev) { sema_init(&dev->cmd.hcr_sem, 1); mutex_init(&dev->cmd.hcr_mutex); sema_init(&dev->cmd.poll_sem, 1); dev->cmd.use_events = 0; Loading
drivers/infiniband/hw/mthca/mthca_dev.h +5 −3 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ #include <linux/pci.h> #include <linux/dma-mapping.h> #include <linux/timer.h> #include <linux/mutex.h> #include <asm/semaphore.h> #include "mthca_provider.h" Loading Loading @@ -111,7 +113,7 @@ enum { struct mthca_cmd { struct pci_pool *pool; int use_events; struct semaphore hcr_sem; struct mutex hcr_mutex; struct semaphore poll_sem; struct semaphore event_sem; int max_cmds; Loading Loading @@ -256,7 +258,7 @@ struct mthca_av_table { }; struct mthca_mcg_table { struct semaphore sem; struct mutex mutex; struct mthca_alloc alloc; struct mthca_icm_table *table; }; Loading Loading @@ -301,7 +303,7 @@ struct mthca_dev { u64 ddr_end; MTHCA_DECLARE_DOORBELL_LOCK(doorbell_lock) struct semaphore cap_mask_mutex; struct mutex cap_mask_mutex; void __iomem *hcr; void __iomem *kar; Loading
drivers/infiniband/hw/mthca/mthca_main.c +8 −2 Original line number Diff line number Diff line Loading @@ -155,6 +155,13 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim return -ENODEV; } if (dev_lim->uar_size > pci_resource_len(mdev->pdev, 2)) { mthca_err(mdev, "HCA reported UAR size of 0x%x bigger than " "PCI resource 2 size of 0x%lx, aborting.\n", dev_lim->uar_size, pci_resource_len(mdev->pdev, 2)); return -ENODEV; } mdev->limits.num_ports = dev_lim->num_ports; mdev->limits.vl_cap = dev_lim->max_vl; mdev->limits.mtu_cap = dev_lim->max_mtu; Loading Loading @@ -976,8 +983,7 @@ static int __devinit mthca_init_one(struct pci_dev *pdev, err = -ENODEV; goto err_disable_pdev; } if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM) || pci_resource_len(pdev, 2) != 1 << 23) { if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) { dev_err(&pdev->dev, "Missing UAR, aborting.\n"); err = -ENODEV; goto err_disable_pdev; Loading
drivers/infiniband/hw/mthca/mthca_mcg.c +7 −13 Original line number Diff line number Diff line Loading @@ -154,10 +154,7 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) return PTR_ERR(mailbox); mgm = mailbox->buf; if (down_interruptible(&dev->mcg_table.sem)) { err = -EINTR; goto err_sem; } mutex_lock(&dev->mcg_table.mutex); err = find_mgm(dev, gid->raw, mailbox, &hash, &prev, &index); if (err) Loading Loading @@ -241,8 +238,8 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) BUG_ON(index < dev->limits.num_mgms); mthca_free(&dev->mcg_table.alloc, index); } up(&dev->mcg_table.sem); err_sem: mutex_unlock(&dev->mcg_table.mutex); mthca_free_mailbox(dev, mailbox); return err; } Loading @@ -263,10 +260,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) return PTR_ERR(mailbox); mgm = mailbox->buf; if (down_interruptible(&dev->mcg_table.sem)) { err = -EINTR; goto err_sem; } mutex_lock(&dev->mcg_table.mutex); err = find_mgm(dev, gid->raw, mailbox, &hash, &prev, &index); if (err) Loading Loading @@ -371,8 +365,8 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) } out: up(&dev->mcg_table.sem); err_sem: mutex_unlock(&dev->mcg_table.mutex); mthca_free_mailbox(dev, mailbox); return err; } Loading @@ -389,7 +383,7 @@ int __devinit mthca_init_mcg_table(struct mthca_dev *dev) if (err) return err; init_MUTEX(&dev->mcg_table.sem); mutex_init(&dev->mcg_table.mutex); return 0; } Loading
drivers/infiniband/hw/mthca/mthca_memfree.c +18 −18 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ enum { }; struct mthca_user_db_table { struct semaphore mutex; struct mutex mutex; struct { u64 uvirt; struct scatterlist mem; Loading Loading @@ -158,7 +158,7 @@ int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int ob int ret = 0; u8 status; down(&table->mutex); mutex_lock(&table->mutex); if (table->icm[i]) { ++table->icm[i]->refcount; Loading @@ -184,7 +184,7 @@ int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int ob ++table->icm[i]->refcount; out: up(&table->mutex); mutex_unlock(&table->mutex); return ret; } Loading @@ -198,7 +198,7 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o i = (obj & (table->num_obj - 1)) * table->obj_size / MTHCA_TABLE_CHUNK_SIZE; down(&table->mutex); mutex_lock(&table->mutex); if (--table->icm[i]->refcount == 0) { mthca_UNMAP_ICM(dev, table->virt + i * MTHCA_TABLE_CHUNK_SIZE, Loading @@ -207,7 +207,7 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o table->icm[i] = NULL; } up(&table->mutex); mutex_unlock(&table->mutex); } void *mthca_table_find(struct mthca_icm_table *table, int obj) Loading @@ -220,7 +220,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj) if (!table->lowmem) return NULL; down(&table->mutex); mutex_lock(&table->mutex); idx = (obj & (table->num_obj - 1)) * table->obj_size; icm = table->icm[idx / MTHCA_TABLE_CHUNK_SIZE]; Loading @@ -240,7 +240,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj) } out: up(&table->mutex); mutex_unlock(&table->mutex); return page ? lowmem_page_address(page) + offset : NULL; } Loading Loading @@ -301,7 +301,7 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev, table->num_obj = nobj; table->obj_size = obj_size; table->lowmem = use_lowmem; init_MUTEX(&table->mutex); mutex_init(&table->mutex); for (i = 0; i < num_icm; ++i) table->icm[i] = NULL; Loading Loading @@ -380,7 +380,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, if (index < 0 || index > dev->uar_table.uarc_size / 8) return -EINVAL; down(&db_tab->mutex); mutex_lock(&db_tab->mutex); i = index / MTHCA_DB_REC_PER_PAGE; Loading Loading @@ -424,7 +424,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, db_tab->page[i].refcount = 1; out: up(&db_tab->mutex); mutex_unlock(&db_tab->mutex); return ret; } Loading @@ -439,11 +439,11 @@ void mthca_unmap_user_db(struct mthca_dev *dev, struct mthca_uar *uar, * pages until we clean up the whole db table. */ down(&db_tab->mutex); mutex_lock(&db_tab->mutex); --db_tab->page[index / MTHCA_DB_REC_PER_PAGE].refcount; up(&db_tab->mutex); mutex_unlock(&db_tab->mutex); } struct mthca_user_db_table *mthca_init_user_db_tab(struct mthca_dev *dev) Loading @@ -460,7 +460,7 @@ struct mthca_user_db_table *mthca_init_user_db_tab(struct mthca_dev *dev) if (!db_tab) return ERR_PTR(-ENOMEM); init_MUTEX(&db_tab->mutex); mutex_init(&db_tab->mutex); for (i = 0; i < npages; ++i) { db_tab->page[i].refcount = 0; db_tab->page[i].uvirt = 0; Loading Loading @@ -499,7 +499,7 @@ int mthca_alloc_db(struct mthca_dev *dev, enum mthca_db_type type, int ret = 0; u8 status; down(&dev->db_tab->mutex); mutex_lock(&dev->db_tab->mutex); switch (type) { case MTHCA_DB_TYPE_CQ_ARM: Loading Loading @@ -585,7 +585,7 @@ int mthca_alloc_db(struct mthca_dev *dev, enum mthca_db_type type, *db = (__be32 *) &page->db_rec[j]; out: up(&dev->db_tab->mutex); mutex_unlock(&dev->db_tab->mutex); return ret; } Loading @@ -601,7 +601,7 @@ void mthca_free_db(struct mthca_dev *dev, int type, int db_index) page = dev->db_tab->page + i; down(&dev->db_tab->mutex); mutex_lock(&dev->db_tab->mutex); page->db_rec[j] = 0; if (i >= dev->db_tab->min_group2) Loading @@ -624,7 +624,7 @@ void mthca_free_db(struct mthca_dev *dev, int type, int db_index) ++dev->db_tab->min_group2; } up(&dev->db_tab->mutex); mutex_unlock(&dev->db_tab->mutex); } int mthca_init_db_tab(struct mthca_dev *dev) Loading @@ -638,7 +638,7 @@ int mthca_init_db_tab(struct mthca_dev *dev) if (!dev->db_tab) return -ENOMEM; init_MUTEX(&dev->db_tab->mutex); mutex_init(&dev->db_tab->mutex); dev->db_tab->npages = dev->uar_table.uarc_size / 4096; dev->db_tab->max_group1 = 0; Loading