Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 13783
b: refs/heads/master
c: b925556
h: refs/heads/master
i:
  13781: 29e9bb0
  13779: 63f3307
  13775: 3b01f40
v: v3
  • Loading branch information
Dave Jones authored and David S. Miller committed Nov 10, 2005
1 parent c72fefa commit 61ed075
Show file tree
Hide file tree
Showing 25 changed files with 168 additions and 473 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b8cbfa692485bf7568eda3d2f37545a76efb7c93
refs/heads/master: b925556cc9e82b32ab68a7620b247f47193501a7
4 changes: 2 additions & 2 deletions trunk/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ AFLAGS_KERNEL =
# Needed to be compatible with the O= option
LINUXINCLUDE := -Iinclude \
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
-include include/linux/autoconf.h
-imacros include/linux/autoconf.h

CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)

Expand Down Expand Up @@ -407,7 +407,7 @@ outputmakefile:
# of make so .config is not included in this case either (for *config).

no-dot-config-targets := clean mrproper distclean \
cscope TAGS tags help %docs check% kernelrelease
cscope TAGS tags help %docs check%

config-targets := 0
mixed-targets := 0
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/atm/horizon.c
Original file line number Diff line number Diff line change
Expand Up @@ -1511,8 +1511,8 @@ static inline short setup_idle_tx_channel (hrz_dev * dev, hrz_vcc * vcc) {
// a.k.a. prepare the channel and remember that we have done so.

tx_ch_desc * tx_desc = &memmap->tx_descs[tx_channel];
u16 rd_ptr;
u16 wr_ptr;
u32 rd_ptr;
u32 wr_ptr;
u16 channel = vcc->channel;

unsigned long flags;
Expand Down
129 changes: 53 additions & 76 deletions trunk/drivers/infiniband/core/user_mad.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* $Id: user_mad.c 4010 2005-11-09 23:11:56Z roland $
* $Id: user_mad.c 2814 2005-07-06 19:14:09Z halr $
*/

#include <linux/module.h>
Expand Down Expand Up @@ -110,13 +110,13 @@ struct ib_umad_device {
};

struct ib_umad_file {
struct ib_umad_port *port;
struct list_head recv_list;
struct list_head port_list;
spinlock_t recv_lock;
wait_queue_head_t recv_wait;
struct ib_mad_agent *agent[IB_UMAD_MAX_AGENTS];
int agents_dead;
struct ib_umad_port *port;
struct list_head recv_list;
struct list_head port_list;
spinlock_t recv_lock;
wait_queue_head_t recv_wait;
struct ib_mad_agent *agent[IB_UMAD_MAX_AGENTS];
struct ib_mr *mr[IB_UMAD_MAX_AGENTS];
};

struct ib_umad_packet {
Expand Down Expand Up @@ -145,24 +145,17 @@ static void ib_umad_release_dev(struct kref *ref)
kfree(dev);
}

/* caller must hold port->mutex at least for reading */
static struct ib_mad_agent *__get_agent(struct ib_umad_file *file, int id)
{
return file->agents_dead ? NULL : file->agent[id];
}

static int queue_packet(struct ib_umad_file *file,
struct ib_mad_agent *agent,
struct ib_umad_packet *packet)
{
int ret = 1;

down_read(&file->port->mutex);

for (packet->mad.hdr.id = 0;
packet->mad.hdr.id < IB_UMAD_MAX_AGENTS;
packet->mad.hdr.id++)
if (agent == __get_agent(file, packet->mad.hdr.id)) {
if (agent == file->agent[packet->mad.hdr.id]) {
spin_lock_irq(&file->recv_lock);
list_add_tail(&packet->list, &file->recv_list);
spin_unlock_irq(&file->recv_lock);
Expand Down Expand Up @@ -334,7 +327,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf,

down_read(&file->port->mutex);

agent = __get_agent(file, packet->mad.hdr.id);
agent = file->agent[packet->mad.hdr.id];
if (!agent) {
ret = -EINVAL;
goto err_up;
Expand Down Expand Up @@ -488,7 +481,7 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, unsigned long arg)
}

for (agent_id = 0; agent_id < IB_UMAD_MAX_AGENTS; ++agent_id)
if (!__get_agent(file, agent_id))
if (!file->agent[agent_id])
goto found;

ret = -ENOMEM;
Expand All @@ -512,15 +505,29 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, unsigned long arg)
goto out;
}

file->agent[agent_id] = agent;

file->mr[agent_id] = ib_get_dma_mr(agent->qp->pd, IB_ACCESS_LOCAL_WRITE);
if (IS_ERR(file->mr[agent_id])) {
ret = -ENOMEM;
goto err;
}

if (put_user(agent_id,
(u32 __user *) (arg + offsetof(struct ib_user_mad_reg_req, id)))) {
ret = -EFAULT;
ib_unregister_mad_agent(agent);
goto out;
goto err_mr;
}

file->agent[agent_id] = agent;
ret = 0;
goto out;

err_mr:
ib_dereg_mr(file->mr[agent_id]);

err:
file->agent[agent_id] = NULL;
ib_unregister_mad_agent(agent);

out:
up_write(&file->port->mutex);
Expand All @@ -529,29 +536,27 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, unsigned long arg)

