[ewg] ofa_1_5_kernel 20100703-0200 daily build status

2010-07-03 Thread Vladimir Sokolovsky (Mellanox)
This email was generated automatically, please do not reply


git_url: git://git.openfabrics.org/ofed_1_5/linux-2.6.git
git_branch: ofed_kernel_1_5

Common build parameters: 

Passed:
Passed on i686 with linux-2.6.18
Passed on i686 with linux-2.6.19
Passed on i686 with linux-2.6.21.1
Passed on i686 with linux-2.6.26
Passed on i686 with linux-2.6.24
Passed on i686 with linux-2.6.22
Passed on i686 with linux-2.6.27
Passed on x86_64 with linux-2.6.16.60-0.54.5-smp
Passed on x86_64 with linux-2.6.16.60-0.21-smp
Passed on x86_64 with linux-2.6.18
Passed on x86_64 with linux-2.6.18-128.el5
Passed on x86_64 with linux-2.6.18-194.el5
Passed on x86_64 with linux-2.6.18-164.el5
Passed on x86_64 with linux-2.6.19
Passed on x86_64 with linux-2.6.18-93.el5
Passed on x86_64 with linux-2.6.21.1
Passed on x86_64 with linux-2.6.20
Passed on x86_64 with linux-2.6.22
Passed on x86_64 with linux-2.6.26
Passed on x86_64 with linux-2.6.24
Passed on x86_64 with linux-2.6.25
Passed on x86_64 with linux-2.6.27
Passed on x86_64 with linux-2.6.27.19-5-smp
Passed on x86_64 with linux-2.6.9-67.ELsmp
Passed on x86_64 with linux-2.6.9-78.ELsmp
Passed on x86_64 with linux-2.6.9-89.ELsmp
Passed on ia64 with linux-2.6.19
Passed on ia64 with linux-2.6.18
Passed on ia64 with linux-2.6.23
Passed on ia64 with linux-2.6.21.1
Passed on ia64 with linux-2.6.22
Passed on ia64 with linux-2.6.26
Passed on ia64 with linux-2.6.24
Passed on ia64 with linux-2.6.25
Passed on ppc64 with linux-2.6.18
Passed on ppc64 with linux-2.6.19

Failed:
___
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg


Re: [ewg] [PATCH v2] libibverbs: ibv_fork_init() and libhugetlbfs

2010-07-03 Thread Roland Dreier
 >  When registering two memory regions A and B from within
 > the same huge page, we will end up with one node in the tree which covers the
 > whole huge page after registering A. When the second MR is registered, a node
 > is created with the MR size rounded to the system page size (as there is no
 > need to call madvise(), it is not noticed that MR B is part of a huge page).
 > 
 > Now if MR A is deregistered before MR B, I see that the tree containing
 > mem_nodes is empty afterwards, which causes problems for the deregistration 
 > of
 > MR B, leaving the tree in a corrupted state with negative refcounts. This 
 > also
 > breaks later registrations of other memory regions within this huge page.

Good thing I didn't get around to applying the patch yet ;)

I haven't thought this through fully, but it seems that maybe we could
extend the madvise tracking tree to keep track of the page size used for
each node in the tree.  Then for the registration of MR B above, we
would find the node for MR A covered MR B and we should be able to get
the ref counting right.

 - R.
-- 
Roland Dreier  || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html
___
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg


[ewg] [PATCH] RDMA/nes: sometimes ifdown command hangs

2010-07-03 Thread Faisal Latif
When ib_unregister_device() is called from netdev stop during ifdown, it
sometimes hangs.  Changes made to indicate port_err to ib_dispatch_event()
during netdev stop and port_active during netdev open. The 
ib_unregister_device()
is only called during remove of the module.

Signed-off-by: Faisal Latif 
---
 kernel_patches/fixes/nes_0038_ifdown_hang.patch |  105 +++
 1 files changed, 105 insertions(+), 0 deletions(-)
 create mode 100644 kernel_patches/fixes/nes_0038_ifdown_hang.patch

diff --git a/kernel_patches/fixes/nes_0038_ifdown_hang.patch 
b/kernel_patches/fixes/nes_0038_ifdown_hang.patch
new file mode 100644
index 000..b18638d
--- /dev/null
+++ b/kernel_patches/fixes/nes_0038_ifdown_hang.patch
@@ -0,0 +1,105 @@
+diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h
+index faf420f..bc54a27 100644
+--- a/drivers/infiniband/hw/nes/nes.h
 b/drivers/infiniband/hw/nes/nes.h
