LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* IB/ehca: Reject send WRs only for RESET, INIT and RTR state
@ 2008-06-06 16:35 Joachim Fenkes
  2008-06-06 18:22 ` Roland Dreier
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
  0 siblings, 2 replies; 22+ messages in thread
From: Joachim Fenkes @ 2008-06-06 16:35 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Hoang-Nam Nguyen, Christoph Raisch, Stefan Roscher

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
 drivers/infiniband/hw/ehca/ehca_reqs.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
index bbe0436..f093b00 100644
--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
+++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
@@ -421,8 +421,10 @@ int ehca_post_send(struct ib_qp *qp,
 	int ret = 0;
 	unsigned long flags;
 
-	if (unlikely(my_qp->state != IB_QPS_RTS)) {
-		ehca_err(qp->device, "QP not in RTS state  qpn=%x", qp->qp_num);
+	/* Reject WR if QP is in RESET, INIT or RTR state */
+	if (unlikely(my_qp->state < IB_QPS_RTS)) {
+		ehca_err(qp->device, "Invalid QP state  qp_state=%d qpn=%x",
+			 my_qp->state, qp->qp_num);
 		return -EINVAL;
 	}
 
-- 
1.5.5



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: IB/ehca: Reject send WRs only for RESET, INIT and RTR state
  2008-06-06 16:35 IB/ehca: Reject send WRs only for RESET, INIT and RTR state Joachim Fenkes
@ 2008-06-06 18:22 ` Roland Dreier
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
  1 sibling, 0 replies; 22+ messages in thread
From: Roland Dreier @ 2008-06-06 18:22 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Hoang-Nam Nguyen, Christoph Raisch, Stefan Roscher

thanks, applied.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [ofa-general] IB/ehca: Reject send WRs only for RESET, INIT and RTR state
  2008-06-06 16:35 IB/ehca: Reject send WRs only for RESET, INIT and RTR state Joachim Fenkes
  2008-06-06 18:22 ` Roland Dreier
@ 2008-06-06 20:20 ` Dotan Barak
  2008-06-09 11:24   ` [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state Joachim Fenkes
                     ` (6 more replies)
  1 sibling, 7 replies; 22+ messages in thread
From: Dotan Barak @ 2008-06-06 20:20 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG, Stefan Roscher

Hi.

I checked the code in the ehca driver and noticed that
post RR to a QP is being accepted in any state (including the RESET state).

thanks
Dotan