static int ib_umad_unreg_agent(struct ib_umad_file *file, unsigned long arg)
{
struct ib_mad_agent *agent = NULL;
u32 id;
int ret = 0;

if (get_user(id, (u32 __user *) arg))
return -EFAULT;

down_write(&file->port->mutex);

if (id < 0 || id >= IB_UMAD_MAX_AGENTS || !__get_agent(file, id)) {
if (get_user(id, (u32 __user *) arg)) {
ret = -EFAULT;
goto out;
}

if (id < 0 || id >= IB_UMAD_MAX_AGENTS || !file->agent[id]) {
ret = -EINVAL;
goto out;
}

agent = file->agent[id];
ib_dereg_mr(file->mr[id]);
ib_unregister_mad_agent(file->agent[id]);
file->agent[id] = NULL;

out:
up_write(&file->port->mutex);

if (agent)
ib_unregister_mad_agent(agent);

return ret;
}

Expand Down Expand Up @@ -616,29 +621,23 @@ static int ib_umad_close(struct inode *inode, struct file *filp)
struct ib_umad_file *file = filp->private_data;
struct ib_umad_device *dev = file->port->umad_dev;
struct ib_umad_packet *packet, *tmp;
int already_dead;
int i;

down_write(&file->port->mutex);

already_dead = file->agents_dead;
file->agents_dead = 1;
for (i = 0; i < IB_UMAD_MAX_AGENTS; ++i)
if (file->agent[i]) {
ib_dereg_mr(file->mr[i]);
ib_unregister_mad_agent(file->agent[i]);
}

list_for_each_entry_safe(packet, tmp, &file->recv_list, list)
kfree(packet);

list_del(&file->port_list);

downgrade_write(&file->port->mutex);

if (!already_dead)
for (i = 0; i < IB_UMAD_MAX_AGENTS; ++i)
if (file->agent[i])
ib_unregister_mad_agent(file->agent[i]);

up_read(&file->port->mutex);
up_write(&file->port->mutex);

kfree(file);

kref_put(&dev->ref, ib_umad_release_dev);

return 0;
Expand Down Expand Up @@ -802,7 +801,7 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
goto err_class;
port->sm_dev->owner = THIS_MODULE;
port->sm_dev->ops = &umad_sm_fops;
kobject_set_name(&port->sm_dev->kobj, "issm%d", port->dev_num);
kobject_set_name(&port->dev->kobj, "issm%d", port->dev_num);
if (cdev_add(port->sm_dev, base_dev + port->dev_num + IB_UMAD_MAX_PORTS, 1))
goto err_sm_cdev;

Expand Down Expand Up @@ -864,36 +863,14 @@ static void ib_umad_kill_port(struct ib_umad_port *port)

port->ib_dev = NULL;

/*
* Now go through the list of files attached to this port and
* unregister all of their MAD agents. We need to hold
* port->mutex while doing this to avoid racing with
* ib_umad_close(), but we can't hold the mutex for writing
* while calling ib_unregister_mad_agent(), since that might
* deadlock by calling back into queue_packet(). So we
* downgrade our lock to a read lock, and then drop and
* reacquire the write lock for the next iteration.
*
* We do list_del_init() on the file's list_head so that the
* list_del in ib_umad_close() is still OK, even after the
* file is removed from the list.
*/
while (!list_empty(&port->file_list)) {
file = list_entry(port->file_list.next, struct ib_umad_file,
port_list);

file->agents_dead = 1;
list_del_init(&file->port_list);

downgrade_write(&port->mutex);

for (id = 0; id < IB_UMAD_MAX_AGENTS; ++id)
if (file->agent[id])
ib_unregister_mad_agent(file->agent[id]);

up_read(&port->mutex);
down_write(&port->mutex);
}
list_for_each_entry(file, &port->file_list, port_list)
for (id = 0; id < IB_UMAD_MAX_AGENTS; ++id) {
if (!file->agent[id])
continue;
ib_dereg_mr(file->mr[id]);
ib_unregister_mad_agent(file->agent[id]);
file->agent[id] = NULL;
}

up_write(&port->mutex);

Expand Down Expand Up @@ -936,7 +913,7 @@ static void ib_umad_add_one(struct ib_device *device)

err:
while (--i >= s)
ib_umad_kill_port(&umad_dev->port[i - s]);
ib_umad_kill_port(&umad_dev->port[i]);

kref_put(&umad_dev->ref, ib_umad_release_dev);
}
Expand Down
12 changes: 4 additions & 8 deletions trunk/drivers/infiniband/core/uverbs_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ ssize_t ib_uverbs_poll_cq(struct ib_uverbs_file *file,
resp->wc[i].opcode = wc[i].opcode;
resp->wc[i].vendor_err = wc[i].vendor_err;
resp->wc[i].byte_len = wc[i].byte_len;
resp->wc[i].imm_data = (__u32 __force) wc[i].imm_data;
resp->wc[i].imm_data = wc[i].imm_data;
resp->wc[i].qp_num = wc[i].qp_num;
resp->wc[i].src_qp = wc[i].src_qp;
resp->wc[i].wc_flags = wc[i].wc_flags;
Expand Down Expand Up @@ -908,12 +908,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
if (ret)
goto err_destroy;

resp.qp_handle = uobj->uobject.id;
resp.max_recv_sge = attr.cap.max_recv_sge;
resp.max_send_sge = attr.cap.max_send_sge;
resp.max_recv_wr = attr.cap.max_recv_wr;
resp.max_send_wr = attr.cap.max_send_wr;
resp.max_inline_data = attr.cap.max_inline_data;
resp.qp_handle = uobj->uobject.id;

if (copy_to_user((void __user *) (unsigned long) cmd.response,
&resp, sizeof resp)) {
Expand Down Expand Up @@ -1140,7 +1135,7 @@ ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
next->num_sge = user_wr->num_sge;
next->opcode = user_wr->opcode;
next->send_flags = user_wr->send_flags;
next->imm_data = (__be32 __force) user_wr->imm_data;
next->imm_data = user_wr->imm_data;

if (qp->qp_type == IB_QPT_UD) {
next->wr.ud.ah = idr_find(&ib_uverbs_ah_idr,
Expand Down Expand Up @@ -1706,6 +1701,7 @@ ssize_t ib_uverbs_modify_srq(struct ib_uverbs_file *file,
}

attr.max_wr = cmd.max_wr;
attr.max_sge = cmd.max_sge;
attr.srq_limit = cmd.srq_limit;

ret = ib_modify_srq(srq, &attr, cmd.attr_mask);
Expand Down
12 changes: 10 additions & 2 deletions trunk/drivers/infiniband/core/verbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,16 @@ EXPORT_SYMBOL(ib_destroy_cq);
int ib_resize_cq(struct ib_cq *cq,
int cqe)
{
return cq->device->resize_cq ?
cq->device->resize_cq(cq, cqe) : -ENOSYS;
int ret;

if (!cq->device->resize_cq)
return -ENOSYS;

ret = cq->device->resize_cq(cq, &cqe);
if (!ret)
cq->cqe = cqe;

return ret;
}
EXPORT_SYMBOL(ib_resize_cq);

Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/infiniband/hw/mthca/mthca_catas.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ static void poll_catas(unsigned long dev_ptr)
}

spin_lock_irqsave(&catas_lock, flags);
if (!dev->catas_err.stop)
if (dev->catas_err.stop)
mod_timer(&dev->catas_err.timer,
jiffies + MTHCA_CATAS_POLL_INTERVAL);
spin_unlock_irqrestore(&catas_lock, flags);
Expand Down
2 changes: 0 additions & 2 deletions trunk/drivers/infiniband/hw/mthca/mthca_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1060,8 +1060,6 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev,
dev_lim->hca.arbel.resize_srq = field & 1;
MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_SG_RQ_OFFSET);
dev_lim->max_sg = min_t(int, field, dev_lim->max_sg);
MTHCA_GET(size, outbox, QUERY_DEV_LIM_MAX_DESC_SZ_RQ_OFFSET);
dev_lim->max_desc_sz = min_t(int, size, dev_lim->max_desc_sz);
MTHCA_GET(size, outbox, QUERY_DEV_LIM_MPT_ENTRY_SZ_OFFSET);
dev_lim->mpt_entry_sz = size;
MTHCA_GET(field, outbox, QUERY_DEV_LIM_PBL_SZ_OFFSET);
Expand Down
16 changes: 10 additions & 6 deletions trunk/drivers/infiniband/hw/mthca/mthca_cq.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn,
{
struct mthca_cq *cq;
struct mthca_cqe *cqe;
u32 prod_index;
int prod_index;
int nfreed = 0;

spin_lock_irq(&dev->cq_table.lock);
Expand Down Expand Up @@ -293,15 +293,19 @@ void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn,
* Now sweep backwards through the CQ, removing CQ entries
* that match our QP by copying older entries on top of them.
*/
while ((int) --prod_index - (int) cq->cons_index >= 0) {
cqe = get_cqe(cq, prod_index & cq->ibcq.cqe);
while (prod_index > cq->cons_index) {
cqe = get_cqe(cq, (prod_index - 1) & cq->ibcq.cqe);
if (cqe->my_qpn == cpu_to_be32(qpn)) {
if (srq)
mthca_free_srq_wqe(srq, be32_to_cpu(cqe->wqe));
++nfreed;
} else if (nfreed)
memcpy(get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe),
cqe, MTHCA_CQ_ENTRY_SIZE);
}
else if (nfreed)
memcpy(get_cqe(cq, (prod_index - 1 + nfreed) &
cq->ibcq.cqe),
cqe,
MTHCA_CQ_ENTRY_SIZE);
--prod_index;
}

if (nfreed) {
Expand Down
Loading

0 comments on commit 61ed075

Please sign in to comment.