+@@ -264,6 +264,7 @@ struct nes_device {
+   u16base_doorbell_index;
+   u16currcq_count;
+   u16deepcq_count;
++  u8 iw_status;
+   u8 msi_enabled;
+   u8 netdev_count;
+   u8 napi_isr_ran;
+@@ -529,6 +530,7 @@ void nes_cm_disconn_worker(void *);
+ int nes_hw_modify_qp(struct nes_device *, struct nes_qp *, u32, u32, u32);
+ int nes_modify_qp(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata 
*);
+ struct nes_ib_device *nes_init_ofa_device(struct net_device *);
++void  nes_port_ibevent(struct nes_vnic *nesvnic);
+ void nes_destroy_ofa_device(struct nes_ib_device *);
+ int nes_register_ofa_device(struct nes_ib_device *);
+ 
+diff --git a/drivers/infiniband/hw/nes/nes_hw.c 
b/drivers/infiniband/hw/nes/nes_hw.c
+index c9bddbd..6b034f0 100644
+--- a/drivers/infiniband/hw/nes/nes_hw.c
 b/drivers/infiniband/hw/nes/nes_hw.c
+@@ -3282,9 +3282,15 @@ static void nes_terminate_connection(struct nes_device 
*nesdev, struct nes_qp *n
+   else
+   mod_qp_flags |= NES_CQP_QP_TERM_DONT_SEND_TERM_MSG;
+ 
+-  nes_terminate_start_timer(nesqp);
+-  nesqp->term_flags |= NES_TERM_SENT;
+-  nes_hw_modify_qp(nesdev, nesqp, mod_qp_flags, termlen, 0);
++  if (!nesdev->iw_status)  {
++  nesqp->term_flags = NES_TERM_DONE;
++  nes_hw_modify_qp(nesdev, nesqp, NES_CQP_QP_IWARP_STATE_ERROR, 
0, 0);
++  nes_cm_disconn(nesqp);
++  } else {
++  nes_terminate_start_timer(nesqp);
++  nesqp->term_flags |= NES_TERM_SENT;
++  nes_hw_modify_qp(nesdev, nesqp, mod_qp_flags, termlen, 0);
++  }
+ }
+ 
+ static void nes_terminate_send_fin(struct nes_device *nesdev,
+diff --git a/drivers/infiniband/hw/nes/nes_nic.c 
b/drivers/infiniband/hw/nes/nes_nic.c
+index d9d9592..a0033fb 100644
+--- a/drivers/infiniband/hw/nes/nes_nic.c
 b/drivers/infiniband/hw/nes/nes_nic.c
+@@ -231,6 +231,13 @@ static int nes_netdev_open(struct net_device *netdev)
+   NES_MAC_INT_TX_UNDERFLOW | 
NES_MAC_INT_TX_ERROR));
+   first_nesvnic = nesvnic;
+   }
++
++  if (nesvnic->of_device_registered) {
++  nesdev->iw_status = 1;
++  nesdev->nesadapter->send_term_ok = 1;
++  nes_port_ibevent(nesvnic);
++  }
++
+   if (first_nesvnic->linkup) {
+   /* Enable network packets */
+   nesvnic->linkup = 1;
+@@ -308,9 +315,9 @@ static int nes_netdev_stop(struct net_device *netdev)
+ 
+ 
+   if (nesvnic->of_device_registered) {
+-  nes_destroy_ofa_device(nesvnic->nesibdev);
+-  nesvnic->nesibdev = NULL;
+-  nesvnic->of_device_registered = 0;
++  nesdev->nesadapter->send_term_ok = 0;
++  nesdev->iw_status = 0;
++  nes_port_ibevent(nesvnic);
+   }
+   nes_destroy_nic_qp(nesvnic);
+ 
+diff --git a/drivers/infiniband/hw/nes/nes_verbs.c 
b/drivers/infiniband/hw/nes/nes_verbs.c
+index d4f2b14..8c3ab85 100644
+--- a/drivers/infiniband/hw/nes/nes_verbs.c
 b/drivers/infiniband/hw/nes/nes_verbs.c
+@@ -3258,6 +3258,7 @@ int nes_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr 
*attr,
+   nesqp->hte_added = 0;
+   }
+   if ((nesqp->hw_tcp_state > 
NES_AEQE_TCP_STATE_CLOSED) &&
++  (nesdev->iw_status) &&
+   (nesqp->hw_tcp_state != 
NES_AEQE_TCP_STATE_TIME_WAIT)) {
+   next_iwarp_state |= NES_CQP_QP_RESET;
+   } else {
+@@ -4146,6 +4147,18 @@ struct nes_ib_device *nes_init_ofa_device(struct 
net_device *netdev)
+   return nesibdev;
+ }
+ 
++void  nes_port_ibevent(struct nes_vnic *nesvnic)
++{
++  struct nes_ib_device *nesibdev = ne