Joachim Fenkes wrote:
> Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
> ---
>  drivers/infiniband/hw/ehca/ehca_reqs.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
> index bbe0436..f093b00 100644
> --- a/drivers/infiniband/hw/ehca/ehca_reqs.c
> +++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
> @@ -421,8 +421,10 @@ int ehca_post_send(struct ib_qp *qp,
>  	int ret = 0;
>  	unsigned long flags;
>  
> -	if (unlikely(my_qp->state != IB_QPS_RTS)) {
> -		ehca_err(qp->device, "QP not in RTS state  qpn=%x", qp->qp_num);
> +	/* Reject WR if QP is in RESET, INIT or RTR state */
> +	if (unlikely(my_qp->state < IB_QPS_RTS)) {
> +		ehca_err(qp->device, "Invalid QP state  qp_state=%d qpn=%x",
> +			 my_qp->state, qp->qp_num);
>  		return -EINVAL;
>  	}
>  
>   


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
@ 2008-06-09 11:24   ` Joachim Fenkes
  2008-06-20 17:26     ` Roland Dreier
  2008-07-01 14:14   ` [PATCH] IB/ehca: Make device table externally visible Joachim Fenkes
                     ` (5 subsequent siblings)
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2008-06-09 11:24 UTC (permalink / raw)
  To: Dotan Barak, LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
On Friday 06 June 2008 22:20, Dotan Barak wrote:

> I checked the code in the ehca driver and noticed that
> post RR to a QP is being accepted in any state (including the RESET state).

You're right, this is only consistent -- thanks for pointing it out!

Regards,
  Joachim

 drivers/infiniband/hw/ehca/ehca_reqs.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
index f093b00..ad197f4 100644
--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
+++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
@@ -544,8 +544,16 @@ int ehca_post_recv(struct ib_qp *qp,
 		   struct ib_recv_wr *recv_wr,
 		   struct ib_recv_wr **bad_recv_wr)
 {
-	return internal_post_recv(container_of(qp, struct ehca_qp, ib_qp),
-				  qp->device, recv_wr, bad_recv_wr);
+	struct ehca_qp *my_qp = container_of(qp, struct ehca_qp, ib_qp);
+
+	/* Reject WR if QP is in RESET state */
+	if (unlikely(my_qp->state == IB_QPS_RESET)) {
+		ehca_err(qp->device, "Invalid QP state  qp_state=%d qpn=%x",
+			 my_qp->state, qp->qp_num);
+		return -EINVAL;
+	}
+
+	return internal_post_recv(my_qp, qp->device, recv_wr, bad_recv_wr);
 }
 
 int ehca_post_srq_recv(struct ib_srq *srq,
-- 
1.5.5


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state
  2008-06-09 11:24   ` [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state Joachim Fenkes
@ 2008-06-20 17:26     ` Roland Dreier
  0 siblings, 0 replies; 22+ messages in thread
From: Roland Dreier @ 2008-06-20 17:26 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: Dotan Barak, LinuxPPC-Dev, LKML, OF-General, Roland Dreier,
	OF-EWG, Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen

thanks, applied.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Make device table externally visible
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
  2008-06-09 11:24   ` [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state Joachim Fenkes
@ 2008-07-01 14:14   ` Joachim Fenkes
  2008-07-01 17:55     ` Roland Dreier
  2008-11-07 16:42   ` [PATCH] IB/ehca: Fix suppression of port activation events Joachim Fenkes
                     ` (4 subsequent siblings)
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2008-07-01 14:14 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen

This gives ehca an autogenerated modalias and therefore enables automatic loading.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
 drivers/infiniband/hw/ehca/ehca_main.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 482103e..598844d 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -923,6 +923,7 @@ static struct of_device_id ehca_device_table[] =
 	},
 	{},
 };
+MODULE_DEVICE_TABLE(of, ehca_device_table);
 
 static struct of_platform_driver ehca_driver = {
 	.name        = "ehca",
-- 
1.5.5



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Make device table externally visible
  2008-07-01 14:14   ` [PATCH] IB/ehca: Make device table externally visible Joachim Fenkes
@ 2008-07-01 17:55     ` Roland Dreier
  0 siblings, 0 replies; 22+ messages in thread
From: Roland Dreier @ 2008-07-01 17:55 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen

thanks, applied

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Fix suppression of port activation events
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
  2008-06-09 11:24   ` [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state Joachim Fenkes
  2008-07-01 14:14   ` [PATCH] IB/ehca: Make device table externally visible Joachim Fenkes
@ 2008-11-07 16:42   ` Joachim Fenkes
  2008-11-10 20:36     ` Roland Dreier
  2008-11-21 15:37   ` [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock Joachim Fenkes
                     ` (3 subsequent siblings)
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2008-11-07 16:42 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen, Alexander Schmidt

A previous fix introduced a regression where port activation events were
dropped unconditionally if port autodetection was not enabled. Fixed.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---

Roland -- this patch is made against your for-linus branch. Please review
and apply if you think it's okay. Hope it's not too late for the next kernel.

Joachim

 drivers/infiniband/hw/ehca/ehca_irq.c |   45 +++++++++++++++++++-------------
 1 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index 9e43459..757035e 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -359,34 +359,43 @@ static void notify_port_conf_change(struct ehca_shca *shca, int port_num)
 	*old_attr = new_attr;
 }
 
+/* replay modify_qp for sqps -- return 0 if all is well, 1 if AQP1 destroyed */
+static int replay_modify_qp(struct ehca_sport *sport)
+{
+	int aqp1_destroyed;
+	unsigned long flags;
+
+	spin_lock_irqsave(&sport->mod_sqp_lock, flags);
+
+	aqp1_destroyed = !sport->ibqp_sqp[IB_QPT_GSI];
+
+	if (sport->ibqp_sqp[IB_QPT_SMI])
+		ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_SMI]);
+	if (!aqp1_destroyed)
+		ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_GSI]);
+
+	spin_unlock_irqrestore(&sport->mod_sqp_lock, flags);
+
+	return aqp1_destroyed;
+}
+
 static void parse_ec(struct ehca_shca *shca, u64 eqe)
 {
 	u8 ec   = EHCA_BMASK_GET(NEQE_EVENT_CODE, eqe);
 	u8 port = EHCA_BMASK_GET(NEQE_PORT_NUMBER, eqe);
 	u8 spec_event;
 	struct ehca_sport *sport = &shca->sport[port - 1];
-	unsigned long flags;
 
 	switch (ec) {
 	case 0x30: /* port availability change */
 		if (EHCA_BMASK_GET(NEQE_PORT_AVAILABILITY, eqe)) {
-			/* only for autodetect mode important */
-			if (ehca_nr_ports >= 0)
-				break;
-
-			int suppress_event;
-			/* replay modify_qp for sqps */
-			spin_lock_irqsave(&sport->mod_sqp_lock, flags);
-			suppress_event = !sport->ibqp_sqp[IB_QPT_GSI];
-			if (sport->ibqp_sqp[IB_QPT_SMI])
-				ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_SMI]);
-			if (!suppress_event)
-				ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_GSI]);
-			spin_unlock_irqrestore(&sport->mod_sqp_lock, flags);
-
-			/* AQP1 was destroyed, ignore this event */
-			if (suppress_event)
-				break;
+			/* only replay modify_qp calls in autodetect mode;
+			 * if AQP1 was destroyed, the port is already down
+			 * again and we can drop the event.
+			 */
+			if (ehca_nr_ports < 0)
+				if (replay_modify_qp(sport))
+					break;
 
 			sport->port_state = IB_PORT_ACTIVE;
 			dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE,
-- 
1.5.5





^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Fix suppression of port activation events
  2008-11-07 16:42   ` [PATCH] IB/ehca: Fix suppression of port activation events Joachim Fenkes
@ 2008-11-10 20:36     ` Roland Dreier
  2008-11-11  9:04       ` Joachim Fenkes
  0 siblings, 1 reply; 22+ messages in thread
From: Roland Dreier @ 2008-11-10 20:36 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen,
	Alexander Schmidt

 > A previous fix introduced a regression where port activation events were
 > dropped unconditionally if port autodetection was not enabled. Fixed.

Is this a fix to "IB/ehca: Remove reference to special QP in case of
port activation failure"?  Because if so I can roll it into that patch,
since Linus hasn't pulled it yet.

 - R.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Fix suppression of port activation events
  2008-11-10 20:36     ` Roland Dreier
@ 2008-11-11  9:04       ` Joachim Fenkes
  0 siblings, 0 replies; 22+ messages in thread
From: Joachim Fenkes @ 2008-11-11  9:04 UTC (permalink / raw)
  To: Roland Dreier
  Cc: Alexander Schmidt1, Christoph Raisch, OF-EWG, OF-General,
	Hoang-Nam Nguyen, LKML, LinuxPPC-Dev, Roland Dreier,
	Stefan Roscher

Roland Dreier <rdreier@cisco.com> wrote on 10.11.2008 21:36:23:

>  > A previous fix introduced a regression where port activation events 
were
>  > dropped unconditionally if port autodetection was not enabled. Fixed.
> 
> Is this a fix to "IB/ehca: Remove reference to special QP in case of
> port activation failure"?  Because if so I can roll it into that patch,
> since Linus hasn't pulled it yet.

Yes, that would be splendid, thank you!

Cheers,
  Joachim

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
                     ` (2 preceding siblings ...)
  2008-11-07 16:42   ` [PATCH] IB/ehca: Fix suppression of port activation events Joachim Fenkes
@ 2008-11-21 15:37   ` Joachim Fenkes
  2008-11-21 16:02     ` Johannes Berg
  2008-11-25 12:58   ` [PATCH] IB/ehca: Change misleading error message Joachim Fenkes
                     ` (2 subsequent siblings)
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2008-11-21 15:37 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen

From: Michael Ellerman <michael@ellerman.id.au>

shca_list_lock is taken from softirq context in ehca_poll_eqs, so we need to
lock IRQ safe elsewhere.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Acked-by: Joachim Fenkes <fenkes@de.ibm.com>
---
 drivers/infiniband/hw/ehca/ehca_main.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index bb02a86..021c454 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -717,6 +717,7 @@ static int __devinit ehca_probe(struct of_device *dev,
 	const u64 *handle;
 	struct ib_pd *ibpd;
 	int ret, i, eq_size;
+	u64 flags;
 
 	handle = of_get_property(dev->node, "ibm,hca-handle", NULL);
 	if (!handle) {
@@ -830,9 +831,9 @@ static int __devinit ehca_probe(struct of_device *dev,
 		ehca_err(&shca->ib_device,
 			 "Cannot create device attributes  ret=%d", ret);
 
-	spin_lock(&shca_list_lock);
+	spin_lock_irqsave(&shca_list_lock, flags);
 	list_add(&shca->shca_list, &shca_list);
-	spin_unlock(&shca_list_lock);
+	spin_unlock_irqrestore(&shca_list_lock, flags);
 
 	return 0;
 
@@ -878,6 +879,7 @@ probe1:
 static int __devexit ehca_remove(struct of_device *dev)
 {
 	struct ehca_shca *shca = dev->dev.driver_data;
+	u64 flags;
 	int ret;
 
 	sysfs_remove_group(&dev->dev.kobj, &ehca_dev_attr_grp);
@@ -915,9 +917,9 @@ static int __devexit ehca_remove(struct of_device *dev)
 
 	ib_dealloc_device(&shca->ib_device);
 
-	spin_lock(&shca_list_lock);
+	spin_lock_irqsave(&shca_list_lock, flags);
 	list_del(&shca->shca_list);
-	spin_unlock(&shca_list_lock);
+	spin_unlock_irqrestore(&shca_list_lock, flags);
 
 	return ret;
 }
@@ -975,6 +977,7 @@ static int ehca_mem_notifier(struct notifier_block *nb,
 			     unsigned long action, void *data)
 {
 	static unsigned long ehca_dmem_warn_time;
+	unsigned long flags;
 
 	switch (action) {
 	case MEM_CANCEL_OFFLINE:
@@ -985,12 +988,12 @@ static int ehca_mem_notifier(struct notifier_block *nb,
 	case MEM_GOING_ONLINE:
 	case MEM_GOING_OFFLINE:
 		/* only ok if no hca is attached to the lpar */
-		spin_lock(&shca_list_lock);
+		spin_lock_irqsave(&shca_list_lock, flags);
 		if (list_empty(&shca_list)) {
-			spin_unlock(&shca_list_lock);
+			spin_unlock_irqrestore(&shca_list_lock, flags);
 			return NOTIFY_OK;
 		} else {
-			spin_unlock(&shca_list_lock);
+			spin_unlock_irqrestore(&shca_list_lock, flags);
 			if (printk_timed_ratelimit(&ehca_dmem_warn_time,
 						   30 * 1000))
 				ehca_gen_err("DMEM operations are not allowed"
-- 
1.5.5




^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock
  2008-11-21 15:37   ` [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock Joachim Fenkes
@ 2008-11-21 16:02     ` Johannes Berg
  2008-11-21 16:18       ` [PATCH] IB/ehca: Fix locking " Joachim Fenkes
  2008-11-22  3:41       ` [PATCH] IB/ehca: Fix lockdep failures " Michael Ellerman
  0 siblings, 2 replies; 22+ messages in thread
From: Johannes Berg @ 2008-11-21 16:02 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen

[-- Attachment #1: Type: text/plain, Size: 437 bytes --]

On Fri, 2008-11-21 at 16:37 +0100, Joachim Fenkes wrote:

> +	u64 flags;

> -	spin_lock(&shca_list_lock);
> +	spin_lock_irqsave(&shca_list_lock, flags);

That's wrong and I think will give a warning on all machines where
u64 != unsigned long. Might not particularly matter in this case.

Also, generally it seems wrong to say "fix lockdep failure" when the
patch really fixes a bug that lockdep happened to find.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Fix locking for shca_list_lock
  2008-11-21 16:02     ` Johannes Berg
@ 2008-11-21 16:18       ` Joachim Fenkes
  2008-11-21 18:28         ` Roland Dreier
  2008-11-22  3:41       ` [PATCH] IB/ehca: Fix lockdep failures " Michael Ellerman
  1 sibling, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2008-11-21 16:18 UTC (permalink / raw)
  To: Johannes Berg, LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen, Alexander Schmidt

shca_list_lock is taken from softirq context in ehca_poll_eqs, so we need to
lock IRQ safe elsewhere.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---

On Friday 21 November 2008 17:02, Johannes Berg wrote:
> On Fri, 2008-11-21 at 16:37 +0100, Joachim Fenkes wrote:
> 
> > +	u64 flags;
> 
> > -	spin_lock(&shca_list_lock);
> > +	spin_lock_irqsave(&shca_list_lock, flags);
> 
> That's wrong and I think will give a warning on all machines where
> u64 != unsigned long. Might not particularly matter in this case.

Doesn't matter for a ppc64 only driver, but you're right nonetheless. Thanks.
 
> Also, generally it seems wrong to say "fix lockdep failure" when the
> patch really fixes a bug that lockdep happened to find.

Whatever -- changed.

Here's the updated patch.

Regards,
  Joachim


 drivers/infiniband/hw/ehca/ehca_main.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index bb02a86..169aa1a 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -717,6 +717,7 @@ static int __devinit ehca_probe(struct of_device *dev,
 	const u64 *handle;
 	struct ib_pd *ibpd;
 	int ret, i, eq_size;
+	unsigned long flags;
 
 	handle = of_get_property(dev->node, "ibm,hca-handle", NULL);
 	if (!handle) {
@@ -830,9 +831,9 @@ static int __devinit ehca_probe(struct of_device *dev,
 		ehca_err(&shca->ib_device,
 			 "Cannot create device attributes  ret=%d", ret);
 
-	spin_lock(&shca_list_lock);
+	spin_lock_irqsave(&shca_list_lock, flags);
 	list_add(&shca->shca_list, &shca_list);
-	spin_unlock(&shca_list_lock);
+	spin_unlock_irqrestore(&shca_list_lock, flags);
 
 	return 0;
 
@@ -878,6 +879,7 @@ probe1:
 static int __devexit ehca_remove(struct of_device *dev)
 {
 	struct ehca_shca *shca = dev->dev.driver_data;
+	unsigned long flags;
 	int ret;
 
 	sysfs_remove_group(&dev->dev.kobj, &ehca_dev_attr_grp);
@@ -915,9 +917,9 @@ static int __devexit ehca_remove(struct of_device *dev)
 
 	ib_dealloc_device(&shca->ib_device);
 
-	spin_lock(&shca_list_lock);
+	spin_lock_irqsave(&shca_list_lock, flags);
 	list_del(&shca->shca_list);
-	spin_unlock(&shca_list_lock);
+	spin_unlock_irqrestore(&shca_list_lock, flags);
 
 	return ret;
 }
@@ -975,6 +977,7 @@ static int ehca_mem_notifier(struct notifier_block *nb,
 			     unsigned long action, void *data)
 {
 	static unsigned long ehca_dmem_warn_time;
+	unsigned long flags;
 
 	switch (action) {
 	case MEM_CANCEL_OFFLINE:
@@ -985,12 +988,12 @@ static int ehca_mem_notifier(struct notifier_block *nb,
 	case MEM_GOING_ONLINE:
 	case MEM_GOING_OFFLINE:
 		/* only ok if no hca is attached to the lpar */
-		spin_lock(&shca_list_lock);
+		spin_lock_irqsave(&shca_list_lock, flags);
 		if (list_empty(&shca_list)) {
-			spin_unlock(&shca_list_lock);
+			spin_unlock_irqrestore(&shca_list_lock, flags);
 			return NOTIFY_OK;
 		} else {
-			spin_unlock(&shca_list_lock);
+			spin_unlock_irqrestore(&shca_list_lock, flags);
 			if (printk_timed_ratelimit(&ehca_dmem_warn_time,
 						   30 * 1000))
 				ehca_gen_err("DMEM operations are not allowed"
-- 
1.5.5




^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Fix locking for shca_list_lock
  2008-11-21 16:18       ` [PATCH] IB/ehca: Fix locking " Joachim Fenkes
@ 2008-11-21 18:28         ` Roland Dreier
  0 siblings, 0 replies; 22+ messages in thread
From: Roland Dreier @ 2008-11-21 18:28 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: Johannes Berg, LinuxPPC-Dev, LKML, OF-General, Roland Dreier,
	OF-EWG, Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen,
	Alexander Schmidt

Looks good... I'll add this for 2.6.29, since as far as I can tell this
bug has been there approximately forever already.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock
  2008-11-21 16:02     ` Johannes Berg
  2008-11-21 16:18       ` [PATCH] IB/ehca: Fix locking " Joachim Fenkes
@ 2008-11-22  3:41       ` Michael Ellerman
  1 sibling, 0 replies; 22+ messages in thread
From: Michael Ellerman @ 2008-11-22  3:41 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Joachim Fenkes, LKML, OF-EWG, LinuxPPC-Dev, Christoph Raisch,
	OF-General, Stefan Roscher

[-- Attachment #1: Type: text/plain, Size: 902 bytes --]

On Fri, 2008-11-21 at 17:02 +0100, Johannes Berg wrote:
> On Fri, 2008-11-21 at 16:37 +0100, Joachim Fenkes wrote:
> 
> > +	u64 flags;
> 
> > -	spin_lock(&shca_list_lock);
> > +	spin_lock_irqsave(&shca_list_lock, flags);
> 
> That's wrong and I think will give a warning on all machines where
> u64 != unsigned long. Might not particularly matter in this case.

Crud, sorry.

> Also, generally it seems wrong to say "fix lockdep failure" when the
> patch really fixes a bug that lockdep happened to find.

True. I guess it should be "fix locking error found with lockdep", to
make it clear no one has actually hit the bug.

cheers

-- 
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Change misleading error message
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
                     ` (3 preceding siblings ...)
  2008-11-21 15:37   ` [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock Joachim Fenkes
@ 2008-11-25 12:58   ` Joachim Fenkes
  2008-11-25 23:13     ` Roland Dreier
  2009-06-03 14:28   ` [PATCH] IB/ehca: Remove superfluous bitmasks from QP control block Joachim Fenkes
  2009-09-01 11:55   ` [PATCH] IB/ehca: Fix CQE flags reporting Joachim Fenkes
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2008-11-25 12:58 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen, Alexander Schmidt

The error message printed when the eHCA driver prevents memory hotplug is
misleading -- the user might think that hot-removing the lhca, hotplugging
memory, then hot-adding the lhca again will work, but it doesn't.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
 drivers/infiniband/hw/ehca/ehca_main.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index bb02a86..bec7e02 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -994,8 +994,7 @@ static int ehca_mem_notifier(struct notifier_block *nb,
 			if (printk_timed_ratelimit(&ehca_dmem_warn_time,
 						   30 * 1000))
 				ehca_gen_err("DMEM operations are not allowed"
-					     "as long as an ehca adapter is"
-					     "attached to the LPAR");
+					     "in conjunction with eHCA");
 			return NOTIFY_BAD;
 		}
 	}
-- 
1.5.5



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Change misleading error message
  2008-11-25 12:58   ` [PATCH] IB/ehca: Change misleading error message Joachim Fenkes
@ 2008-11-25 23:13     ` Roland Dreier
  2008-11-26 13:44       ` Joachim Fenkes
  0 siblings, 1 reply; 22+ messages in thread
From: Roland Dreier @ 2008-11-25 23:13 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen,
	Alexander Schmidt

 > The error message printed when the eHCA driver prevents memory hotplug is
 > misleading -- the user might think that hot-removing the lhca, hotplugging
 > memory, then hot-adding the lhca again will work, but it doesn't.

That's too bad... I applied this patch but out of curiousity, why
doesn't the hot-remove/hot-add work?  I would have thought that
re-registering all of memory after the hot-add would do the right thing.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Change misleading error message
  2008-11-25 23:13     ` Roland Dreier
@ 2008-11-26 13:44       ` Joachim Fenkes
  0 siblings, 0 replies; 22+ messages in thread
From: Joachim Fenkes @ 2008-11-26 13:44 UTC (permalink / raw)
  To: Roland Dreier
  Cc: Alexander Schmidt1, Christoph Raisch, OF-EWG, OF-General,
	Hoang-Nam Nguyen, LKML, LinuxPPC-Dev, Roland Dreier,
	Stefan Roscher

Roland Dreier <rdreier@cisco.com> wrote on 26.11.2008 00:13:51:

> That's too bad... I applied this patch but out of curiousity, why
> doesn't the hot-remove/hot-add work?  I would have thought that
> re-registering all of memory after the hot-add would do the right thing.

That's right, but right now, we simply try to register all of memory from 
KERNELBASE to high_memory, which works right until we have memory holes in 
the middle; then the hypervisor will reject our page registrations. Same 
goes for huge (16GB) pages, by the way. We're working on a solution to 
this.

Cheers,
  Joachim

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Remove superfluous bitmasks from QP control block
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
                     ` (4 preceding siblings ...)
  2008-11-25 12:58   ` [PATCH] IB/ehca: Change misleading error message Joachim Fenkes
@ 2009-06-03 14:28   ` Joachim Fenkes
  2009-06-03 20:26     ` Roland Dreier
  2009-09-01 11:55   ` [PATCH] IB/ehca: Fix CQE flags reporting Joachim Fenkes
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2009-06-03 14:28 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen, Alexander Schmidt

All the fields in the control block are nicely right-aligned, so no masking
is necessary.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---
 drivers/infiniband/hw/ehca/ehca_classes_pSeries.h |   28 ---------------------
 drivers/infiniband/hw/ehca/ehca_qp.c              |   18 +++---------
 2 files changed, 5 insertions(+), 41 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_classes_pSeries.h b/drivers/infiniband/hw/ehca/ehca_classes_pSeries.h
index 1798e64..689c357 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes_pSeries.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes_pSeries.h
@@ -165,7 +165,6 @@ struct hcp_modify_qp_control_block {
 #define MQPCB_MASK_ALT_P_KEY_IDX                EHCA_BMASK_IBM( 7,  7)
 #define MQPCB_MASK_RDMA_ATOMIC_CTRL             EHCA_BMASK_IBM( 8,  8)
 #define MQPCB_MASK_QP_STATE                     EHCA_BMASK_IBM( 9,  9)
-#define MQPCB_QP_STATE                          EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_RDMA_NR_ATOMIC_RESP_RES      EHCA_BMASK_IBM(11, 11)
 #define MQPCB_MASK_PATH_MIGRATION_STATE         EHCA_BMASK_IBM(12, 12)
 #define MQPCB_MASK_RDMA_ATOMIC_OUTST_DEST_QP    EHCA_BMASK_IBM(13, 13)
@@ -176,60 +175,33 @@ struct hcp_modify_qp_control_block {
 #define MQPCB_MASK_RETRY_COUNT                  EHCA_BMASK_IBM(18, 18)
 #define MQPCB_MASK_TIMEOUT                      EHCA_BMASK_IBM(19, 19)
 #define MQPCB_MASK_PATH_MTU                     EHCA_BMASK_IBM(20, 20)
-#define MQPCB_PATH_MTU                          EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_MAX_STATIC_RATE              EHCA_BMASK_IBM(21, 21)
-#define MQPCB_MAX_STATIC_RATE                   EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_DLID                         EHCA_BMASK_IBM(22, 22)
-#define MQPCB_DLID                              EHCA_BMASK_IBM(16, 31)
 #define MQPCB_MASK_RNR_RETRY_COUNT              EHCA_BMASK_IBM(23, 23)
-#define MQPCB_RNR_RETRY_COUNT                   EHCA_BMASK_IBM(29, 31)
 #define MQPCB_MASK_SOURCE_PATH_BITS             EHCA_BMASK_IBM(24, 24)
-#define MQPCB_SOURCE_PATH_BITS                  EHCA_BMASK_IBM(25, 31)
 #define MQPCB_MASK_TRAFFIC_CLASS                EHCA_BMASK_IBM(25, 25)
-#define MQPCB_TRAFFIC_CLASS                     EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_HOP_LIMIT                    EHCA_BMASK_IBM(26, 26)
-#define MQPCB_HOP_LIMIT                         EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_SOURCE_GID_IDX               EHCA_BMASK_IBM(27, 27)
-#define MQPCB_SOURCE_GID_IDX                    EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_FLOW_LABEL                   EHCA_BMASK_IBM(28, 28)
-#define MQPCB_FLOW_LABEL                        EHCA_BMASK_IBM(12, 31)
 #define MQPCB_MASK_DEST_GID                     EHCA_BMASK_IBM(30, 30)
 #define MQPCB_MASK_SERVICE_LEVEL_AL             EHCA_BMASK_IBM(31, 31)
-#define MQPCB_SERVICE_LEVEL_AL                  EHCA_BMASK_IBM(28, 31)
 #define MQPCB_MASK_SEND_GRH_FLAG_AL             EHCA_BMASK_IBM(32, 32)
-#define MQPCB_SEND_GRH_FLAG_AL                  EHCA_BMASK_IBM(31, 31)
 #define MQPCB_MASK_RETRY_COUNT_AL               EHCA_BMASK_IBM(33, 33)
-#define MQPCB_RETRY_COUNT_AL                    EHCA_BMASK_IBM(29, 31)
 #define MQPCB_MASK_TIMEOUT_AL                   EHCA_BMASK_IBM(34, 34)
-#define MQPCB_TIMEOUT_AL                        EHCA_BMASK_IBM(27, 31)
 #define MQPCB_MASK_MAX_STATIC_RATE_AL           EHCA_BMASK_IBM(35, 35)
-#define MQPCB_MAX_STATIC_RATE_AL                EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_DLID_AL                      EHCA_BMASK_IBM(36, 36)
-#define MQPCB_DLID_AL                           EHCA_BMASK_IBM(16, 31)
 #define MQPCB_MASK_RNR_RETRY_COUNT_AL           EHCA_BMASK_IBM(37, 37)
-#define MQPCB_RNR_RETRY_COUNT_AL                EHCA_BMASK_IBM(29, 31)
 #define MQPCB_MASK_SOURCE_PATH_BITS_AL          EHCA_BMASK_IBM(38, 38)
-#define MQPCB_SOURCE_PATH_BITS_AL               EHCA_BMASK_IBM(25, 31)
 #define MQPCB_MASK_TRAFFIC_CLASS_AL             EHCA_BMASK_IBM(39, 39)
-#define MQPCB_TRAFFIC_CLASS_AL                  EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_HOP_LIMIT_AL                 EHCA_BMASK_IBM(40, 40)
-#define MQPCB_HOP_LIMIT_AL                      EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_SOURCE_GID_IDX_AL            EHCA_BMASK_IBM(41, 41)
-#define MQPCB_SOURCE_GID_IDX_AL                 EHCA_BMASK_IBM(24, 31)
 #define MQPCB_MASK_FLOW_LABEL_AL                EHCA_BMASK_IBM(42, 42)
-#define MQPCB_FLOW_LABEL_AL                     EHCA_BMASK_IBM(12, 31)
 #define MQPCB_MASK_DEST_GID_AL                  EHCA_BMASK_IBM(44, 44)
 #define MQPCB_MASK_MAX_NR_OUTST_SEND_WR         EHCA_BMASK_IBM(45, 45)
-#define MQPCB_MAX_NR_OUTST_SEND_WR              EHCA_BMASK_IBM(16, 31)
 #define MQPCB_MASK_MAX_NR_OUTST_RECV_WR         EHCA_BMASK_IBM(46, 46)
-#define MQPCB_MAX_NR_OUTST_RECV_WR              EHCA_BMASK_IBM(16, 31)
 #define MQPCB_MASK_DISABLE_ETE_CREDIT_CHECK     EHCA_BMASK_IBM(47, 47)
-#define MQPCB_DISABLE_ETE_CREDIT_CHECK          EHCA_BMASK_IBM(31, 31)
-#define MQPCB_QP_NUMBER                         EHCA_BMASK_IBM( 8, 31)
 #define MQPCB_MASK_QP_ENABLE                    EHCA_BMASK_IBM(48, 48)
-#define MQPCB_QP_ENABLE                         EHCA_BMASK_IBM(31, 31)
 #define MQPCB_MASK_CURR_SRQ_LIMIT               EHCA_BMASK_IBM(49, 49)
-#define MQPCB_CURR_SRQ_LIMIT                    EHCA_BMASK_IBM(16, 31)
 #define MQPCB_MASK_QP_AFF_ASYN_EV_LOG_REG       EHCA_BMASK_IBM(50, 50)
 #define MQPCB_MASK_SHARED_RQ_HNDL               EHCA_BMASK_IBM(51, 51)
 
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index ead4e71..0338f1f 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -1962,19 +1962,13 @@ int ehca_query_qp(struct ib_qp *qp,
 	qp_attr->cap.max_inline_data = my_qp->sq_max_inline_data_size;
 	qp_attr->dest_qp_num = qpcb->dest_qp_nr;
 
-	qp_attr->pkey_index =
-		EHCA_BMASK_GET(MQPCB_PRIM_P_KEY_IDX, qpcb->prim_p_key_idx);
-
-	qp_attr->port_num =
-		EHCA_BMASK_GET(MQPCB_PRIM_PHYS_PORT, qpcb->prim_phys_port);
-
+	qp_attr->pkey_index = qpcb->prim_p_key_idx;
+	qp_attr->port_num = qpcb->prim_phys_port;
 	qp_attr->timeout = qpcb->timeout;
 	qp_attr->retry_cnt = qpcb->retry_count;
 	qp_attr->rnr_retry = qpcb->rnr_retry_count;
 
-	qp_attr->alt_pkey_index =
-		EHCA_BMASK_GET(MQPCB_PRIM_P_KEY_IDX, qpcb->alt_p_key_idx);
-
+	qp_attr->alt_pkey_index = qpcb->alt_p_key_idx;
 	qp_attr->alt_port_num = qpcb->alt_phys_port;
 	qp_attr->alt_timeout = qpcb->timeout_al;
 
@@ -2061,8 +2055,7 @@ int ehca_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 		update_mask |=
 			EHCA_BMASK_SET(MQPCB_MASK_CURR_SRQ_LIMIT, 1)
 			| EHCA_BMASK_SET(MQPCB_MASK_QP_AFF_ASYN_EV_LOG_REG, 1);
-		mqpcb->curr_srq_limit =
-			EHCA_BMASK_SET(MQPCB_CURR_SRQ_LIMIT, attr->srq_limit);
+		mqpcb->curr_srq_limit = attr->srq_limit;
 		mqpcb->qp_aff_asyn_ev_log_reg =
 			EHCA_BMASK_SET(QPX_AAELOG_RESET_SRQ_LIMIT, 1);
 	}
@@ -2125,8 +2118,7 @@ int ehca_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr)
 
 	srq_attr->max_wr = qpcb->max_nr_outst_recv_wr - 1;
 	srq_attr->max_sge = 3;
-	srq_attr->srq_limit = EHCA_BMASK_GET(
-		MQPCB_CURR_SRQ_LIMIT, qpcb->curr_srq_limit);
+	srq_attr->srq_limit = qpcb->curr_srq_limit;
 
 	if (ehca_debug_level >= 2)
 		ehca_dmp(qpcb, 4*70, "qp_num=%x", my_qp->real_qp_num);
-- 
1.5.5



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Remove superfluous bitmasks from QP control block
  2009-06-03 14:28   ` [PATCH] IB/ehca: Remove superfluous bitmasks from QP control block Joachim Fenkes
@ 2009-06-03 20:26     ` Roland Dreier
  0 siblings, 0 replies; 22+ messages in thread
From: Roland Dreier @ 2009-06-03 20:26 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen,
	Alexander Schmidt

looks fine, applied for 2.6.31

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] IB/ehca: Fix CQE flags reporting
  2008-06-06 20:20 ` [ofa-general] " Dotan Barak
                     ` (5 preceding siblings ...)
  2009-06-03 14:28   ` [PATCH] IB/ehca: Remove superfluous bitmasks from QP control block Joachim Fenkes
@ 2009-09-01 11:55   ` Joachim Fenkes
  2009-09-01 19:55     ` Roland Dreier
  6 siblings, 1 reply; 22+ messages in thread
From: Joachim Fenkes @ 2009-09-01 11:55 UTC (permalink / raw)
  To: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG
  Cc: Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen, Alexander Schmidt

Was reporting CQE flags in the wrong bit positions, causing consumers to
miss incoming immediate data.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
---

Please review and queue for 2.6.32 if you think it's okay. Thanks!
  Joachim

 drivers/infiniband/hw/ehca/ehca_reqs.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
index 5a3d96f..8fd88cd 100644
--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
+++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
@@ -786,7 +786,11 @@ repoll:
 	wc->slid = cqe->rlid;
 	wc->dlid_path_bits = cqe->dlid;
 	wc->src_qp = cqe->remote_qp_number;
-	wc->wc_flags = cqe->w_completion_flags;
+	/*
+	 * HW has "Immed data present" and "GRH present" in bits 6 and 5.
+	 * SW defines those in bits 1 and 0, so we can just shift and mask.
+	 */
+	wc->wc_flags = (cqe->w_completion_flags >> 5) & 3;
 	wc->ex.imm_data = cpu_to_be32(cqe->immediate_data);
 	wc->sl = cqe->service_level;
 
-- 
1.6.0.4





^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] IB/ehca: Fix CQE flags reporting
  2009-09-01 11:55   ` [PATCH] IB/ehca: Fix CQE flags reporting Joachim Fenkes
@ 2009-09-01 19:55     ` Roland Dreier
  0 siblings, 0 replies; 22+ messages in thread
From: Roland Dreier @ 2009-09-01 19:55 UTC (permalink / raw)
  To: Joachim Fenkes
  Cc: LinuxPPC-Dev, LKML, OF-General, Roland Dreier, OF-EWG,
	Stefan Roscher, Christoph Raisch, Hoang-Nam Nguyen,
	Alexander Schmidt

applied, thanks

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2009-09-01 19:55 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-06-06 16:35 IB/ehca: Reject send WRs only for RESET, INIT and RTR state Joachim Fenkes
2008-06-06 18:22 ` Roland Dreier
2008-06-06 20:20 ` [ofa-general] " Dotan Barak
2008-06-09 11:24   ` [PATCH] IB/ehca: Reject recv WRs if QP is in RESET state Joachim Fenkes
2008-06-20 17:26     ` Roland Dreier
2008-07-01 14:14   ` [PATCH] IB/ehca: Make device table externally visible Joachim Fenkes
2008-07-01 17:55     ` Roland Dreier
2008-11-07 16:42   ` [PATCH] IB/ehca: Fix suppression of port activation events Joachim Fenkes
2008-11-10 20:36     ` Roland Dreier
2008-11-11  9:04       ` Joachim Fenkes
2008-11-21 15:37   ` [PATCH] IB/ehca: Fix lockdep failures for shca_list_lock Joachim Fenkes
2008-11-21 16:02     ` Johannes Berg
2008-11-21 16:18       ` [PATCH] IB/ehca: Fix locking " Joachim Fenkes
2008-11-21 18:28         ` Roland Dreier
2008-11-22  3:41       ` [PATCH] IB/ehca: Fix lockdep failures " Michael Ellerman
2008-11-25 12:58   ` [PATCH] IB/ehca: Change misleading error message Joachim Fenkes
2008-11-25 23:13     ` Roland Dreier
2008-11-26 13:44       ` Joachim Fenkes
2009-06-03 14:28   ` [PATCH] IB/ehca: Remove superfluous bitmasks from QP control block Joachim Fenkes
2009-06-03 20:26     ` Roland Dreier
2009-09-01 11:55   ` [PATCH] IB/ehca: Fix CQE flags reporting Joachim Fenkes
2009-09-01 19:55     ` Roland Dreier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).