linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [GIT PULL] please pull infiniband.git
@ 2012-02-01  6:36 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-02-01  6:36 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git rdma-for-linus

----------------------------------------------------------------

InfiniBand/RDMA fixes for 3.3:

 - Fix a crash due to a regression (uninitialized refcnt) introduced in
   3.2 with XRC support.
 - Close race in how ucma reports events when connect fails.
 - Process vendor-specific MADs in mlx4 so that eg FDR-10 data rate works.
 - Fix regression in qib caused by over-aggressive PCIe tuning.
 - Other small fixes for hardware drivers (ipath, nes, qib).

----------------------------------------------------------------
Bernd Schubert (1):
      RDMA/core: Fix kernel panic by always initializing qp->usecnt

Dan Carpenter (1):
      IB/ipath: Calling PTR_ERR() on right variable in create_file()

Jack Morgenstein (1):
      IB/mlx4: pass SMP vendor-specific attribute MADs to firmware

Julia Lawall (1):
      IB/qib: Use GFP_ATOMIC when locks are held

Mike Marciniszyn (1):
      IB/qib: Roll back PCIe tuning change

Roland Dreier (2):
      RDMA/nes: Add missing rcu_read_unlock() in nes_addr_resolve_neigh()
      Merge branches 'cma', 'ipath', 'misc', 'mlx4', 'nes' and 'qib' into for-next

Sean Hefty (1):
      RDMA/ucma: Discard all events for new connections until accepted

Tatyana Nikolova (4):
      RDMA/nes: Fix for sending MPA reject frame
      RDMA/nes: Fix fast memory registration length
      RDMA/nes: Fix fast memory registration opcode
      RDMA/nes: Copyright update

 drivers/infiniband/core/ucma.c          |    5 ++++-
 drivers/infiniband/core/uverbs_cmd.c    |    1 +
 drivers/infiniband/core/verbs.c         |    2 +-
 drivers/infiniband/hw/ipath/ipath_fs.c  |    2 +-
 drivers/infiniband/hw/mlx4/mad.c        |    7 ++-----
 drivers/infiniband/hw/nes/nes.c         |    2 +-
 drivers/infiniband/hw/nes/nes.h         |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c      |   10 +++++++---
 drivers/infiniband/hw/nes/nes_cm.h      |    2 +-
 drivers/infiniband/hw/nes/nes_context.h |    2 +-
 drivers/infiniband/hw/nes/nes_hw.c      |    2 +-
 drivers/infiniband/hw/nes/nes_hw.h      |    2 +-
 drivers/infiniband/hw/nes/nes_mgt.c     |    2 +-
 drivers/infiniband/hw/nes/nes_mgt.h     |    2 +-
 drivers/infiniband/hw/nes/nes_nic.c     |    2 +-
 drivers/infiniband/hw/nes/nes_user.h    |    2 +-
 drivers/infiniband/hw/nes/nes_utils.c   |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c   |    6 ++++--
 drivers/infiniband/hw/nes/nes_verbs.h   |    2 +-
 drivers/infiniband/hw/qib/qib_iba6120.c |    2 +-
 drivers/infiniband/hw/qib/qib_pcie.c    |    2 +-
 21 files changed, 34 insertions(+), 27 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2015-04-22 17:08 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2015-04-22 17:08 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
InfiniBand/RDMA updates for 4.1:
 - IPoIB fixes from Doug Ledford and Erez Shitrit
 - iSER updates from Sagi Grimberg
 - mlx4 GUID handling changes from Yishai Hadas
 - other misc fixes

----------------------------------------------------------------
Bart Van Assche (1):
      IB/srp: Use P_Key cache for P_Key lookups

Doug Ledford (11):
      IB/ipoib: factor out ah flushing
      IB/ipoib: change init sequence ordering
      IB/ipoib: Consolidate rtnl_lock tasks in workqueue
      IB/ipoib: Make the carrier_on_task race aware
      IB/ipoib: Use dedicated workqueues per interface
      IB/ipoib: No longer use flush as a parameter
      IB/ipoib: fix MCAST_FLAG_BUSY usage
      IB/ipoib: deserialize multicast joins
      IB/ipoib: drop mcast_mutex usage
      ib_srpt: convert printk's to pr_* functions
      Merge branches 'cve-fixup', 'ipoib', 'iser', 'misc-4.1', 'or-mlx4' and 'srp' into for-4.1

Erez Shitrit (6):
      IB/ipoib: Use one linear skb in RX flow
      IB/ipoib: Update broadcast record values after each successful join request
      IB/ipoib: Handle QP in SQE state
      IB/ipoib: Save only IPOIB_MAX_PATH_REC_QUEUE skb's
      IB/ipoib: Remove IPOIB_MCAST_RUN bit
      IB/mlx4: Fix WQE LSO segment calculation

Honggang LI (1):
      mlx5: wrong page mask if CONFIG_ARCH_DMA_ADDR_T_64BIT enabled for 32Bit architectures

Sagi Grimberg (18):
      IB/iser: Fix unload during ep_poll wrong dereference
      IB/iser: Handle fastreg/local_inv completion errors
      IB/iser: Fix wrong calculation of protection buffer length
      IB/iser: Remove redundant cmd_data_len calculation
      IB/iser: Remove a redundant struct iser_data_buf
      IB/iser: Don't pass ib_device to fall_to_bounce_buff routine
      IB/iser: Move memory reg/dereg routines to iser_memory.c
      IB/iser: Remove redundant assignments in iser_reg_page_vec
      IB/iser: Get rid of struct iser_rdma_regd
      IB/iser: Merge build page-vec into register page-vec
      IB/iser: Move fastreg descriptor pool get/put to helper functions
      IB/iser: Move PI context alloc/free to routines
      IB/iser: Make fastreg pool cache friendly
      IB/iser: Modify struct iser_mem_reg members
      IB/iser: Pass struct iser_mem_reg to iser_fast_reg_mr and iser_reg_sig_mr
      IB/iser: Remove code duplication for a single DMA entry
      IB/iser: Bump version to 1.6
      IB/iser: Rewrite bounce buffer code path

Sebastian Ott (1):
      infiniband/mlx4: check for mapping error

Selvin Xavier (1):
      MAINTAINERS: Adding list of maintainers for ocrdma

Stephen Hemminger (1):
      rdma: replace deprecated ifconfig in doc

Sébastien Dugué (1):
      ib_uverbs: Fix pages leak when using XRC SRQs

Yann Droneaud (2):
      IB/core: disallow registering 0-sized memory region
      IB/core: don't disallow registering region starting at 0x0

Yishai Hadas (9):
      IB/mlx4: Alias GUID adding persistency support
      net/mlx4_core: Manage alias GUID per VF
      net/mlx4_core: Set initial admin GUIDs for VFs
      IB/mlx4: Manage admin alias GUID upon admin request
      IB/mlx4: Change init flow to request alias GUIDs for active VFs
      IB/mlx4: Request alias GUID on demand
      net/mlx4_core: Raise slave shutdown event upon FLR
      net/mlx4_core: Return the admin alias GUID upon host view request
      IB/mlx4: Change alias guids default to be host assigned

 Documentation/filesystems/nfs/nfs-rdma.txt         |   9 +-
 MAINTAINERS                                        |   9 +
 drivers/infiniband/core/umem.c                     |   7 +-
 drivers/infiniband/core/uverbs_main.c              |  22 +-
 drivers/infiniband/hw/mlx4/alias_GUID.c            | 457 +++++++++++++-----
 drivers/infiniband/hw/mlx4/mad.c                   |   9 +
 drivers/infiniband/hw/mlx4/main.c                  |  26 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |  14 +-
 drivers/infiniband/hw/mlx4/qp.c                    |   7 +-
 drivers/infiniband/hw/mlx4/sysfs.c                 |  44 +-
 drivers/infiniband/ulp/ipoib/ipoib.h               |  31 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c            |  18 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c            | 195 ++++----
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |  73 ++-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c     | 520 ++++++++++----------
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c         |  44 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h           |  66 +--
 drivers/infiniband/ulp/iser/iser_initiator.c       |  66 ++-
 drivers/infiniband/ulp/iser/iser_memory.c          | 523 ++++++++++++---------
 drivers/infiniband/ulp/iser/iser_verbs.c           | 220 +++------
 drivers/infiniband/ulp/srp/ib_srp.c                |   9 +-
 drivers/infiniband/ulp/srpt/ib_srpt.c              | 188 ++++----
 drivers/net/ethernet/mellanox/mlx4/cmd.c           |  42 +-
 drivers/net/ethernet/mellanox/mlx4/eq.c            |   2 +
 drivers/net/ethernet/mellanox/mlx4/main.c          |  31 ++
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |   1 +
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    |  10 +-
 include/linux/mlx4/device.h                        |   4 +
 28 files changed, 1513 insertions(+), 1134 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2015-04-02 17:27 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2015-04-02 17:27 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
One 4.0 RDMA change:
 - Fix for exploitable integer overflow in uverbs interface.

----------------------------------------------------------------
Shachar Raindel (1):
      IB/uverbs: Prevent integer overflow in ib_umem_get address arithmetic

 drivers/infiniband/core/umem.c | 8 ++++++++
 1 file changed, 8 insertions(+)

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

* [GIT PULL] please pull infiniband.git
@ 2015-02-20 17:08 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2015-02-20 17:08 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
InfiniBand/RDMA changes for 3.20 merge window:
 - Re-enable on-demand paging changes with stable ABI
 - Fairly large set of ocrdma HW driver fixes
 - Some qib HW driver fixes
 - Other miscellaneous changes

----------------------------------------------------------------
Andreea-Cristina Bernat (2):
      IB/qib: Replace rcu_assign_pointer() with RCU_INIT_POINTER() in qib_qp.c
      IB/qib: Replace rcu_assign_pointer() with RCU_INIT_POINTER() in qib_keys.c

Ariel Nahum (1):
      IB/iser: Release the iscsi endpoint if ep_disconnect wasn't called

Bart Van Assche (1):
      MAINTAINERS: Update SRP initiator entry

Dan Carpenter (2):
      IB/mlx5: Fix error code in get_port_caps()
      RDMA/ocrdma: Fix off by one in ocrdma_query_gid()

Devesh Sharma (4):
      RDMA/ocrdma: Report correct count of interrupt vectors while registering ocrdma device
      RDMA/ocrdma: Discontinue support of RDMA-READ-WITH-INVALIDATE
      RDMA/ocrdma: Honor return value of ocrdma_resolve_dmac
      RDMA/ocrdma: set vlan present bit for user AH

Eli Cohen (1):
      IB/core: Add support for extended query device caps

Haggai Eran (3):
      IB/core: Properly handle registration of on-demand paging MRs after dereg
      IB/core: Add on demand paging caps to ib_uverbs_ex_query_device
      IB/mlx5: Enable the ODP capability query verb

Hariprasad S (2):
      RDMA/cxgb4: Serialize CQ event upcalls with CQ destruction
      RDMA/cxgb4: Don't hang threads forever waiting on WR replies

Ilya Nelkenbaum (1):
      IB/core: When marshaling ucma path from user-space, clear unused fields

Jack Morgenstein (1):
      IB/mlx4: In mlx4_ib_demux_cm, print out GUID in host-endian order

Majd Dibbiny (3):
      IB/mlx4: Fix memory leak in __mlx4_ib_modify_qp
      IB/mlx4: Bug fixes in mlx4_ib_resize_cq
      IB/mlx5: Update the dev in reg_create

Mike Marciniszyn (3):
      IB/qib: Fix sizeof checkpatch warnings
      IB/qib: Fix checkpatch warnings
      IB/qib: Add blank line after declaration

Mitesh Ahuja (7):
      RDMA/ocrdma: Add support for IB stack compliant stats in sysfs.
      RDMA/ocrdma: Increase the GID table size.
      RDMA/ocrdma: Move PD resource management to driver.
      RDMA/ocrdma: Host crash on destroying device resources
      RDMA/ocrdma: Add support for interrupt moderation
      RDMA/ocrdma: remove reference of ocrdma_dev out of ocrdma_qp structure
      RDMA/ocrdma: Update the ocrdma module version string

Mitko Haralanov (1):
      IB/qib: Do not write EEPROM

Moshe Lazer (1):
      IB/core: Fix deadlock on uverbs modify_qp error flow

Or Gerlitz (1):
      IB/mlx4: Fix wrong usage of IPv4 protocol for multicast attach/detach

Padmanabh Ratnakar (1):
      RDMA/ocrdma: Report correct state in ibv_query_qp

Rasmus Villemoes (2):
      RDMA/ocrdma: Help gcc generate better code for ocrdma_srq_toggle_bit
      RDMA/ocrdma: Use unsigned for bit index

Rickard Strandqvist (1):
      IB/ipath: Remove unused function in ipath_wc_ppc64

Roi Dayan (1):
      IB/iser: Use correct dma direction when unmapping SGs

Roland Dreier (1):
      Merge branches 'core', 'cxgb4', 'iser', 'mlx4', 'mlx5', 'ocrdma', 'odp', 'qib' and 'srp' into for-next

Sagi Grimberg (1):
      IB/iser: Fix memory regions possible leak

Selvin Xavier (2):
      RDMA/ocrdma: Debugfs enhancments for ocrdma driver
      RDMA/ocrdma: Allow expansion of the SQ CQEs via buddy CQ expansion of the QP

Vinit Agnihotri (1):
      IB/qib: Add support for the new QMH7360 card

 MAINTAINERS                                   |   2 +-
 drivers/infiniband/core/ucma.c                |   3 +
 drivers/infiniband/core/umem_odp.c            |   3 +-
 drivers/infiniband/core/uverbs.h              |   1 +
 drivers/infiniband/core/uverbs_cmd.c          | 158 +++++++++----
 drivers/infiniband/core/uverbs_main.c         |   1 +
 drivers/infiniband/hw/cxgb4/ev.c              |   9 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h        |  29 ++-
 drivers/infiniband/hw/ipath/ipath_kernel.h    |   3 -
 drivers/infiniband/hw/ipath/ipath_wc_ppc64.c  |  13 --
 drivers/infiniband/hw/ipath/ipath_wc_x86_64.c |  15 --
 drivers/infiniband/hw/mlx4/cm.c               |   2 +-
 drivers/infiniband/hw/mlx4/cq.c               |   7 +-
 drivers/infiniband/hw/mlx4/main.c             |  10 +-
 drivers/infiniband/hw/mlx4/qp.c               |   6 +-
 drivers/infiniband/hw/mlx5/main.c             |   4 +-
 drivers/infiniband/hw/mlx5/mr.c               |   1 +
 drivers/infiniband/hw/ocrdma/ocrdma.h         |  38 +++-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c      |  38 +++-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.h      |   6 +
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c      | 312 ++++++++++++++++++++++----
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h      |   2 +
 drivers/infiniband/hw/ocrdma/ocrdma_main.c    |  12 +-
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h     |  68 +++++-
 drivers/infiniband/hw/ocrdma/ocrdma_stats.c   | 241 ++++++++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_stats.h   |   6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c   | 183 ++++++++++++---
 drivers/infiniband/hw/qib/qib.h               |  16 +-
 drivers/infiniband/hw/qib/qib_common.h        |   4 +-
 drivers/infiniband/hw/qib/qib_debugfs.c       |   1 -
 drivers/infiniband/hw/qib/qib_diag.c          |   9 +-
 drivers/infiniband/hw/qib/qib_driver.c        |   5 +-
 drivers/infiniband/hw/qib/qib_eeprom.c        | 198 +---------------
 drivers/infiniband/hw/qib/qib_file_ops.c      |  26 ++-
 drivers/infiniband/hw/qib/qib_fs.c            |   9 +-
 drivers/infiniband/hw/qib/qib_iba6120.c       |  15 +-
 drivers/infiniband/hw/qib/qib_iba7220.c       |  14 +-
 drivers/infiniband/hw/qib/qib_iba7322.c       |  52 +++--
 drivers/infiniband/hw/qib/qib_init.c          |  12 +-
 drivers/infiniband/hw/qib/qib_intr.c          |   1 -
 drivers/infiniband/hw/qib/qib_keys.c          |   4 +-
 drivers/infiniband/hw/qib/qib_mad.c           |  20 +-
 drivers/infiniband/hw/qib/qib_mmap.c          |   2 +-
 drivers/infiniband/hw/qib/qib_mr.c            |  10 +-
 drivers/infiniband/hw/qib/qib_pcie.c          |  10 +-
 drivers/infiniband/hw/qib/qib_qp.c            |   8 +-
 drivers/infiniband/hw/qib/qib_qsfp.c          |  13 +-
 drivers/infiniband/hw/qib/qib_rc.c            |   4 +-
 drivers/infiniband/hw/qib/qib_ruc.c           |   8 +-
 drivers/infiniband/hw/qib/qib_sd7220.c        |   9 +-
 drivers/infiniband/hw/qib/qib_sysfs.c         |  28 +--
 drivers/infiniband/hw/qib/qib_twsi.c          |   5 +-
 drivers/infiniband/hw/qib/qib_tx.c            |   1 +
 drivers/infiniband/hw/qib/qib_ud.c            |   2 +-
 drivers/infiniband/hw/qib/qib_user_sdma.c     |   8 +-
 drivers/infiniband/hw/qib/qib_verbs.c         |  15 +-
 drivers/infiniband/hw/qib/qib_verbs_mcast.c   |   4 +-
 drivers/infiniband/hw/qib/qib_wc_x86_64.c     |   7 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h      |   4 +-
 drivers/infiniband/ulp/iser/iser_initiator.c  |  16 +-
 drivers/infiniband/ulp/iser/iser_memory.c     |   9 +-
 drivers/infiniband/ulp/iser/iser_verbs.c      |  27 ++-
 include/uapi/rdma/ib_user_verbs.h             |  23 ++
 63 files changed, 1212 insertions(+), 560 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2015-02-06 21:19 Roland Dreier
@ 2015-02-07 15:58 ` Yann Droneaud
  0 siblings, 0 replies; 223+ messages in thread
From: Yann Droneaud @ 2015-02-07 15:58 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Roland Dreier, linux-rdma, linux-kernel

Hi,

Le vendredi 06 février 2015 à 13:19 -0800, Roland Dreier a écrit :
> 
> Please pull from
> 
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
> 
> ----------------------------------------------------------------
> One more last-second RDMA change for 3.19:
>  - Yann realized that the previous revert of new userspace ABI did not
>    go far enough, and we're still exposing a change that we don't want.
>    Revert even closer to 3.18 interface to make sure we get things right
>    in the long run.
> 
> Sorry for sending this at the very end of the release cycle, but we
> didn't realize the scope of the required fix until just now.
> 

I hope this could go in v3.19 as, at this stage, we don't want to expose
any bits of this ABI in a released kernel.

Regards.

-- 
Yann Droneaud
OPTEYA



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

* [GIT PULL] please pull infiniband.git
@ 2015-02-06 21:19 Roland Dreier
  2015-02-07 15:58 ` Yann Droneaud
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2015-02-06 21:19 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
One more last-second RDMA change for 3.19:
 - Yann realized that the previous revert of new userspace ABI did not
   go far enough, and we're still exposing a change that we don't want.
   Revert even closer to 3.18 interface to make sure we get things right
   in the long run.

Sorry for sending this at the very end of the release cycle, but we
didn't realize the scope of the required fix until just now.

----------------------------------------------------------------
Yann Droneaud (1):
      Revert "IB/core: Add support for extended query device caps"

 drivers/infiniband/core/uverbs.h     |   1 -
 drivers/infiniband/core/uverbs_cmd.c | 137 +++++++++++------------------------
 drivers/infiniband/hw/mlx5/main.c    |   2 -
 include/rdma/ib_verbs.h              |   5 +-
 include/uapi/rdma/ib_user_verbs.h    |  27 -------
 5 files changed, 42 insertions(+), 130 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2015-02-03 21:42 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2015-02-03 21:42 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
Last minute InfiniBand/RDMA changes for 3.19:
 - Revert IPoIB driver back to 3.18 state.  We had a number of fixes go
   into 3.19, but they introduced regressions.  We tried to get everything
   fixed up but ran out of time, so we'll try again for 3.20.
 - Similarly, turn off the new "extended query port" verb.  Late in the
   cycle we realized the ABI is not quite right, and rather than freeze
   something in a rush and make a mistake, we'll take a bit more time
   and get it right in 3.20.

----------------------------------------------------------------
Haggai Eran (1):
      IB/core: Temporarily disable ex_query_device uverb

Roland Dreier (9):
      Revert "IPoIB: No longer use flush as a parameter"
      Revert "IPoIB: Make ipoib_mcast_stop_thread flush the workqueue"
      Revert "IPoIB: Use dedicated workqueues per interface"
      Revert "IPoIB: change init sequence ordering"
      Revert "IPoIB: fix mcast_dev_flush/mcast_restart_task race"
      Revert "IPoIB: fix MCAST_FLAG_BUSY usage"
      Revert "IPoIB: Make the carrier_on_task race aware"
      Revert "IPoIB: Consolidate rtnl_lock tasks in workqueue"
      Merge branches 'ipoib' and 'odp' into for-next

 drivers/infiniband/core/uverbs_main.c          |   1 -
 drivers/infiniband/ulp/ipoib/ipoib.h           |  19 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |  18 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |  27 +--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |  49 ++---
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 239 +++++++++----------------
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |  22 +--
 7 files changed, 134 insertions(+), 241 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-12-19  0:03 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-12-19  0:03 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
Main batch of InfiniBand/RDMA changes for 3.19:

 - On-demand paging support in core midlayer and mlx5 driver.  This lets
   userspace create non-pinned memory regions and have the adapter HW
   trigger page faults.
 - iSER and IPoIB updates and fixes.
 - Low-level HW driver updates for cxgb4, mlx4 and ocrdma.
 - Other miscellaneous fixes.

----------------------------------------------------------------
Ariel Nahum (2):
      IB/iser: Collapse cleanup and disconnect handlers
      IB/iser: Fix possible NULL derefernce ib_conn->device in session_create

Devesh Sharma (1):
      RDMA/ocrdma: Always resolve destination mac from GRH for UD QPs

Doug Ledford (8):
      IPoIB: Consolidate rtnl_lock tasks in workqueue
      IPoIB: Make the carrier_on_task race aware
      IPoIB: fix MCAST_FLAG_BUSY usage
      IPoIB: fix mcast_dev_flush/mcast_restart_task race
      IPoIB: change init sequence ordering
      IPoIB: Use dedicated workqueues per interface
      IPoIB: Make ipoib_mcast_stop_thread flush the workqueue
      IPoIB: No longer use flush as a parameter

Eli Cohen (1):
      IB/core: Add support for extended query device caps

Haggai Eran (14):
      IB/mlx5: Remove per-MR pas and dma pointers
      IB/mlx5: Enhance UMR support to allow partial page table update
      IB/core: Replace ib_umem's offset field with a full address
      IB/core: Add umem function to read data from user-space
      IB/mlx5: Add function to read WQE from user-space
      IB/core: Implement support for MMU notifiers regarding on demand paging regions
      mlx5_core: Add support for page faults events and low level handling
      IB/mlx5: Implement the ODP capability query verb
      IB/mlx5: Changes in memory region creation to support on-demand paging
      IB/mlx5: Add mlx5_ib_update_mtt to update page tables after creation
      IB/mlx5: Page faults handling infrastructure
      IB/mlx5: Handle page faults
      IB/mlx5: Add support for RDMA read/write responder page faults
      IB/mlx5: Implement on demand paging by adding support for MMU notifiers

Hariprasad S (1):
      RDMA/cxgb4: Handle NET_XMIT return codes

Hariprasad Shenai (2):
      RDMA/cxgb4: Fix locking issue in process_mpa_request
      RDMA/cxgb4: Limit MRs to < 8GB for T4/T5 devices

Jack Morgenstein (2):
      IB/core: Fix mgid key handling in SA agent multicast data-base
      IB/mlx4: Fix an incorrectly shadowed variable in mlx4_ib_rereg_user_mr

Max Gurtovoy (1):
      IB/iser: Fix possible SQ overflow

Minh Tran (1):
      IB/iser: Re-adjust CQ and QP send ring sizes to HW limits

Mitesh Ahuja (1):
      RDMA/ocrdma: Fix ocrdma_query_qp() to report q_key value for UD QPs

Moni Shoua (1):
      IB/core: Do not resolve VLAN if already resolved

Or Gerlitz (1):
      IB/iser: Bump version to 1.5

Or Kehati (1):
      IB/addr: Improve address resolution callback scheduling

Pramod Kumar (2):
      RDMA/cxgb4: Increase epd buff size for debug interface
      RDMA/cxgb4: Configure 0B MRs to match HW implementation

Roland Dreier (2):
      mlx5_core: Re-add MLX5_DEV_CAP_FLAG_ON_DMND_PG flag
      Merge branches 'core', 'cxgb4', 'ipoib', 'iser', 'mlx4', 'ocrdma', 'odp' and 'srp' into for-next

Sagi Grimberg (13):
      IB/iser: Fix catastrophic error flow hang
      IB/iser: Decrement CQ's active QPs accounting when QP creation fails
      IB/iser: Fix sparse warnings
      IB/iser: Fix race between iser connection teardown and scsi TMFs
      IB/iser: Terminate connection before cleaning inflight tasks
      IB/iser: Centralize memory region invalidation to a function
      IB/iser: Remove redundant is_mr indicator
      IB/iser: Use more completion queues
      IB/iser: Micro-optimize iser logging
      IB/iser: Micro-optimize iser_handle_wc
      IB/iser: DIX update
      IB/core: Add flags for on demand paging support
      IB/srp: Allow newline separator for connection string

Shachar Raindel (1):
      IB/core: Add support for on demand paging regions

Steve Wise (1):
      RDMA/cxgb4: Wake up waiters after flushing the qp

Yuval Shaia (1):
      mlx4_core: Check for DPDP violation only when DPDP is not supported

 drivers/infiniband/Kconfig                     |  11 +
 drivers/infiniband/core/Makefile               |   1 +
 drivers/infiniband/core/addr.c                 |   4 +-
 drivers/infiniband/core/multicast.c            |  11 +-
 drivers/infiniband/core/umem.c                 |  72 ++-
 drivers/infiniband/core/umem_odp.c             | 668 +++++++++++++++++++++
 drivers/infiniband/core/umem_rbtree.c          |  94 +++
 drivers/infiniband/core/uverbs.h               |   1 +
 drivers/infiniband/core/uverbs_cmd.c           | 171 ++++--
 drivers/infiniband/core/uverbs_main.c          |   5 +-
 drivers/infiniband/core/verbs.c                |   3 +-
 drivers/infiniband/hw/amso1100/c2_provider.c   |   2 +-
 drivers/infiniband/hw/cxgb4/cm.c               |   7 +-
 drivers/infiniband/hw/cxgb4/device.c           |   2 +-
 drivers/infiniband/hw/cxgb4/mem.c              |  28 +-
 drivers/infiniband/hw/cxgb4/qp.c               |   2 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c         |   2 +-
 drivers/infiniband/hw/ipath/ipath_mr.c         |   2 +-
 drivers/infiniband/hw/mlx4/mr.c                |   1 -
 drivers/infiniband/hw/mlx5/Makefile            |   1 +
 drivers/infiniband/hw/mlx5/main.c              |  45 +-
 drivers/infiniband/hw/mlx5/mem.c               |  69 ++-
 drivers/infiniband/hw/mlx5/mlx5_ib.h           | 116 +++-
 drivers/infiniband/hw/mlx5/mr.c                | 323 ++++++++--
 drivers/infiniband/hw/mlx5/odp.c               | 798 +++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/qp.c                | 197 ++++--
 drivers/infiniband/hw/nes/nes_verbs.c          |   6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c       |   5 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c    |   4 +-
 drivers/infiniband/hw/qib/qib_mr.c             |   2 +-
 drivers/infiniband/ulp/ipoib/ipoib.h           |  19 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |  18 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |  27 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |  49 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 239 +++++---
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |  22 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c       | 104 +++-
 drivers/infiniband/ulp/iser/iscsi_iser.h       |  30 +-
 drivers/infiniband/ulp/iser/iser_initiator.c   |   6 +-
 drivers/infiniband/ulp/iser/iser_memory.c      | 102 +---
 drivers/infiniband/ulp/iser/iser_verbs.c       |  91 ++-
 drivers/infiniband/ulp/srp/ib_srp.c            |   2 +-
 drivers/net/ethernet/mellanox/mlx4/main.c      |   6 +-
 drivers/net/ethernet/mellanox/mlx5/core/eq.c   |  13 +-
 drivers/net/ethernet/mellanox/mlx5/core/fw.c   |  40 ++
 drivers/net/ethernet/mellanox/mlx5/core/qp.c   | 119 ++++
 include/linux/mlx5/device.h                    |  72 ++-
 include/linux/mlx5/driver.h                    |  14 +-
 include/linux/mlx5/qp.h                        |  65 ++
 include/rdma/ib_umem.h                         |  34 +-
 include/rdma/ib_umem_odp.h                     | 160 +++++
 include/rdma/ib_verbs.h                        |  54 +-
 include/uapi/rdma/ib_user_verbs.h              |  29 +-
 53 files changed, 3511 insertions(+), 457 deletions(-)
 create mode 100644 drivers/infiniband/core/umem_odp.c
 create mode 100644 drivers/infiniband/core/umem_rbtree.c
 create mode 100644 drivers/infiniband/hw/mlx5/odp.c
 create mode 100644 include/rdma/ib_umem_odp.h

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

* Re: [GIT PULL] please pull infiniband.git
  2014-11-02 20:06 ` Dave Airlie
  2014-11-03  7:15   ` Eli Cohen
@ 2014-11-03  7:58   ` Sagi Grimberg
  1 sibling, 0 replies; 223+ messages in thread
From: Sagi Grimberg @ 2014-11-03  7:58 UTC (permalink / raw)
  To: Dave Airlie, Roland Dreier; +Cc: Linus Torvalds, linux-rdma, LKML

On 11/2/2014 10:06 PM, Dave Airlie wrote:
> On 17 October 2014 08:52, Roland Dreier <roland@kernel.org> wrote:
>> Hi Linus,
>>
>> Please pull from
>>
>>      git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
>>
>> ----------------------------------------------------------------
>> Main set of InfiniBand/RDMA updates for 3.18 merge window:
>>
>>   - Large set of iSER initiator improvements
>>   - Hardware driver fixes for cxgb4, mlx5 and ocrdma
>>   - Small fixes to core midlayer
>>
>
> building on 32-bit x86.
>
>   CC [M]  drivers/infiniband/ulp/iser/iser_verbs.o
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:
> In function ‘iser_handle_comp_error’:
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1171:33:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>    if (is_iser_tx_desc(iser_conn, (void *)wc->wr_id)) {
>                                   ^
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1172:31:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>     struct iser_tx_desc *desc = (struct iser_tx_desc *)wc->wr_id;
>                                 ^
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:
> In function ‘iser_handle_wc’:
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1198:14:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>      rx_desc = (struct iser_rx_desc *)wc->wr_id;
>                ^
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1203:14:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>      tx_desc = (struct iser_tx_desc *)wc->wr_id;
>                ^
>
> Not sure anyone would ever want to run this code on 32-bit boxes, but
> I'm a bit worried if wr_id is a 64-bit value, and we encode it into a
> 32-bit pointer, you'd always lose the top 32-bits.
>

Hey Dave,

This was addressed in: 
http://marc.info/?l=linux-rdma&m=141448978030924&w=2 (part of iser fixes 
for 3.18-rc).

Thanks!

Sagi.

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

* Re: [GIT PULL] please pull infiniband.git
  2014-11-02 20:06 ` Dave Airlie
@ 2014-11-03  7:15   ` Eli Cohen
  2014-11-03  7:58   ` Sagi Grimberg
  1 sibling, 0 replies; 223+ messages in thread
From: Eli Cohen @ 2014-11-03  7:15 UTC (permalink / raw)
  To: Dave Airlie; +Cc: Roland Dreier, Linus Torvalds, linux-rdma, LKML

On Mon, Nov 03, 2014 at 06:06:45AM +1000, Dave Airlie wrote:
> On 17 October 2014 08:52, Roland Dreier <roland@kernel.org> wrote:
> > Hi Linus,
> >
> > Please pull from
> >
> >     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
> >
> > ----------------------------------------------------------------
> > Main set of InfiniBand/RDMA updates for 3.18 merge window:
> >
> >  - Large set of iSER initiator improvements
> >  - Hardware driver fixes for cxgb4, mlx5 and ocrdma
> >  - Small fixes to core midlayer
> >
> 
> building on 32-bit x86.
> 
>  CC [M]  drivers/infiniband/ulp/iser/iser_verbs.o
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:
> In function ‘iser_handle_comp_error’:
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1171:33:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>   if (is_iser_tx_desc(iser_conn, (void *)wc->wr_id)) {
>                                  ^
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1172:31:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>    struct iser_tx_desc *desc = (struct iser_tx_desc *)wc->wr_id;
>                                ^
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:
> In function ‘iser_handle_wc’:
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1198:14:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>     rx_desc = (struct iser_rx_desc *)wc->wr_id;
>               ^
> /home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1203:14:
> warning: cast to pointer from integer of different size
> [-Wint-to-pointer-cast]
>     tx_desc = (struct iser_tx_desc *)wc->wr_id;
>               ^
> 
> Not sure anyone would ever want to run this code on 32-bit boxes, but
> I'm a bit worried if wr_id is a 64-bit value, and we encode it into a
> 32-bit pointer, you'd always lose the top 32-bits.
> 
On 32 bit systems your pointer is 32 bits as well so assigning to u64
and casting back to a pointer you don't loose anything. Maybe casting
from u64 to a pointer should go through casting to uintptr_t to avoid
warnings.

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

* Re: [GIT PULL] please pull infiniband.git
  2014-10-16 22:52 Roland Dreier
  2014-10-20 23:28 ` Doug Ledford
@ 2014-11-02 20:06 ` Dave Airlie
  2014-11-03  7:15   ` Eli Cohen
  2014-11-03  7:58   ` Sagi Grimberg
  1 sibling, 2 replies; 223+ messages in thread
From: Dave Airlie @ 2014-11-02 20:06 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Linus Torvalds, linux-rdma, LKML

On 17 October 2014 08:52, Roland Dreier <roland@kernel.org> wrote:
> Hi Linus,
>
> Please pull from
>
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
>
> ----------------------------------------------------------------
> Main set of InfiniBand/RDMA updates for 3.18 merge window:
>
>  - Large set of iSER initiator improvements
>  - Hardware driver fixes for cxgb4, mlx5 and ocrdma
>  - Small fixes to core midlayer
>

building on 32-bit x86.

 CC [M]  drivers/infiniband/ulp/iser/iser_verbs.o
/home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:
In function ‘iser_handle_comp_error’:
/home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1171:33:
warning: cast to pointer from integer of different size
[-Wint-to-pointer-cast]
  if (is_iser_tx_desc(iser_conn, (void *)wc->wr_id)) {
                                 ^
/home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1172:31:
warning: cast to pointer from integer of different size
[-Wint-to-pointer-cast]
   struct iser_tx_desc *desc = (struct iser_tx_desc *)wc->wr_id;
                               ^
/home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:
In function ‘iser_handle_wc’:
/home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1198:14:
warning: cast to pointer from integer of different size
[-Wint-to-pointer-cast]
    rx_desc = (struct iser_rx_desc *)wc->wr_id;
              ^
/home/airlied/devel/kernel/linux-2.6/drivers/infiniband/ulp/iser/iser_verbs.c:1203:14:
warning: cast to pointer from integer of different size
[-Wint-to-pointer-cast]
    tx_desc = (struct iser_tx_desc *)wc->wr_id;
              ^

Not sure anyone would ever want to run this code on 32-bit boxes, but
I'm a bit worried if wr_id is a 64-bit value, and we encode it into a
32-bit pointer, you'd always lose the top 32-bits.

Dave.

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

* Re: [GIT PULL] please pull infiniband.git
  2014-10-16 22:52 Roland Dreier
@ 2014-10-20 23:28 ` Doug Ledford
  2014-11-02 20:06 ` Dave Airlie
  1 sibling, 0 replies; 223+ messages in thread
From: Doug Ledford @ 2014-10-20 23:28 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Linus Torvalds, linux-rdma, linux-kernel

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

On Thu, 2014-10-16 at 15:52 -0700, Roland Dreier wrote:
> Hi Linus,
> 
> Please pull from
> 
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
> 
> ----------------------------------------------------------------
> Main set of InfiniBand/RDMA updates for 3.18 merge window:
> 
>  - Large set of iSER initiator improvements
>  - Hardware driver fixes for cxgb4, mlx5 and ocrdma
>  - Small fixes to core midlayer

The IPoIB multicast locking fixes I submitted for 3.17 that you put off
until 3.18 are missing from this list.  The set can be found here in
case you've lost them:

https://patchwork.kernel.org/bundle/dledford/IPoIB%20Locking%20Fixes/

-- 
Doug Ledford <dledford@redhat.com>
              GPG KeyID: 0E572FDD



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

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

* [GIT PULL] please pull infiniband.git
@ 2014-10-16 22:52 Roland Dreier
  2014-10-20 23:28 ` Doug Ledford
  2014-11-02 20:06 ` Dave Airlie
  0 siblings, 2 replies; 223+ messages in thread
From: Roland Dreier @ 2014-10-16 22:52 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
Main set of InfiniBand/RDMA updates for 3.18 merge window:

 - Large set of iSER initiator improvements
 - Hardware driver fixes for cxgb4, mlx5 and ocrdma
 - Small fixes to core midlayer

----------------------------------------------------------------
Ariel Nahum (3):
      IB/iser: Unbind at conn_stop stage
      IB/iser: Use iser_warn instead of BUG_ON in iser_conn_release
      IB/iser: Change iscsi_conn_stop log level to info

Devesh Sharma (3):
      RDMA/ocrdma: Add default GID at index 0
      RDMA/ocrdma: Convert kernel VA to PA for mmap in user
      IB/core: Clear AH attr variable to prevent garbage data

Eli Cohen (5):
      IB/mlx5: Clear umr resources after ib_unregister_device
      IB/mlx5: Improve debug prints in mlx5_ib_reg_user_mr
      IB/core: Avoid leakage from kernel to user space
      IB/mlx5: Fix possible array overflow
      IB/mlx5: Remove duplicate code from mlx5_set_path

Hariprasad S (3):
      RDMA/cxgb4: Take IPv6 into account for best_mtu and set_emss
      RDMA/cxgb4: Add missing neigh_release in find_route
      RDMA/cxgb4: Fix ntuple calculation for ipv6 and remove duplicate line

Jack Morgenstein (1):
      IB/core: Fix XRC race condition in ib_uverbs_open_qp

Jes Sorensen (3):
      RDMA/ocrdma: Don't memset() buffers we just allocated with kzalloc()
      RDMA/ocrdma: The kernel has a perfectly good BIT() macro - use it
      RDMA/ocrdma: Save the bit environment, spare unncessary parenthesis

Li RongQing (1):
      RDMA/ocrdma: Remove a unused-label warning

Or Gerlitz (1):
      IB/iser: Bump version, add maintainer

Roi Dayan (1):
      IB/iser: Remove unused variables and dead code

Roland Dreier (1):
      Merge branches 'core', 'cxgb4', 'iser', 'mlx5' and 'ocrdma' into for-next

Sagi Grimberg (23):
      IB/iser: Rename ib_conn -> iser_conn
      IB/iser: Re-introduce ib_conn
      IB/iser: Extend iser_free_ib_conn_res()
      IB/iser: Fix DEVICE REMOVAL handling in the absence of iscsi daemon
      IB/iser: Don't bound release_work completions timeouts
      IB/iser: Protect tasks cleanup in case IB device was already released
      IB/iser: Signal iSCSI layer that transport is broken in error completions
      IB/iser: Centralize iser completion contexts
      IB/iser: Use internal polling budget to avoid possible live-lock
      IB/iser: Use single CQ for RX and TX
      IB/iser: Use beacon to indicate all completions were consumed
      IB/iser: Optimize completion polling
      IB/iser: Suppress scsi command send completions
      IB/iser: Nit - add space after __func__ in iser logging
      IB/iser: Add/Fix kernel doc style descriptions in iscsi_iser.h
      IB/iser: Fix/add kernel-doc style description in iscsi_iser.c
      IB/mlx5: Use enumerations for PI copy mask
      IB/iser: Remove redundant assignment
      IB/iser: Set IP_CSUM as default guard type
      IB/mlx5: Use extended internal signature layout
      IB/iser: Centralize ib_sig_domain settings
      Target/iser: Centralize ib_sig_domain setting
      IB/mlx5, iser, isert: Add Signature API additions

Selvin Xavier (1):
      RDMA/ocrdma: Get vlan tag from ib_qp_attrs

Steve Wise (1):
      RDMA/cxgb4: Make c4iw_wr_log_size_order static

Yishai Hadas (1):
      IB/mlx5: Modify to work with arbitrary page size

 MAINTAINERS                                  |   1 +
 drivers/infiniband/core/uverbs_cmd.c         |   2 +
 drivers/infiniband/core/uverbs_main.c        |   5 +
 drivers/infiniband/hw/cxgb4/cm.c             |  32 +-
 drivers/infiniband/hw/cxgb4/device.c         |   2 +-
 drivers/infiniband/hw/mlx5/main.c            |   8 +-
 drivers/infiniband/hw/mlx5/mem.c             |  18 +-
 drivers/infiniband/hw/mlx5/mr.c              |   6 +-
 drivers/infiniband/hw/mlx5/qp.c              | 149 +++---
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c     |  25 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c   |  12 +
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h    | 238 +++++-----
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c  |  10 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c     | 313 ++++++++++---
 drivers/infiniband/ulp/iser/iscsi_iser.h     | 408 +++++++++++-----
 drivers/infiniband/ulp/iser/iser_initiator.c | 198 ++++----
 drivers/infiniband/ulp/iser/iser_memory.c    |  99 ++--
 drivers/infiniband/ulp/iser/iser_verbs.c     | 667 +++++++++++++++------------
 drivers/infiniband/ulp/isert/ib_isert.c      |  65 ++-
 include/linux/mlx5/qp.h                      |  35 +-
 include/rdma/ib_verbs.h                      |  32 +-
 21 files changed, 1372 insertions(+), 953 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2014-09-23 21:58 Roland Dreier
@ 2014-09-27 21:19 ` Or Gerlitz
  0 siblings, 0 replies; 223+ messages in thread
From: Or Gerlitz @ 2014-09-27 21:19 UTC (permalink / raw)
  To: Roland Dreier
  Cc: Linus Torvalds, Linux Kernel, linux-rdma, Greg Kroah-Hartman

On Wed, Sep 24, 2014 at 12:58 AM, Roland Dreier <roland@kernel.org> wrote:
> Hi Linus,
[..]
> This is later and bigger than I would like, and the blame is all on
> me: I got very busy with other stuff for a few weeks during the 3.17
> cycle, and didn't prepare this tree as soon as I should have.  However
> I don't think there's anything risky here, and no one really cares if
> we break InfiniBand in 3.17 anyway...

Roland, sorry, but I don't understand the joke @ the last sentence,
can you elaborate?

Or.

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

* [GIT PULL] please pull infiniband.git
@ 2014-09-23 21:58 Roland Dreier
  2014-09-27 21:19 ` Or Gerlitz
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2014-09-23 21:58 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

This is later and bigger than I would like, and the blame is all on
me: I got very busy with other stuff for a few weeks during the 3.17
cycle, and didn't prepare this tree as soon as I should have.  However
I don't think there's anything risky here, and no one really cares if
we break InfiniBand in 3.17 anyway...

----------------------------------------------------------------
Last late set of InfiniBand/RDMA fixes for 3.17:

 - Fixes for the new memory region re-registration support
 - iSER initiator error path fixes
 - Grab bag of small fixes for the qib and ocrdma hardware drivers
 - Larger set of fixes for mlx4, especially in RoCE mode

----------------------------------------------------------------
Alex Estrin (1):
      IPoIB: Remove unnecessary port query

Devesh Sharma (2):
      RDMA/ocrdma: Report correct value of max_fast_reg_page_list_len
      RDMA/ocrdma: Do not skip setting deferred_arm

Jack Morgenstein (6):
      IB/mlx4: Fix lockdep splat for the iboe lock
      mlx4: Fix mlx4 reg/unreg mac to work properly with 0-mac addresses
      IB/mlx4: Avoid accessing netdevice when building RoCE qp1 header
      IB/mlx4: Don't update QP1 in native mode
      IB/mlx4: Do not allow APM under RoCE
      IB/mlx4: Fix VF mac handling in RoCE

Markus Stockhausen (1):
      IB/mlx4: Disable TSO for Connect-X rev. A0 HCAs

Matan Barak (2):
      mlx4: Correct error flows in rereg_mr
      IB/core: When marshaling uverbs path, clear unused fields

Mike Marciniszyn (3):
      IB/ipath: Change get_user_pages() usage to always NULL vmas
      IB/qib: Change get_user_pages() usage to always NULL vmas
      IB/qib: Correct reference counting in debugfs qp_stats

Moni Shoua (5):
      IB/mlx4: Avoid null pointer dereference in mlx4_ib_scan_netdevs()
      IB/mlx4: Don't duplicate the default RoCE GID
      IB/mlx4: Reorder steps in RoCE GID table initialization
      IB/mlx4: Get upper dev addresses as RoCE GIDs when port comes up
      IB/mlx4: Avoid executing gid task when device is being removed

Or Gerlitz (1):
      IB/iser: Bump version to 1.4.1

Roi Dayan (1):
      IB/iser: Fix RX/TX CQ resource leak on error flow

Roland Dreier (1):
      Merge branches 'core', 'ipoib', 'iser', 'mlx4', 'ocrdma' and 'qib' into for-next

Sagi Grimberg (1):
      IB/iser: Allow bind only when connection state is UP

Shawn Bohrer (1):
      IB: ib_umem_release() should decrement mm->pinned_vm from ib_umem_get

devesh.sharma@emulex.com (2):
      RDMA/ocrdma: Resolve L2 address when creating user AH
      RDMA/ocrdma: Use right macro in query AH

 drivers/infiniband/core/umem.c                 |  19 ++-
 drivers/infiniband/core/uverbs_marshall.c      |   4 +
 drivers/infiniband/hw/ipath/ipath_user_pages.c |   6 +-
 drivers/infiniband/hw/mlx4/main.c              | 169 +++++++++++++++++--------
 drivers/infiniband/hw/mlx4/mlx4_ib.h           |   1 +
 drivers/infiniband/hw/mlx4/mr.c                |   7 +-
 drivers/infiniband/hw/mlx4/qp.c                |  60 +++++----
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c       |  43 +++++--
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c    |   6 +-
 drivers/infiniband/hw/qib/qib_debugfs.c        |   3 +-
 drivers/infiniband/hw/qib/qib_qp.c             |   8 --
 drivers/infiniband/hw/qib/qib_user_pages.c     |   6 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |  10 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c       |  19 ++-
 drivers/infiniband/ulp/iser/iscsi_iser.h       |   2 +-
 drivers/infiniband/ulp/iser/iser_verbs.c       |  24 ++--
 drivers/net/ethernet/mellanox/mlx4/mr.c        |  33 +++--
 drivers/net/ethernet/mellanox/mlx4/port.c      |  11 +-
 include/rdma/ib_umem.h                         |   1 +
 19 files changed, 277 insertions(+), 155 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-08-14 16:05 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-08-14 16:05 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
Main set of InfiniBand/RDMA updates for 3.17 merge window:

 - MR reregistration support
 - MAD support for RMPP in userspace
 - iSER and SRP initiator updates
 - ocrdma hardware driver updates
 - other fixes...

----------------------------------------------------------------
Alex Estrin (1):
      IB/ipoib: Avoid multicast join attempts with invalid P_key

Ariel Nahum (3):
      IB/iser: Seperate iser_conn and iscsi_endpoint storage space
      IB/iser: Protect iser state machine with a mutex
      IB/iser: Replace connection waitqueue with completion object

Bart Van Assche (3):
      scsi_transport_srp: Fix fast_io_fail_tmo=dev_loss_tmo=off behavior
      IB/srp: Fix deadlock between host removal and multipathd
      IB/srp: Fix residual handling

Dan Carpenter (1):
      RDMA/amso1100: Check for integer overflow in c2_alloc_cq_buf()

Devesh Sharma (7):
      RDMA/ocrdma: Avoid posting DPP requests for RDMA READ
      be2net: Issue shutdown event to ocrdma driver
      RDMA/ocrdma: Handle shutdown event from be2net driver
      RDMA/ocrdma: Remove hardcoding of the max DPP QPs supported
      RDMA/ocrdma: Delete AH table if ocrdma_init_hw fails after AH table creation
      RDMA/ocrdma: Obtain SL from device structure
      RDMA/ocrdma: Update sli data structure for endianness

Doug Ledford (2):
      IB/srpt: Handle GID change events
      RDMA/uapi: Include socket.h in rdma_user_cm.h

Erez Shitrit (2):
      IB/ipoib: Use P_Key change event instead of P_Key polling mechanism
      IB/ipoib: Avoid flushing the workqueue from worker context

Fabian Frederick (3):
      IPoIB: Remove unnecessary test for NULL before debugfs_remove()
      IB/mlx4: Use ARRAY_SIZE instead of sizeof/sizeof[0]
      IB/mlx5: Use ARRAY_SIZE instead of sizeof/sizeof[0]

Ira Weiny (5):
      IB/umad: Update module to [pr|dev]_* style print messages
      IB/mad: Update module to [pr|dev]_* style print messages
      IB/mad: Add dev_notice messages for various umad/mad registration failures
      IB/mad: add new ioctl to ABI to support new registration options
      IB/mad: Add user space RMPP support

Jack Morgenstein (1):
      mlx4_core: Add support for secure-host and SMP firewall

Matan Barak (3):
      IB/core: Add user MR re-registration support
      mlx4_core: Add helper functions to support MR re-registration
      IB/mlx4_ib: Add support for user MR re-registration

Mitesh Ahuja (4):
      RDMA/ocrdma: Allow only SEND opcode in case of UD QPs
      RDMA/ocrdma: Do proper cleanup even if FW is in error state
      RDMA/ocrdma: Return proper value for max_mr_size
      RDMA/ocrdma: report asic-id in query device

Or Gerlitz (1):
      IB/ipath: Add P_Key change event support

Roi Dayan (3):
      IB/iser: Support IPv6 address family
      IB/iser: Add TIMEWAIT_EXIT event handling
      IB/iser: Clarify a duplicate counters check

Roland Dreier (1):
      Merge branches 'core', 'cxgb4', 'ipoib', 'iser', 'iwcm', 'mad', 'misc', 'mlx4', 'mlx5', 'ocrdma' and 'srp' into for-next

Sagi Grimberg (2):
      IB/iser: Fix responder resources advertisement
      IB/iser: Remove redundant return code in iser_free_ib_conn_res()

Selvin Xavier (8):
      RDMA/ocrdma: Query and initalize the PFC SL
      RDMA/ocrdma: Add hca_type and fixing fw_version string in device atrributes
      RDMA/ocrdma: Avoid reporting wrong completions in case of error CQEs
      RDMA/ocrdma: Add missing adapter mailbox opcodes
      RDMA/ocrdma: Increase the size of STAG array in dev structure to 16K
      RDMA/ocrdma: Initialize the GID table while registering the device
      RDMA/ocrdma: Fix a sparse warning
      RDMA/ocrdma: Update the ocrdma module version string

Steve Wise (2):
      RDMA/cxgb4: Only call CQ completion handler if it is armed
      RDMA/iwcm: Use a default listen backlog if needed

Wei Yongjun (1):
      IB/srp: Fix return value check in srp_init_module()

 Documentation/infiniband/user_mad.txt              |  13 +-
 drivers/infiniband/core/agent.c                    |  16 +-
 drivers/infiniband/core/cm.c                       |   5 +-
 drivers/infiniband/core/iwcm.c                     |  27 ++
 drivers/infiniband/core/mad.c                      | 283 +++++++++++++-------
 drivers/infiniband/core/mad_priv.h                 |   3 -
 drivers/infiniband/core/sa_query.c                 |   2 +-
 drivers/infiniband/core/user_mad.c                 | 188 +++++++++++--
 drivers/infiniband/core/uverbs.h                   |   1 +
 drivers/infiniband/core/uverbs_cmd.c               |  93 +++++++
 drivers/infiniband/core/uverbs_main.c              |   1 +
 drivers/infiniband/hw/amso1100/c2_cq.c             |   7 +-
 drivers/infiniband/hw/cxgb4/ev.c                   |   1 +
 drivers/infiniband/hw/cxgb4/qp.c                   |  37 ++-
 drivers/infiniband/hw/cxgb4/t4.h                   |  11 +
 drivers/infiniband/hw/ipath/ipath_mad.c            |  14 +-
 drivers/infiniband/hw/mlx4/mad.c                   |   2 +-
 drivers/infiniband/hw/mlx4/main.c                  |   8 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |   4 +
 drivers/infiniband/hw/mlx4/mr.c                    |  88 +++++-
 drivers/infiniband/hw/mlx5/qp.c                    |   2 +-
 drivers/infiniband/hw/mthca/mthca_mad.c            |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma.h              |  26 +-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c           |   6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c           | 227 ++++++++++++++--
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h           |   2 +
 drivers/infiniband/hw/ocrdma/ocrdma_main.c         |  83 +++++-
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h          | 295 ++++++++++++++++-----
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        |  36 ++-
 drivers/infiniband/hw/qib/qib_mad.c                |   2 +-
 drivers/infiniband/ulp/ipoib/ipoib.h               |   8 +-
 drivers/infiniband/ulp/ipoib/ipoib_fs.c            |   6 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c            | 133 ++++------
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |   9 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c           |  47 ++--
 drivers/infiniband/ulp/iser/iscsi_iser.h           |   8 +-
 drivers/infiniband/ulp/iser/iser_verbs.c           | 128 ++++++---
 drivers/infiniband/ulp/srp/ib_srp.c                |  48 +++-
 drivers/infiniband/ulp/srpt/ib_srpt.c              |   3 +-
 drivers/net/ethernet/emulex/benet/be.h             |   1 +
 drivers/net/ethernet/emulex/benet/be_main.c        |   1 +
 drivers/net/ethernet/emulex/benet/be_roce.c        |  18 +-
 drivers/net/ethernet/emulex/benet/be_roce.h        |   3 +-
 drivers/net/ethernet/mellanox/mlx4/cmd.c           |   9 +
 drivers/net/ethernet/mellanox/mlx4/fw.c            |  91 ++++++-
 drivers/net/ethernet/mellanox/mlx4/main.c          |   5 +
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |   3 +
 drivers/net/ethernet/mellanox/mlx4/mr.c            | 160 +++++++++++
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |  26 +-
 drivers/scsi/scsi_transport_srp.c                  |   3 +-
 include/linux/mlx4/cmd.h                           |   7 +
 include/linux/mlx4/device.h                        |  17 ++
 include/rdma/ib_mad.h                              |  18 +-
 include/rdma/ib_verbs.h                            |  10 +-
 include/uapi/rdma/ib_user_mad.h                    |  42 +++
 include/uapi/rdma/ib_user_verbs.h                  |  16 ++
 include/uapi/rdma/rdma_user_cm.h                   |   1 +
 57 files changed, 1851 insertions(+), 455 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-07-18 20:40 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-07-18 20:40 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
InfiniBand/RDMA fixes for 3.16

 - cxgb4 hardware driver regression fixes
 - mlx5 hardware driver regression fixes

----------------------------------------------------------------
Hariprasad S (2):
      RDMA/cxgb4: Fix skb_leak in reject_cr()
      RDMA/cxgb4: Clean up connection on ARP error

Or Gerlitz (1):
      IB/mlx5: Enable "block multicast loopback" for kernel consumers

Roland Dreier (1):
      Merge branches 'cxgb4' and 'mlx5' into for-next

Sagi Grimberg (1):
      mlx5_core: Fix possible race between mr tree insert/delete

Steve Wise (2):
      RDMA/cxgb4: Initialize the device status page
      RDMA/cxgb4: Call iwpm_init() only once

 drivers/infiniband/hw/cxgb4/cm.c             | 14 +++++++++++---
 drivers/infiniband/hw/cxgb4/device.c         | 18 +++++++++++-------
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h       |  2 +-
 drivers/infiniband/hw/mlx5/qp.c              |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/mr.c | 19 +++++++++++++++----
 5 files changed, 39 insertions(+), 16 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-06-10 17:14 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-06-10 17:14 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.16:

 - Add iWARP port mapper to avoid conflicts between RDMA and normal
   stack TCP connections.

 - Fixes for i386 / x86-64 structure padding differences (ABI
   compatibility for 32-on-64) from Yann Droneaud.

 - A pile of SRP initiator fixes from Bart Van Assche.

 - Fixes for a writeback / memory allocation deadlock with NFS over
   IPoIB connected mode from Jiri Kosina.

 - The usual fixes and cleanups to mlx4, mlx5, cxgb4 and other
   low-level drivers.

----------------------------------------------------------------
Ariel Nahum (2):
      IB/iser: Simplify connection management
      IB/iser: Fix a possible race in iser connection states transition

Bart Van Assche (11):
      IB/srp: Fix a sporadic crash triggered by cable pulling
      IB/srp: Fix kernel-doc warnings
      IB/srp: Introduce an additional local variable
      IB/srp: Introduce srp_map_fmr()
      IB/srp: Introduce srp_finish_mapping()
      IB/srp: Introduce the 'register_always' kernel module parameter
      IB/srp: One FMR pool per SRP connection
      IB/srp: Rename FMR-related variables
      IB/srp: Add fast registration support
      IB/umad: Fix error handling
      IB/umad: Fix use-after-free on close

Christoph Jaeger (1):
      RDMA/cxgb4: Fix memory leaks in c4iw_alloc() error paths

Colin Ian King (1):
      IB/mlx4: fix unitialised variable is_mcast

Dan Carpenter (2):
      RDMA/cxgb3: Fix information leak in send_abort()
      RDMA/cxgb3: Remove a couple unneeded conditions

Dennis Dalessandro (1):
      IB/ipath: Translate legacy diagpkt into newer extended diagpkt

Dotan Barak (1):
      mlx4_core: Fix memory leaks in SR-IOV error paths

Duan Jiong (1):
      RDMA/ocrdma: Convert to use simple_open()

Haggai Eran (7):
      IB/mlx5: Fix error handling in reg_umr
      IB/mlx5: Add MR to radix tree in reg_mr_callback
      mlx5_core: Store MR attributes in mlx5_mr_core during creation and after UMR
      IB/mlx5: Set QP offsets and parameters for user QPs and not just for kernel QPs
      IB/core: Remove unneeded kobject_get/put calls
      IB/core: Fix port kobject deletion during error flow
      IB/core: Fix kobject leak on device register error flow

Jack Morgenstein (5):
      mlx4_core: Fix incorrect FLAGS1 bitmap test in mlx4_QUERY_FUNC_CAP
      IB/mlx4: SET_PORT called by mlx4_ib_modify_port should be wrapped
      IB/mlx4: Preparation for VFs to issue/receive SMI (QP0) requests/responses
      mlx4: Add infrastructure for selecting VFs to enable QP0 via MLX proxy QPs
      IB/mlx4: Add interface for selecting VFs to enable QP0 via MLX proxy QPs

Jiri Kosina (2):
      IB/mlx4: Implement IB_QP_CREATE_USE_GFP_NOIO
      IB/mlx4: Fix gfp passing in create_qp_common()

Joe Perches (1):
      IB/srp: Avoid problems if a header uses pr_fmt

Manuel Schölling (1):
      IB/ipath: Use time_before()/_after()

Mike Marciniszyn (1):
      IB/qib: Fix port in pkey change event

Or Gerlitz (3):
      IB/iser: Bump version to 1.4
      IB: Return error for unsupported QP creation flags
      IB: Add a QP creation flag to use GFP_NOIO allocations

Roi Dayan (1):
      IB/iser: Add missing newlines to logging messages

Roland Dreier (6):
      IB/mlx5: Fix warning about cast of wr_id back to pointer on 32 bits
      mlx4_core: Move handling of MLX4_QP_ST_MLX to proper switch statement
      IB/mad: Fix sparse warning about gfp_t use
      IB/core: Fix sparse warnings about redeclared functions
      mlx4_core: Fix GFP flags parameters to be gfp_t
      Merge branches 'core', 'cxgb3', 'cxgb4', 'iser', 'iwpm', 'misc', 'mlx4', 'mlx5', 'noio', 'ocrdma', 'qib', 'srp' and 'usnic' into for-next

Sagi Grimberg (3):
      mlx5_core: Fix signature handover operation for interleaved buffers
      mlx5_core: Simplify signature handover wqe for interleaved buffers
      mlx5_core: Copy DIF fields only when input and output space values match

Shachar Raindel (1):
      IB/mlx5: Refactor UMR to have its own context struct

Steve Wise (2):
      RDMA/cxgb4: Fix vlan support
      RDMA/cxgb4: Add support for iWARP Port Mapper user space service

Tatyana Nikolova (2):
      RDMA/core: Add support for iWARP Port Mapper user space service
      RDMA/nes: Add support for iWARP Port Mapper user space service

Upinder Malhi (1):
      IB/usnic: Fix source file missing copyright and license

Vinit Agnihotri (1):
      IB/qib: Additional Intel branding changes

Yann Droneaud (5):
      IB/mlx5: add missing padding at end of struct mlx5_ib_create_cq
      IB/mlx5: add missing padding at end of struct mlx5_ib_create_srq
      RDMA/cxgb4: Add missing padding at end of struct c4iw_create_cq_resp
      IB: Allow build of hw/ and ulp/ subdirectories independently
      RDMA/cxgb4: add missing padding at end of struct c4iw_alloc_ucontext_resp

 drivers/infiniband/Makefile                        |  19 +-
 drivers/infiniband/core/Makefile                   |   2 +-
 drivers/infiniband/core/cma.c                      |   3 +-
 drivers/infiniband/core/iwpm_msg.c                 | 685 +++++++++++++++++++++
 drivers/infiniband/core/iwpm_util.c                | 607 ++++++++++++++++++
 drivers/infiniband/core/iwpm_util.h                | 238 +++++++
 drivers/infiniband/core/netlink.c                  |  18 +-
 drivers/infiniband/core/sa_query.c                 |   2 +-
 drivers/infiniband/core/sysfs.c                    |  85 +--
 drivers/infiniband/core/user_mad.c                 |  75 ++-
 drivers/infiniband/core/verbs.c                    |   8 +-
 drivers/infiniband/hw/Makefile                     |  12 +
 drivers/infiniband/hw/cxgb3/cxio_hal.c             |   6 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c              |   1 +
 drivers/infiniband/hw/cxgb4/cm.c                   | 197 ++++--
 drivers/infiniband/hw/cxgb4/cq.c                   |   4 +-
 drivers/infiniband/hw/cxgb4/device.c               |  83 ++-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h             |  44 ++
 drivers/infiniband/hw/cxgb4/provider.c             |   5 +-
 drivers/infiniband/hw/cxgb4/user.h                 |   2 +
 drivers/infiniband/hw/ipath/ipath_diag.c           |   4 +
 drivers/infiniband/hw/ipath/ipath_intr.c           |   4 +-
 drivers/infiniband/hw/ipath/ipath_sdma.c           |   4 +-
 drivers/infiniband/hw/mlx4/ah.c                    |   2 +-
 drivers/infiniband/hw/mlx4/cq.c                    |   6 +-
 drivers/infiniband/hw/mlx4/mad.c                   |  40 +-
 drivers/infiniband/hw/mlx4/main.c                  |  26 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |   1 +
 drivers/infiniband/hw/mlx4/qp.c                    | 102 +--
 drivers/infiniband/hw/mlx4/srq.c                   |   7 +-
 drivers/infiniband/hw/mlx4/sysfs.c                 | 105 +++-
 drivers/infiniband/hw/mlx5/cq.c                    |  13 +-
 drivers/infiniband/hw/mlx5/mlx5_ib.h               |  13 +-
 drivers/infiniband/hw/mlx5/mr.c                    |  76 ++-
 drivers/infiniband/hw/mlx5/qp.c                    |  42 +-
 drivers/infiniband/hw/mlx5/srq.c                   |  14 +-
 drivers/infiniband/hw/mlx5/user.h                  |   2 +
 drivers/infiniband/hw/nes/nes.c                    |  25 +-
 drivers/infiniband/hw/nes/nes.h                    |   3 +
 drivers/infiniband/hw/nes/nes_cm.c                 | 320 ++++++++--
 drivers/infiniband/hw/nes/nes_cm.h                 |  12 +-
 drivers/infiniband/hw/ocrdma/ocrdma_stats.c        |   9 +-
 drivers/infiniband/hw/qib/qib_init.c               |   8 +-
 drivers/infiniband/hw/qib/qib_mad.c                |   2 +-
 drivers/infiniband/hw/qib/qib_qp.c                 |   3 +-
 drivers/infiniband/hw/usnic/usnic_ib_verbs.c       |   3 +
 .../infiniband/hw/usnic/usnic_uiom_interval_tree.c |  18 +
 drivers/infiniband/ulp/Makefile                    |   5 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c            |  18 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c           | 105 ++--
 drivers/infiniband/ulp/iser/iscsi_iser.h           |  10 +-
 drivers/infiniband/ulp/iser/iser_verbs.c           |  89 ++-
 drivers/infiniband/ulp/srp/ib_srp.c                | 672 +++++++++++++++-----
 drivers/infiniband/ulp/srp/ib_srp.h                |  94 ++-
 drivers/net/ethernet/mellanox/mlx4/alloc.c         |  27 +-
 drivers/net/ethernet/mellanox/mlx4/cmd.c           |  92 ++-
 drivers/net/ethernet/mellanox/mlx4/cq.c            |   4 +-
 drivers/net/ethernet/mellanox/mlx4/en_rx.c         |   6 +-
 drivers/net/ethernet/mellanox/mlx4/en_tx.c         |   2 +-
 drivers/net/ethernet/mellanox/mlx4/fw.c            |  46 +-
 drivers/net/ethernet/mellanox/mlx4/fw.h            |   1 +
 drivers/net/ethernet/mellanox/mlx4/icm.c           |   7 +-
 drivers/net/ethernet/mellanox/mlx4/icm.h           |   3 +-
 drivers/net/ethernet/mellanox/mlx4/main.c          |  30 +-
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |  12 +-
 drivers/net/ethernet/mellanox/mlx4/mr.c            |  17 +-
 drivers/net/ethernet/mellanox/mlx4/qp.c            |  20 +-
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |  30 +-
 drivers/net/ethernet/mellanox/mlx4/srq.c           |   4 +-
 drivers/net/ethernet/mellanox/mlx5/core/mr.c       |   4 +
 include/linux/mlx4/device.h                        |  15 +-
 include/linux/mlx5/driver.h                        |   1 -
 include/rdma/ib_verbs.h                            |  11 +-
 include/rdma/iw_portmap.h                          | 199 ++++++
 include/rdma/rdma_netlink.h                        |  23 +-
 include/uapi/rdma/rdma_netlink.h                   |  96 ++-
 76 files changed, 3870 insertions(+), 733 deletions(-)
 create mode 100644 drivers/infiniband/core/iwpm_msg.c
 create mode 100644 drivers/infiniband/core/iwpm_util.c
 create mode 100644 drivers/infiniband/core/iwpm_util.h
 create mode 100644 drivers/infiniband/hw/Makefile
 create mode 100644 drivers/infiniband/ulp/Makefile
 create mode 100644 include/rdma/iw_portmap.h

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

* [GIT PULL] please pull infiniband.git
@ 2014-05-02  0:09 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-05-02  0:09 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
InfiniBand/RDMA updates for 3.15-rc4:

 - cxgb4 hardware driver fixes

----------------------------------------------------------------
Hariprasad S (1):
      RDMA/cxgb4: Update Kconfig to include Chelsio T5 adapter

Steve Wise (3):
      RDMA/cxgb4: Fix endpoint mutex deadlocks
      RDMA/cxgb4: Force T5 connections to use TAHOE congestion control
      RDMA/cxgb4: Only allow kernel db ringing for T4 devs

 drivers/infiniband/hw/cxgb4/Kconfig       |  6 ++---
 drivers/infiniband/hw/cxgb4/cm.c          | 39 ++++++++++++++++++++++---------
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h    |  1 +
 drivers/infiniband/hw/cxgb4/qp.c          | 13 +++++++----
 drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | 14 +++++++++++
 5 files changed, 55 insertions(+), 18 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-04-18 18:40 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-04-18 18:40 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

InfiniBand/RDMA updates for 3.15-rc2:

 - Mostly cxgb4 fixes unblocked by the merge of some prerequisites via
   the net tree.

 - Drop deprecated MSI-X API use.

 - A couple other miscellaneous things.

----------------------------------------------------------------
Alexander Gordeev (2):
      IB/qib: Use pci_enable_msix_range() instead of pci_enable_msix()
      IB/mthca: Use pci_enable_msix_exact() instead of pci_enable_msix()

Eli Cohen (1):
      IB/mlx5: Add block multicast loopback support

Hariprasad Shenai (1):
      RDMA/cxgb4: Use pr_warn_ratelimited

Roland Dreier (1):
      Merge branches 'cxgb4', 'misc', 'mlx5' and 'qib' into for-next

Steve Wise (9):
      RDMA/cxgb4: Use the BAR2/WC path for kernel QPs and T5 devices
      RDMA/cxgb4: Endpoint timeout fixes
      RDMA/cxgb4: rmb() after reading valid gen bit
      RDMA/cxgb4: SQ flush fix
      RDMA/cxgb4: Max fastreg depth depends on DSGL support
      RDMA/cxgb4: Initialize reserved fields in a FW work request
      RDMA/cxgb4: Add missing debug stats
      RDMA/cxgb4: Use uninitialized_var()
      RDMA/cxgb4: Fix over-dereference when terminating

 drivers/infiniband/hw/cxgb4/cm.c         | 89 ++++++++++++++++++++------------
 drivers/infiniband/hw/cxgb4/cq.c         | 24 ++++-----
 drivers/infiniband/hw/cxgb4/device.c     | 41 ++++++++++++---
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h   |  2 +
 drivers/infiniband/hw/cxgb4/mem.c        |  6 ++-
 drivers/infiniband/hw/cxgb4/provider.c   |  2 +-
 drivers/infiniband/hw/cxgb4/qp.c         | 70 +++++++++++++++----------
 drivers/infiniband/hw/cxgb4/resource.c   | 10 ++--
 drivers/infiniband/hw/cxgb4/t4.h         | 72 ++++++++++++++++++++++++--
 drivers/infiniband/hw/mlx5/main.c        |  2 +
 drivers/infiniband/hw/mlx5/qp.c          | 12 +++++
 drivers/infiniband/hw/mthca/mthca_main.c |  8 +--
 drivers/infiniband/hw/qib/qib_pcie.c     | 55 ++++++++++----------
 include/linux/mlx5/device.h              |  1 +
 include/linux/mlx5/qp.h                  |  1 +
 15 files changed, 270 insertions(+), 125 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-04-03 15:54 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-04-03 15:54 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.15:

 - The biggest change is core API extensions and mlx5 low-level driver
   support for handling DIF/DIX-style protection information, and the
   addition of PI support to the iSER initiator.  Target support will be
   arriving shortly through the SCSI target tree.

 - A nice simplification to the "umem" memory pinning library now that
   we have chained sg lists.  Kudos to Yishai Hadas for realizing our
   code didn't have to be so crazy.

 - Another nice simplification to the sg wrappers used by qib, ipath and
   ehca to handle their mapping of memory to adapter.

 - The usual batch of fixes to bugs found by static checkers etc. from
   intrepid people like Dan Carpenter and Yann Droneaud.

 - A large batch of cxgb4, ocrdma, qib driver updates.

----------------------------------------------------------------
Alex Tabachnik (2):
      IB/iser: Introduce pi_enable, pi_guard module parameters
      IB/iser: Initialize T10-PI resources

Ariel Nahum (1):
      IB/iser: Remove struct iscsi_iser_conn

Bart Van Assche (7):
      IB/mlx4: Fix a sparse endianness warning
      scsi_transport_srp: Fix two kernel-doc warnings
      IB/srp: Add more logging
      IB/srp: Avoid duplicate connections
      IB/srp: Make writing into the "add_target" sysfs attribute interruptible
      IB/srp: Avoid that writing into "add_target" hangs due to a cable pull
      IB/srp: Fix a race condition between failing I/O and I/O completion

CQ Tang (1):
      IB/qib: Change SDMA progression mode depending on single- or multi-rail

Dan Carpenter (7):
      IB/qib: Remove duplicate check in get_a_ctxt()
      RDMA/nes: Clean up a condition
      RDMA/cxgb4: Fix underflows in c4iw_create_qp()
      RDMA/cxgb4: Fix four byte info leak in c4iw_create_cq()
      IB/qib: Cleanup qib_register_observer()
      mlx4_core: Fix some indenting in mlx4_ib_add()
      mlx4_core: Make buffer larger to avoid overflow warning

Dennis Dalessandro (3):
      IB/qib: Fix potential buffer overrun in sending diag packet routine
      IB/ipath: Fix potential buffer overrun in sending diag packet routine
      IB/qib: Fix memory leak of recv context when driver fails to initialize.

Devesh Sharma (9):
      RDMA/ocrdma: EQ full catastrophe avoidance
      RDMA/ocrdma: SQ and RQ doorbell offset clean up
      RDMA/ocrdma: Read ASIC_ID register to select asic_gen
      RDMA/ocrdma: Allow DPP QP creation
      RDMA/ocrdma: ABI versioning between ocrdma and be2net
      be2net: Add abi version between be2net and ocrdma
      RDMA/ocrdma: Update version string
      RDMA/ocrdma: Increment abi version count
      RDMA/ocrdma: Code clean-up

Fabio Estevam (1):
      IB/usnic: Remove '0x' when using %pa format

Mike Marciniszyn (7):
      IB/qib: Fix debugfs ordering issue with multiple HCAs
      IB/qib: Add percpu counter replacing qib_devdata int_counter
      IB/qib: Modify software pma counters to use percpu variables
      IB/qib: Remove ib_sg_dma_address() and ib_sg_dma_len() overloads
      IB/ipath: Remove ib_sg_dma_address() and ib_sg_dma_len() overloads
      IB/ehca: Remove ib_sg_dma_address() and ib_sg_dma_len() overloads
      IB/core: Remove overload in ib_sg_dma*

Moni Shoua (1):
      IB/core: Don't resolve passive side RoCE L2 address in CMA REQ handler

Or Gerlitz (3):
      IB/iser: Print QP information once connection is established
      IB/iser: Update Mellanox copyright note
      IB/iser: Bump driver version to 1.3

Prarit Bhargava (1):
      RDMA/ocrdma: Fix compiler warning

Randy Dunlap (1):
      IB/iser: Fix sector_t format warning

Roi Dayan (1):
      IB/iser: Drain the tx cq once before looping on the rx cq

Roland Dreier (2):
      RDMA/ocrdma: Fix warnings about pointer <-> integer casts
      Merge branches 'core', 'cxgb4', 'ip-roce', 'iser', 'misc', 'mlx4', 'nes', 'ocrdma', 'qib', 'sgwrapper', 'srp' and 'usnic' into for-next

Sagi Grimberg (23):
      IB/core: Introduce protected memory regions
      IB/core: Introduce signature verbs API
      mlx5: Implement create_mr and destroy_mr
      IB/mlx5: Initialize mlx5_ib_qp signature-related members
      IB/mlx5: Break up wqe handling into begin & finish routines
      IB/mlx5: Remove MTT access mode from umr flags helper function
      IB/mlx5: Keep mlx5 MRs in a radix tree under device
      IB/mlx5: Support IB_WR_REG_SIG_MR
      IB/mlx5: Collect signature error completion
      IB/mlx5: Expose support for signature MR feature
      IB/iser: Suppress completions for fast registration work requests
      IB/iser: Avoid FRWR notation, use fastreg instead
      IB/iser: Push the decision what memory key to use into fast_reg_mr routine
      IB/iser: Move fast_reg_descriptor initialization to a function
      IB/iser: Keep IB device attributes under iser_device
      IB/iser: Replace fastreg descriptor valid bool with indicators container
      IB/iser: Generalize iser_unmap_task_data and finalize_rdma_unaligned_sg
      IB/iser: Generalize fall_to_bounce_buf routine
      IB/iser: Support T10-PI operations
      SCSI/libiscsi: Add check_protection callback for transports
      IB/iser: Implement check_protection
      IB/iser: Publish T10-PI support to SCSI midlayer
      IB/srp: Check ib_query_gid return value

Selvin Xavier (8):
      RDMA/ocrdma: Memory leak fix in ocrdma_dereg_mr()
      RDMA/ocrdma: Use non-zero tag in SRQ posting
      RDMA/ocrdma: Display proper value for max_mw
      RDMA/ocrdma: Handle CQ overrun error
      RDMA/ocrdma: Support non-embedded mailbox commands
      RDMA/ocrdma: Query controller information
      RDMA/ocrdma: Display FW version
      RDMA/ocrdma: Unregister inet notifier when unloading ocrdma

Steve Wise (16):
      RDMA/cxgb4: Cap CQ size at T4_MAX_IQ_SIZE
      RDMA/cxgb4: Allow loopback connections
      RDMA/cxgb4: Always release neigh entry
      RDMA/cxgb4: Fix incorrect BUG_ON conditions
      RDMA/cxgb4: Mind the sq_sig_all/sq_sig_type QP attributes
      RDMA/cxgb4: Default peer2peer mode to 1
      RDMA/cxgb4: Save the correct map length for fast_reg_page_lists
      RDMA/cxgb4: Don't leak skb in c4iw_uld_rx_handler()
      RDMA/cxgb4: Fix possible memory leak in RX_PKT processing
      RDMA/cxgb4: Ignore read reponse type 1 CQEs
      RDMA/cxgb4: Connect_request_upcall fixes
      RDMA/cxgb4: Update snd_seq when sending MPA messages
      RDMA/cxgb4: Lock around accept/reject downcalls
      RDMA/cxgb4: Drop RX_DATA packets if the endpoint is gone
      RDMA/cxgb4: rx_data() needs to hold the ep mutex
      RDMA/cxgb4: Disable DSGL use by default

Tatyana Nikolova (2):
      RDMA/nes: Fixes for IRD/ORD negotiation with MPA v2
      RDMA/nes: Fix for passing a valid QP pointer to the user space library

Yan Burman (1):
      IB/mad: Check and handle potential DMA mapping errors

Yann Droneaud (5):
      IB/qib: add missing braces in do_qib_user_sdma_queue_create()
      IB/qib: fixup indentation in qib_ib_rcv()
      IB/nes: Return an error on ib_copy_from_udata() failure instead of NULL
      IB/mthca: Return an error on ib_copy_to_udata() failure
      IB/ehca: Returns an error on ib_copy_to_udata() failure

Yishai Hadas (1):
      IB: Refactor umem to use linear SG table

 drivers/infiniband/core/cm.c                   |  17 -
 drivers/infiniband/core/cma.c                  |  26 --
 drivers/infiniband/core/mad.c                  |  14 +
 drivers/infiniband/core/umem.c                 | 120 +++--
 drivers/infiniband/core/verbs.c                |  47 ++
 drivers/infiniband/hw/amso1100/c2_provider.c   |  23 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |  19 +-
 drivers/infiniband/hw/cxgb4/cm.c               | 110 +++--
 drivers/infiniband/hw/cxgb4/cq.c               |  31 +-
 drivers/infiniband/hw/cxgb4/device.c           |   6 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h         |   2 +
 drivers/infiniband/hw/cxgb4/mem.c              |  55 +--
 drivers/infiniband/hw/cxgb4/qp.c               |   8 +-
 drivers/infiniband/hw/ehca/ehca_classes.h      |   2 +-
 drivers/infiniband/hw/ehca/ehca_cq.c           |   1 +
 drivers/infiniband/hw/ehca/ehca_mrmw.c         | 257 ++++------
 drivers/infiniband/hw/ipath/ipath_diag.c       |  66 +--
 drivers/infiniband/hw/ipath/ipath_dma.c        |  43 +-
 drivers/infiniband/hw/ipath/ipath_mr.c         |  39 +-
 drivers/infiniband/hw/mlx4/doorbell.c          |   4 +-
 drivers/infiniband/hw/mlx4/main.c              |  11 +-
 drivers/infiniband/hw/mlx4/mr.c                |  39 +-
 drivers/infiniband/hw/mlx4/qp.c                |   2 +-
 drivers/infiniband/hw/mlx5/cq.c                |  62 +++
 drivers/infiniband/hw/mlx5/doorbell.c          |   4 +-
 drivers/infiniband/hw/mlx5/main.c              |  12 +
 drivers/infiniband/hw/mlx5/mem.c               |  80 ++--
 drivers/infiniband/hw/mlx5/mlx5_ib.h           |  14 +
 drivers/infiniband/hw/mlx5/mr.c                | 157 +++++++
 drivers/infiniband/hw/mlx5/qp.c                | 540 +++++++++++++++++++--
 drivers/infiniband/hw/mthca/mthca_provider.c   |  43 +-
 drivers/infiniband/hw/nes/nes_cm.c             | 121 +++--
 drivers/infiniband/hw/nes/nes_cm.h             |   3 +
 drivers/infiniband/hw/nes/nes_user.h           |   5 +-
 drivers/infiniband/hw/nes/nes_verbs.c          | 261 +++++------
 drivers/infiniband/hw/nes/nes_verbs.h          |   1 +
 drivers/infiniband/hw/ocrdma/Makefile          |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma.h          | 110 ++++-
 drivers/infiniband/hw/ocrdma/ocrdma_abi.h      |   7 +-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c       |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c       | 299 +++++++++---
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h       |   6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c     |  81 +++-
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h      | 261 ++++++++++-
 drivers/infiniband/hw/ocrdma/ocrdma_stats.c    | 623 +++++++++++++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_stats.h    |  54 +++
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c    | 233 ++++-----
 drivers/infiniband/hw/qib/qib.h                |  12 +-
 drivers/infiniband/hw/qib/qib_diag.c           |  52 +--
 drivers/infiniband/hw/qib/qib_dma.c            |  21 +-
 drivers/infiniband/hw/qib/qib_file_ops.c       |   5 +-
 drivers/infiniband/hw/qib/qib_fs.c             |   1 +
 drivers/infiniband/hw/qib/qib_iba6120.c        |  11 +-
 drivers/infiniband/hw/qib/qib_iba7220.c        |  12 +-
 drivers/infiniband/hw/qib/qib_iba7322.c        |  37 +-
 drivers/infiniband/hw/qib/qib_init.c           |  96 ++--
 drivers/infiniband/hw/qib/qib_mad.c            |  44 +-
 drivers/infiniband/hw/qib/qib_mr.c             |  14 +-
 drivers/infiniband/hw/qib/qib_rc.c             |   2 +-
 drivers/infiniband/hw/qib/qib_ruc.c            |   1 +
 drivers/infiniband/hw/qib/qib_ud.c             |   6 +-
 drivers/infiniband/hw/qib/qib_user_sdma.c      | 136 +++++-
 drivers/infiniband/hw/qib/qib_verbs.c          |   8 +-
 drivers/infiniband/hw/qib/qib_verbs.h          |  16 +-
 drivers/infiniband/hw/usnic/usnic_uiom.c       |   2 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c       |  93 ++--
 drivers/infiniband/ulp/iser/iscsi_iser.h       |  85 +++-
 drivers/infiniband/ulp/iser/iser_initiator.c   | 154 ++++--
 drivers/infiniband/ulp/iser/iser_memory.c      | 470 ++++++++++++++-----
 drivers/infiniband/ulp/iser/iser_verbs.c       | 325 +++++++++----
 drivers/infiniband/ulp/srp/ib_srp.c            |  83 ++--
 drivers/infiniband/ulp/srp/ib_srp.h            |   1 +
 drivers/net/ethernet/emulex/benet/be_roce.c    |   6 +
 drivers/net/ethernet/emulex/benet/be_roce.h    |   3 +
 drivers/net/ethernet/mellanox/mlx5/core/main.c |   1 +
 drivers/net/ethernet/mellanox/mlx5/core/mr.c   |  85 ++++
 drivers/scsi/libiscsi.c                        |  32 ++
 drivers/scsi/scsi_transport_srp.c              |   1 +
 include/linux/mlx5/cq.h                        |   1 +
 include/linux/mlx5/device.h                    |  43 ++
 include/linux/mlx5/driver.h                    |  41 ++
 include/linux/mlx5/qp.h                        |  67 +++
 include/rdma/ib_cm.h                           |   1 -
 include/rdma/ib_umem.h                         |  11 +-
 include/rdma/ib_verbs.h                        | 201 +++++++-
 include/scsi/libiscsi.h                        |   4 +
 include/scsi/scsi_transport_iscsi.h            |   1 +
 include/scsi/scsi_transport_srp.h              |   1 -
 88 files changed, 4634 insertions(+), 1475 deletions(-)
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_stats.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_stats.h

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

* [GIT PULL] please pull infiniband.git
@ 2014-02-14 17:51 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-02-14 17:51 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

RDMA/InfiniBand fixes for 3.14-rc3:
 - Fix some rough edges from the "IP addressing for IBoE" merge
 - Other misc fixes, mostly to hardware drivers

----------------------------------------------------------------
Dan Carpenter (1):
      IB/iser: Fix use after free in iser_snd_completion()

Devesh Sharma (2):
      RDMA/ocrdma: Fix traffic class shift
      RDMA/ocrdma: Fix load time panic during GID table init

Eli Cohen (4):
      IB/mlx5: Fix RC transport send queue overhead computation
      IB/mlx5: Fix binary compatibility with libmlx5
      IB/mlx5: Don't set "block multicast loopback" capability
      IB/mlx5: Remove dependency on X86

Julia Lawall (2):
      RDMA/nes: Fix error return code
      RDMA/amso1100: Fix error return code

Kumar Sanghvi (1):
      RDMA/cxgb4: Add missing neigh_release in LE-Workaround path

Matan Barak (1):
      IB/mlx4: Don't allocate range of steerable UD QPs for Ethernet-only device

Mike Marciniszyn (1):
      IB/qib: Add missing serdes init sequence

Moni Shoua (6):
      IB/mlx4: Make sure GID index 0 is always occupied
      IB/mlx4: Move rtnl locking to the right place
      IB/mlx4: Do IBoE locking earlier when initializing the GID table
      IB/mlx4: Do IBoE GID table resets per-port
      IB/mlx4: Build the port IBoE GID table properly under bonding
      IB: Report using RoCE IP based gids in port caps

Roi Dayan (1):
      IB/iser: Avoid dereferencing iscsi_iser conn object when not bound to iser connection

Roland Dreier (2):
      mlx5: Add include of <linux/slab.h> because of kzalloc()/kfree() use
      Merge branches 'cma', 'cxgb4', 'iser', 'misc', 'mlx4', 'mlx5', 'nes', 'ocrdma', 'qib' and 'usnic' into for-next

Upinder Malhi (1):
      IB/usnic: Fix smatch endianness error

 drivers/infiniband/hw/amso1100/c2.c             |   4 +-
 drivers/infiniband/hw/amso1100/c2_rnic.c        |   3 +-
 drivers/infiniband/hw/cxgb4/cm.c                |   1 +
 drivers/infiniband/hw/mlx4/main.c               | 185 +++++++++++++++++-------
 drivers/infiniband/hw/mlx5/Kconfig              |   2 +-
 drivers/infiniband/hw/mlx5/main.c               |  22 ++-
 drivers/infiniband/hw/mlx5/qp.c                 |  18 ++-
 drivers/infiniband/hw/mlx5/user.h               |   7 +
 drivers/infiniband/hw/nes/nes.c                 |   5 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c      |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c     |   4 +-
 drivers/infiniband/hw/qib/qib_iba7322.c         |   5 +
 drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c   |   9 +-
 drivers/infiniband/ulp/iser/iser_initiator.c    |   3 +-
 drivers/infiniband/ulp/iser/iser_verbs.c        |  10 +-
 drivers/net/ethernet/mellanox/mlx5/core/Kconfig |   2 +-
 include/linux/mlx5/driver.h                     |   3 +
 include/rdma/ib_verbs.h                         |   3 +-
 18 files changed, 214 insertions(+), 74 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2014-01-24 19:43 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2014-01-24 19:43 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.14:
 - Flow steering for InfiniBand UD traffic
 - IP-based addressing for IBoE aka RoCE
 - Pass SRP submaintainership from Dave to Bart
 - SRP transport fixes from Bart
 - Add the new Cisco usNIC low-level device driver
 - Various other fixes

----------------------------------------------------------------
Bart Van Assche (4):
      scsi_transport_srp: Block rport upon TL error even with fast_io_fail_tmo = off
      scsi_transport_srp: Fix a race condition
      scsi_transport_srp: Add rport state diagram
      scsi_transport_srp: Fix kernel-doc warnings

Dan Carpenter (2):
      mlx5_core: Remove dead code
      IB/usnic: Use GFP_ATOMIC under spinlock

David Dillow (1):
      MAINTAINERS: Pass the torch of SRP submaintainership

Devesh Sharma (2):
      RDMA/ocrdma: Fix AV_VALID bit position
      RDMA/ocrdma: Fix OCRDMA_GEN2_FAMILY macro definition

Ding Tianhong (1):
      RDMA/nes: Slight optimization of Ethernet address compare

Eli Cohen (13):
      IB/mlx5: Remove unused code in mr.c
      IB/mlx5: Fix micro UAR allocator
      IB/mlx5: Clear out struct before create QP command
      mlx5_core: Use mlx5 core style warning
      IB/mlx5: Make sure doorbell record is visible before doorbell
      IB/mlx5: Implement modify CQ
      IB/mlx5: Add support for resize CQ
      mlx5_core: Improve debugfs readability
      mlx5_core: Fix PowerPC support
      IB/mlx5: Allow creation of QPs with zero-length work queues
      IB/mlx5: Abort driver cleanup if teardown hca fails
      IB/mlx5: Remove old field for create mkey mailbox
      IB/mlx5: Verify reserved fields are cleared

Haggai Eran (1):
      mlx5_core: Fix out arg size in access_register command

Ira Weiny (1):
      IB/qib: Fix QP check when looping back to/from QP1

Julia Lawall (1):
      IB/mlx4: Fix error return code

Matan Barak (9):
      IB/core: Add flow steering support for IPoIB UD traffic
      IB/core: Add support for IB L2 device-managed steering
      mlx4_core: Add support for steerable IB UD QPs
      IB/mlx4: Enable device-managed steering support for IB ports too
      IB/mlx4: Add mechanism to support flow steering over IB links
      IB/mlx4: Add support for steerable IB UD QPs
      IB/core: Ethernet L2 attributes in verbs/cm structures
      IB/core: Make ib_addr a core IB module
      IB/mlx4: Add dependency INET

Michal Schmidt (1):
      IPoIB: Report operstate consistently when brought up without a link

Moni Shoua (5):
      IB/cma: IBoE (RoCE) IP-based GID addressing
      IB/mlx4: Use IBoE (RoCE) IP based GIDs in the port GID table
      IB/mlx4: Handle Ethernet L2 parameters for IP based GID addressing
      RDMA/ocrdma: Handle Ethernet L2 parameters for IP based GID addressing
      RDMA/ocrdma: Populate GID table with IP based gids

Or Gerlitz (2):
      IB/core: Resolve Ethernet L2 addresses when modifying QP
      IB/core: Fix unused variable warning

Paul Bolle (1):
      RDMA/cxgb4: Fix gcc warning on 32-bit arch

Roland Dreier (6):
      IB/usnic: Fix typo "Ignorning" -> "Ignoring"
      RDMA/ocrdma: Move ocrdma_inetaddr_event outside of "#if CONFIG_IPV6"
      RDMA/ocrdma: Add dependency on INET
      IB/mlx4: Use IS_ENABLED(CONFIG_IPV6)
      Merge branches 'cma', 'cxgb4', 'flowsteer', 'ipoib', 'misc', 'mlx4', 'mlx5', 'ocrdma', 'qib', 'srp' and 'usnic' into for-next
      Merge branch 'ip-roce' into for-next

Somnath Kotur (1):
      RDMA/cma: Handle global/non-linklocal IPv6 addresses in cma_check_linklocal()

Svetlana Mavrina (1):
      RDMA/amso1100: Add check if cache memory was allocated before freeing it

Upinder Malhi (22):
      IB/usnic: Add Cisco VIC low-level hardware driver
      IB/usnic: Change WARN_ON to lockdep_assert_held
      IB/usnic: Add struct usnic_transport_spec
      IB/usnic: Push all forwarding state to usnic_fwd.[hc]
      IB/usnic: Port over main.c and verbs.c to the usnic_fwd.h
      IB/usnic: Port over usnic_ib_qp_grp.[hc] to new usnic_fwd.h
      IB/usnic: Port over sysfs to new usnic_fwd.h
      IB/usnic: Update ABI and Version file for UDP support
      IB/usnic: Add UDP support to usnic_fwd.[hc]
      IB:usnic: Add UDP support to usnic_transport.[hc]
      IB/usnic: Add UDP support in u*verbs.c, u*main.c and u*util.h
      IB/usnic: Add UDP support in usnic_ib_qp_grp.[hc]
      IB/core: Add RDMA_TRANSPORT_USNIC_UDP
      IB/usnic: Remove superflous parentheses
      IB/usnic: Use for_each_sg instead of a for-loop
      IB/usnic: Expose flows via debugfs
      IB/usnic: Append documentation to usnic_transport.h and cleanup
      IB/usnic: Fix endianness-related warnings
      IB/usnic: Add dependency on CONFIG_INET
      IB/core: Add support for RDMA_NODE_USNIC_UDP
      IB/usnic: Advertise usNIC devices as RDMA_NODE_USNIC_UDP
      IB/usnic: Set userspace/kernel ABI ver to 4

Wei Yongjun (3):
      IB/usnic: Remove unused variable in usnic_debugfs_exit()
      IB/cm: Fix missing unlock on error in cm_init_qp_rtr_attr()
      IB/usnic: Remove unused includes of <linux/version.h>

 Documentation/scsi/scsi_transport_srp/Makefile     |   7 +
 .../scsi_transport_srp/rport_state_diagram.dot     |  26 +
 MAINTAINERS                                        |   7 +-
 drivers/infiniband/Kconfig                         |   6 +-
 drivers/infiniband/Makefile                        |   1 +
 drivers/infiniband/core/Makefile                   |   5 +-
 drivers/infiniband/core/addr.c                     |  97 ++-
 drivers/infiniband/core/cm.c                       |  52 ++
 drivers/infiniband/core/cma.c                      |  81 ++-
 drivers/infiniband/core/core_priv.h                |   2 +
 drivers/infiniband/core/iwcm.c                     |   3 +-
 drivers/infiniband/core/sa_query.c                 |  12 +-
 drivers/infiniband/core/sysfs.c                    |   1 +
 drivers/infiniband/core/ucma.c                     |  18 +-
 drivers/infiniband/core/uverbs_cmd.c               |   4 +
 drivers/infiniband/core/verbs.c                    | 101 ++-
 drivers/infiniband/hw/amso1100/c2_intr.c           |   3 +-
 drivers/infiniband/hw/cxgb4/mem.c                  |   2 +-
 drivers/infiniband/hw/ehca/ehca_qp.c               |   2 +-
 drivers/infiniband/hw/ipath/ipath_qp.c             |   2 +-
 drivers/infiniband/hw/mlx4/Kconfig                 |   2 +-
 drivers/infiniband/hw/mlx4/ah.c                    |  40 +-
 drivers/infiniband/hw/mlx4/cq.c                    |   9 +
 drivers/infiniband/hw/mlx4/main.c                  | 747 +++++++++++++++-----
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |  18 +-
 drivers/infiniband/hw/mlx4/qp.c                    | 157 ++++-
 drivers/infiniband/hw/mlx4/sysfs.c                 |   8 +-
 drivers/infiniband/hw/mlx5/cq.c                    | 310 ++++++++-
 drivers/infiniband/hw/mlx5/main.c                  |  13 +-
 drivers/infiniband/hw/mlx5/mlx5_ib.h               |   4 +-
 drivers/infiniband/hw/mlx5/mr.c                    |   1 -
 drivers/infiniband/hw/mlx5/qp.c                    | 133 ++--
 drivers/infiniband/hw/mlx5/user.h                  |   3 +
 drivers/infiniband/hw/mthca/mthca_qp.c             |   3 +-
 drivers/infiniband/hw/nes/nes_cm.c                 |   3 +-
 drivers/infiniband/hw/ocrdma/Kconfig               |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma.h              |  12 +
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c           |   6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c           |  21 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h           |   1 -
 drivers/infiniband/hw/ocrdma/ocrdma_main.c         | 138 ++--
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h          |   4 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        |   3 +-
 drivers/infiniband/hw/qib/qib_qp.c                 |   2 +-
 drivers/infiniband/hw/qib/qib_ud.c                 |   9 +-
 drivers/infiniband/hw/usnic/Kconfig                |  10 +
 drivers/infiniband/hw/usnic/Makefile               |  15 +
 drivers/infiniband/hw/usnic/usnic.h                |  29 +
 drivers/infiniband/hw/usnic/usnic_abi.h            |  73 ++
 drivers/infiniband/hw/usnic/usnic_common_pkt_hdr.h |  27 +
 drivers/infiniband/hw/usnic/usnic_common_util.h    |  68 ++
 drivers/infiniband/hw/usnic/usnic_debugfs.c        | 154 +++++
 drivers/infiniband/hw/usnic/usnic_debugfs.h        |  29 +
 drivers/infiniband/hw/usnic/usnic_fwd.c            | 350 ++++++++++
 drivers/infiniband/hw/usnic/usnic_fwd.h            | 113 +++
 drivers/infiniband/hw/usnic/usnic_ib.h             | 118 ++++
 drivers/infiniband/hw/usnic/usnic_ib_main.c        | 682 ++++++++++++++++++
 drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c      | 754 ++++++++++++++++++++
 drivers/infiniband/hw/usnic/usnic_ib_qp_grp.h      | 117 ++++
 drivers/infiniband/hw/usnic/usnic_ib_sysfs.c       | 341 +++++++++
 drivers/infiniband/hw/usnic/usnic_ib_sysfs.h       |  29 +
 drivers/infiniband/hw/usnic/usnic_ib_verbs.c       | 765 +++++++++++++++++++++
 drivers/infiniband/hw/usnic/usnic_ib_verbs.h       |  72 ++
 drivers/infiniband/hw/usnic/usnic_log.h            |  58 ++
 drivers/infiniband/hw/usnic/usnic_transport.c      | 202 ++++++
 drivers/infiniband/hw/usnic/usnic_transport.h      |  51 ++
 drivers/infiniband/hw/usnic/usnic_uiom.c           | 604 ++++++++++++++++
 drivers/infiniband/hw/usnic/usnic_uiom.h           |  80 +++
 .../infiniband/hw/usnic/usnic_uiom_interval_tree.c | 236 +++++++
 .../infiniband/hw/usnic/usnic_uiom_interval_tree.h |  73 ++
 drivers/infiniband/hw/usnic/usnic_vnic.c           | 467 +++++++++++++
 drivers/infiniband/hw/usnic/usnic_vnic.h           | 103 +++
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |   4 +-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c         |   3 +
 drivers/infiniband/ulp/srp/ib_srp.c                |   1 +
 drivers/net/ethernet/mellanox/mlx4/cmd.c           |   9 +
 drivers/net/ethernet/mellanox/mlx4/fw.c            |  10 +
 drivers/net/ethernet/mellanox/mlx4/mcg.c           |  17 +
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |   5 +
 drivers/net/ethernet/mellanox/mlx4/port.c          |  20 +
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |  10 +
 drivers/net/ethernet/mellanox/mlx5/core/cq.c       |  17 +-
 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c  |  39 +-
 drivers/net/ethernet/mellanox/mlx5/core/main.c     |  10 +-
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    |  13 +-
 drivers/net/ethernet/mellanox/mlx5/core/port.c     |   2 +-
 drivers/net/ethernet/mellanox/mlx5/core/qp.c       |   5 +-
 drivers/scsi/scsi_transport_srp.c                  |  95 ++-
 include/linux/mlx4/cmd.h                           |   1 +
 include/linux/mlx4/cq.h                            |  15 +-
 include/linux/mlx4/device.h                        |   7 +-
 include/linux/mlx5/cq.h                            |  18 +-
 include/linux/mlx5/device.h                        |  31 +-
 include/linux/mlx5/qp.h                            |  45 ++
 include/rdma/ib_addr.h                             |  69 +-
 include/rdma/ib_cm.h                               |   1 +
 include/rdma/ib_pack.h                             |   1 +
 include/rdma/ib_sa.h                               |   3 +
 include/rdma/ib_verbs.h                            |  42 +-
 include/scsi/scsi_transport_srp.h                  |  36 +-
 100 files changed, 7663 insertions(+), 567 deletions(-)
 create mode 100644 Documentation/scsi/scsi_transport_srp/Makefile
 create mode 100644 Documentation/scsi/scsi_transport_srp/rport_state_diagram.dot
 create mode 100644 drivers/infiniband/hw/usnic/Kconfig
 create mode 100644 drivers/infiniband/hw/usnic/Makefile
 create mode 100644 drivers/infiniband/hw/usnic/usnic.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_abi.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_common_pkt_hdr.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_common_util.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_debugfs.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_debugfs.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_fwd.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_fwd.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_main.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_qp_grp.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_sysfs.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_sysfs.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_verbs.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_ib_verbs.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_log.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_transport.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_transport.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_uiom.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_uiom.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_uiom_interval_tree.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_uiom_interval_tree.h
 create mode 100644 drivers/infiniband/hw/usnic/usnic_vnic.c
 create mode 100644 drivers/infiniband/hw/usnic/usnic_vnic.h

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

* [GIT PULL] please pull infiniband.git
@ 2013-12-23 17:24 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-12-23 17:24 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

The following changes since commit 374b105797c3d4f29c685f3be535c35f5689b30e:

  Linux 3.13-rc3 (2013-12-06 09:34:04 -0800)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

for you to fetch changes up to 22f12c60e12a4112fdca31582e66fe501600ee2b:

  Merge branches 'cxgb4', 'flowsteer' and 'misc' into for-linus (2013-12-23 09:19:02 -0800)

----------------------------------------------------------------

Last batch of InfiniBand/RDMA changes for 3.13 / 2014:
 - Additional checks for uverbs to ensure forward compatibility, handle
   malformed input better.
 - Fix potential use-after-free in iWARP connection manager.
 - Make a function static.

----------------------------------------------------------------
Rashika (1):
      RDMA/cxgb4: Make _c4iw_write_mem_dma() static

Roland Dreier (2):
      IB/uverbs: New macro to set pointers to NULL if length is 0 in INIT_UDATA()
      Merge branches 'cxgb4', 'flowsteer' and 'misc' into for-linus

Steve Wise (1):
      RDMA/iwcm: Don't touch cm_id after deref in rem_ref

Yann Droneaud (7):
      IB/core: const'ify inbuf in struct ib_udata
      IB/uverbs: Check reserved field in extended command header
      IB/uverbs: Check comp_mask in destroy_flow
      IB/uverbs: Check reserved fields in create_flow
      IB/uverbs: Set error code when fail to consume all flow_spec items
      IB/uverbs: Check input length in flow steering uverbs
      IB/uverbs: Check access to userspace response buffer in extended command

 drivers/infiniband/core/iwcm.c        | 11 +++++++++--
 drivers/infiniband/core/uverbs.h      | 10 +++++++++-
 drivers/infiniband/core/uverbs_cmd.c  | 17 +++++++++++++++++
 drivers/infiniband/core/uverbs_main.c | 27 ++++++++++++++++-----------
 drivers/infiniband/hw/cxgb4/mem.c     |  2 +-
 include/rdma/ib_verbs.h               |  2 +-
 6 files changed, 53 insertions(+), 16 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2013-11-18 18:40 Roland Dreier
@ 2013-11-19 17:25 ` Or Gerlitz
  0 siblings, 0 replies; 223+ messages in thread
From: Or Gerlitz @ 2013-11-19 17:25 UTC (permalink / raw)
  To: Roland Dreier; +Cc: linux-rdma, linux-kernel

On 18/11/2013 20:40, Roland Dreier wrote:
> Hi Linus,
>
> Please pull from
>
>      git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
>
> ----------------------------------------------------------------
>
> Main batch of InfiniBand/RDMA changes for 3.13:
>
>   - Re-enable flow steering verbs with new improved userspace ABI
>   - Fixes for slow connection due to GID lookup scalability
>   - IPoIB fixes
>   - Many fixes to HW drivers including mlx4, mlx5, ocrdma and qib
>   - Further improvements to SRP error handling
>   - Add new transport type for Cisco usNIC

Hi Roland, can you spare few words on how you see the RoCE IP based Addressing V5 series? we have addressed the concerns you raised re compatibility and also simplified the series to avoid using uverbs extensions @ this point, anything else left there?

This series is pre-step for submitting SRIOV support to RoCE (the code is ready!) and hence no Cloud RoCE upstream solution for VMs before we nail that, it deserves your response. I have posted reply on Sep 17th, to your concerns http://marc.info/?l=linux-rdma&m=137945099714426&w=2 and didn't really hear from you. So went ahead and addressed the feedback as we captured it.

Or.



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

* [GIT PULL] please pull infiniband.git
@ 2013-11-18 18:40 Roland Dreier
  2013-11-19 17:25 ` Or Gerlitz
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2013-11-18 18:40 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.13:

 - Re-enable flow steering verbs with new improved userspace ABI
 - Fixes for slow connection due to GID lookup scalability
 - IPoIB fixes
 - Many fixes to HW drivers including mlx4, mlx5, ocrdma and qib
 - Further improvements to SRP error handling
 - Add new transport type for Cisco usNIC

----------------------------------------------------------------
Bart Van Assche (11):
      IB/srp: Keep rport as long as the IB transport layer
      scsi_transport_srp: Add transport layer error handling
      IB/srp: Use SRP transport layer error recovery
      IB/srp: Start timers if a transport layer error occurs
      scsi_transport_srp: Add periodic reconnect support
      IB/srp: Add periodic reconnect functionality
      IB/srp: Export sgid to sysfs
      IB/srp: Introduce srp_alloc_req_data()
      IB/srp: Make queue size configurable
      IB/srp: Avoid offlining operational SCSI devices
      IB/srp: Report receive errors correctly

Ben Hutchings (1):
      IB/cxgb4: Fix formatting of physical address

Dan Carpenter (1):
      RDMA/ocrdma: Silence an integer underflow warning

Dave Jones (1):
      RDMA/nes: Remove self-assignment from nes_query_qp()

Doug Ledford (2):
      IB/cma: Use cached gids
      IB/cma: Check for GID on listening device first

Eli Cohen (17):
      IB/mlx5: Fix check of number of entries in create CQ
      IB/mlx5: Multithreaded create MR
      IB/mlx5: Fix overflow check in IB_WR_FAST_REG_MR
      IB/mlx5: Simplify mlx5_ib_destroy_srq
      mlx5: Fix cleanup flow when DMA mapping fails
      mlx5: Support communicating arbitrary host page size to firmware
      mlx5: Clear reserved area in set_hca_cap()
      IB/mlx5: Remove dead code in mr.c
      IB/mlx5: Remove "Always false" comparison
      IB/mlx5: Update opt param mask for RTS2RTS
      mlx5: Use enum to indicate adapter page size
      IB/mlx4: Fix endless loop in resize CQ
      IB/core: Encorce MR access rights rules on kernel consumers
      IB/mlx5: Remove dead code
      IB/mlx5: Fix list_del of empty list
      IB/mlx4: Fix device max capabilities check
      IB/mlx5: Fix page shift in create CQ for userspace

Erez Shitrit (6):
      IPoIB: Fix crash in dev_open error flow
      IPoIB: Fix deadlock between dev_change_flags() and __ipoib_dev_flush()
      IPoIB: Avoid flushing the driver workqueue on dev_down
      IPoIB: Fix usage of uninitialized multicast objects
      IPoIB: Add path query flushing in ipoib_ib_dev_cleanup
      IPoIB: Start multicast join process only on active ports

Jack Wang (1):
      IB/srp: Add change_queue_depth and change_queue_type support

Jan Kara (2):
      IB/ipath: Convert ipath_user_sdma_pin_pages() to use get_user_pages_fast()
      IB/qib: Convert qib_user_sdma_pin_pages() to use get_user_pages_fast()

Joe Perches (1):
      IB/ucma: Convert use of typedef ctl_table to struct ctl_table

Latchesar Ionkov (1):
      IB/core: Pass imm_data from ib_uverbs_send_wr to ib_send_wr correctly

Matan Barak (2):
      IB/core: clarify overflow/underflow checks on ib_create/destroy_flow
      IB/core: Re-enable create_flow/destroy_flow uverbs

Mathias Krause (1):
      IB/netlink: Remove superfluous RDMA_NL_GET_OP() masking

Michal Nazarewicz (1):
      RDMA/cma: Remove unused argument and minor dead code

Michal Schmidt (1):
      IPoIB: lower NAPI weight

Mike Marciniszyn (2):
      IB/qib: Fix checkpatch __packed warnings
      IB/qib: Fix txselect regression

Moshe Lazer (2):
      IB/mlx5: Fix srq free in destroy qp
      mlx5_core: Change optimal_reclaimed_pages for better performance

Naresh Gottumukkala (2):
      RDMA/ocrdma: Fix a crash in rmmod
      RDMA/ocrdma: Remove redundant check in ocrdma_build_fr()

Roland Dreier (1):
      Merge branches 'cma', 'cxgb4', 'flowsteer', 'ipoib', 'misc', 'mlx4', 'mlx5', 'nes', 'ocrdma', 'qib' and 'srp' into for-next

Sean Hefty (1):
      RDMA/ucma: Discard events for IDs not yet claimed by user space

Tal Alon (1):
      IPoIB: Change CM skb memory allocation to be non-atomic during init

Upinder Malhi \(umalhi\) (1):
      IB/core: Add Cisco usNIC rdma node and transport types

Vu Pham (2):
      IB/srp: Make transport layer retry count configurable
      IB/srp: Remove target from list before freeing Scsi_Host structure

Yann Droneaud (5):
      IB/core: Rename 'flow' structs to match other uverbs structs
      IB/core: Make uverbs flow structure use names like verbs ones
      IB/core: Use a common header for uverbs flow_specs
      IB/core: Remove ib_uverbs_flow_spec structure from userspace
      IB/core: extended command: an improved infrastructure for uverbs commands

Zhao Hongjiang (1):
      IB/cm: Convert to using idr_alloc_cyclic()

 Documentation/ABI/stable/sysfs-driver-ib_srp       |  13 +
 Documentation/ABI/stable/sysfs-transport-srp       |  39 ++
 drivers/infiniband/Kconfig                         |  11 -
 drivers/infiniband/core/cm.c                       |   5 +-
 drivers/infiniband/core/cma.c                      |  68 ++-
 drivers/infiniband/core/netlink.c                  |   2 +-
 drivers/infiniband/core/sysfs.c                    |   1 +
 drivers/infiniband/core/ucma.c                     |   4 +-
 drivers/infiniband/core/uverbs.h                   |  36 +-
 drivers/infiniband/core/uverbs_cmd.c               | 109 ++---
 drivers/infiniband/core/uverbs_main.c              | 128 +++--
 drivers/infiniband/core/verbs.c                    |  17 +
 drivers/infiniband/hw/cxgb4/device.c               |   4 +-
 drivers/infiniband/hw/ipath/ipath_user_sdma.c      |   7 +-
 drivers/infiniband/hw/mlx4/cq.c                    |   9 +-
 drivers/infiniband/hw/mlx4/main.c                  |   8 +-
 drivers/infiniband/hw/mlx5/cq.c                    |  25 +-
 drivers/infiniband/hw/mlx5/main.c                  |   3 +-
 drivers/infiniband/hw/mlx5/mlx5_ib.h               |   6 +
 drivers/infiniband/hw/mlx5/mr.c                    | 167 +++++--
 drivers/infiniband/hw/mlx5/qp.c                    |  21 +-
 drivers/infiniband/hw/mlx5/srq.c                   |   8 +-
 drivers/infiniband/hw/nes/nes_verbs.c              |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma.h              |  53 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c           |   2 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c         |   7 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        |   6 +-
 drivers/infiniband/hw/qib/qib_iba7322.c            |  11 +-
 drivers/infiniband/hw/qib/qib_mad.h                |  14 +-
 drivers/infiniband/hw/qib/qib_user_sdma.c          |   6 +-
 drivers/infiniband/hw/qib/qib_verbs.h              |  10 +-
 drivers/infiniband/ulp/ipoib/ipoib.h               |   4 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c            |  14 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c            |  24 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |  12 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c     |  29 +-
 drivers/infiniband/ulp/ipoib/ipoib_netlink.c       |   4 +-
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c          |  10 +-
 drivers/infiniband/ulp/srp/ib_srp.c                | 500 +++++++++++++++----
 drivers/infiniband/ulp/srp/ib_srp.h                |  21 +-
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c      | 106 ++--
 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c  |   8 +-
 drivers/net/ethernet/mellanox/mlx5/core/eq.c       |   2 +-
 drivers/net/ethernet/mellanox/mlx5/core/main.c     |  35 +-
 drivers/net/ethernet/mellanox/mlx5/core/mr.c       |  32 +-
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    | 196 +++++---
 drivers/scsi/scsi_transport_srp.c                  | 540 ++++++++++++++++++++-
 include/linux/mlx5/device.h                        |  13 +-
 include/linux/mlx5/driver.h                        |  18 +-
 include/rdma/ib_verbs.h                            |  20 +-
 include/scsi/scsi_transport_srp.h                  |  83 +++-
 include/uapi/rdma/ib_user_verbs.h                  |  95 ++--
 52 files changed, 1973 insertions(+), 595 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2013-10-22 17:22 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-10-22 17:22 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

This is the "disable ABI we don't want to freeze" pull I warned you about.

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
Disable not-quite-ready userspace ABI for IB flow steering

----------------------------------------------------------------
Yann Droneaud (1):
      IB/core: Temporarily disable create_flow/destroy_flow uverbs

 drivers/infiniband/Kconfig            | 11 +++++++++++
 drivers/infiniband/core/uverbs.h      |  2 ++
 drivers/infiniband/core/uverbs_cmd.c  |  4 ++++
 drivers/infiniband/core/uverbs_main.c |  6 ++++++
 drivers/infiniband/hw/mlx4/main.c     |  2 ++
 include/uapi/rdma/ib_user_verbs.h     |  6 ++++++
 6 files changed, 31 insertions(+)

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

* Re: [GIT PULL] please pull infiniband.git
  2013-10-15  0:52 ` Linus Torvalds
@ 2013-10-15 17:48   ` Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-10-15 17:48 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Eli Cohen, linux-rdma, Linux Kernel Mailing List

On Mon, Oct 14, 2013 at 5:52 PM, Linus Torvalds
<torvalds@linux-foundation.org> wrote:
> So get your act together, and push back on the people you are supposed
> to manage. Because this is *not* acceptable for post-rc5, and I'm
> giving this single warning. Next time, I'll just ignore the sh*t you
> send me.
>
> Comprende?

Fair enough.  I've been AWOL for a month due to real life / non-kernel
stuff, and I didn't want the Mellanox guys to miss a kernel cycle just
because I couldn't get my act together.  So this one is totally on me
-- I know it's late in the cycle and I tried to sneak it in.

I do expect to send one more patch turning off a not-fully-baked new
feature for 3.12, but other than that everything else will wait for
3.13.

 - R.

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

* Re: [GIT PULL] please pull infiniband.git
  2013-10-14 18:16 Roland Dreier
@ 2013-10-15  0:52 ` Linus Torvalds
  2013-10-15 17:48   ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Linus Torvalds @ 2013-10-15  0:52 UTC (permalink / raw)
  To: Roland Dreier, Eli Cohen; +Cc: linux-rdma, Linux Kernel Mailing List

On Mon, Oct 14, 2013 at 11:16 AM, Roland Dreier <roland@kernel.org> wrote:
>
> Last batch of IB changes for 3.12: many mlx5 hardware driver fixes plus
> one trivial semicolon cleanup.

Quite frankly, these mlx5 updates don't look like regression fixes.
They look like "continued development" to me, and seem to be things
that never worked. At least some of them look like performance
enhancements, in fact, not even resembling bugfixes. Others look like
"not a bug, but let's improve random behavior".

I pulled this once, because hardly anybody really cares. But the other
side of that "nobody cares" is that I might as well not have pulled.
If this kind of "continued development" patches keep happening, I'll
just start ignoring pull requests after the merge window.

So get your act together, and push back on the people you are supposed
to manage. Because this is *not* acceptable for post-rc5, and I'm
giving this single warning. Next time, I'll just ignore the sh*t you
send me.

Comprende?

             Linus

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

* [GIT PULL] please pull infiniband.git
@ 2013-10-14 18:16 Roland Dreier
  2013-10-15  0:52 ` Linus Torvalds
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2013-10-14 18:16 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Last batch of IB changes for 3.12: many mlx5 hardware driver fixes plus
one trivial semicolon cleanup.

----------------------------------------------------------------
Eli Cohen (12):
      IB/mlx5: Fix send work queue size calculation
      mlx5: Remove checksum on command interface commands
      IB/mlx5: Decrease memory consumption of mr caches
      IB/mlx5: Avoid async events on invalid port number
      mlx5: Keep polling to reclaim pages while any returned
      mlx5: Fix layout of struct mlx5_init_seg
      IB/mlx5: Disable atomic operations
      mlx5: Fix opt param mask for sq err to rts transition
      IB/mlx5: Fix opt param mask according to firmware spec
      mlx5: Fix error code translation from firmware to driver
      IB/mlx5: Fix alignment of reg umr gather buffers
      IB/mlx5: Ensure proper synchronization accessing memory

Joe Perches (1):
      IB: Remove unnecessary semicolons

Moshe Lazer (2):
      IB/mlx5: Flush cache workqueue before destroying it
      IB/mlx5: Fix memory leak in mlx5_ib_create_srq

Roland Dreier (1):
      Merge branch 'misc' into for-next

Sagi Grimberg (1):
      IB/mlx5: Fix eq names to display nicely in /proc/interrupts

 drivers/infiniband/hw/amso1100/c2_ae.c             |  2 +-
 drivers/infiniband/hw/mlx5/main.c                  | 16 +++--
 drivers/infiniband/hw/mlx5/mr.c                    | 70 +++++++++----------
 drivers/infiniband/hw/mlx5/qp.c                    | 80 ++++++++--------------
 drivers/infiniband/hw/mlx5/srq.c                   |  4 +-
 drivers/infiniband/hw/mthca/mthca_eq.c             |  2 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c           |  6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c         |  2 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        |  6 +-
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c      | 28 ++++----
 drivers/net/ethernet/mellanox/mlx5/core/eq.c       |  4 +-
 drivers/net/ethernet/mellanox/mlx5/core/main.c     | 21 ++----
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    | 16 ++++-
 include/linux/mlx5/device.h                        |  4 +-
 include/linux/mlx5/driver.h                        |  6 +-
 15 files changed, 126 insertions(+), 141 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2013-09-05 16:42   ` Linus Torvalds
@ 2013-09-05 16:43     ` David Miller
  0 siblings, 0 replies; 223+ messages in thread
From: David Miller @ 2013-09-05 16:43 UTC (permalink / raw)
  To: torvalds; +Cc: sfr, roland, linux-kernel, netdev

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu, 5 Sep 2013 09:42:05 -0700

> On Wed, Sep 4, 2013 at 5:31 PM, Stephen Rothwell <sfr@canb.auug.org.au> wrote:
>>
>> I am carrying the following merge fix patch for a semantic conflict
>> between this tree and Dave's net-next tree:
> 
> Ok. I haven't gotten David's pull request yet, and unless I get it
> later today I'll probably forget this.
> 
> David, mind reminding me when you do send (or maybe cc'ing Stephen, so
> that he will)?

Sure, I was planning on send out the pull request by the end of today.

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

* Re: [GIT PULL] please pull infiniband.git
  2013-09-05  0:31 ` Stephen Rothwell
@ 2013-09-05 16:42   ` Linus Torvalds
  2013-09-05 16:43     ` David Miller
  0 siblings, 1 reply; 223+ messages in thread
From: Linus Torvalds @ 2013-09-05 16:42 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: Roland Dreier, Linux Kernel Mailing List, David Miller,
	Network Development

On Wed, Sep 4, 2013 at 5:31 PM, Stephen Rothwell <sfr@canb.auug.org.au> wrote:
>
> I am carrying the following merge fix patch for a semantic conflict
> between this tree and Dave's net-next tree:

Ok. I haven't gotten David's pull request yet, and unless I get it
later today I'll probably forget this.

David, mind reminding me when you do send (or maybe cc'ing Stephen, so
that he will)?

                  Linus

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

* Re: [GIT PULL] please pull infiniband.git
  2013-09-04 17:03 Roland Dreier
@ 2013-09-05  0:31 ` Stephen Rothwell
  2013-09-05 16:42   ` Linus Torvalds
  0 siblings, 1 reply; 223+ messages in thread
From: Stephen Rothwell @ 2013-09-05  0:31 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Roland Dreier, linux-kernel, David Miller, netdev

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

Hi Linus,

On Wed,  4 Sep 2013 10:03:38 -0700 Roland Dreier <roland@kernel.org> wrote:
>
> Please pull from
> 
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

I am carrying the following merge fix patch for a semantic conflict
between this tree and Dave's net-next tree:

From: Stephen Rothwell <sfr@canb.auug.org.au>
Date: Tue, 13 Aug 2013 13:01:49 +1000
Subject: [PATCH] cxgb4: fix up for bond_for_each_slave API change

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
---
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 038df4b..b6ad557 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -3982,7 +3982,6 @@ static int cxgb4_inet6addr_handler(struct notifier_block *this,
 	struct inet6_ifaddr *ifa = data;
 	struct net_device *event_dev;
 	int ret = NOTIFY_DONE;
-	int cnt;
 	struct bonding *bond = netdev_priv(ifa->idev->dev);
 	struct slave *slave;
 	struct pci_dev *first_pdev = NULL;
@@ -3996,7 +3995,7 @@ static int cxgb4_inet6addr_handler(struct notifier_block *this,
 		 * in all of them only once.
 		 */
 		read_lock(&bond->lock);
-		bond_for_each_slave(bond, slave, cnt) {
+		bond_for_each_slave(bond, slave) {
 			if (!first_pdev) {
 				ret = clip_add(slave->dev, ifa, event);
 				/* If clip_add is success then only initialize
-- 
1.8.4.rc0

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

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

* [GIT PULL] please pull infiniband.git
@ 2013-09-04 17:03 Roland Dreier
  2013-09-05  0:31 ` Stephen Rothwell
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2013-09-04 17:03 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.12 merge window:

 - Large ocrdma HW driver update: add "fast register" work requests,
   fixes, cleanups
 - Add receive flow steering support for raw QPs
 - Fix IPoIB neighbour race that leads to crash
 - iSER updates including support for using "fast register" memory
   registration
 - IPv6 support for iWARP
 - XRC transport fixes

----------------------------------------------------------------
CQ Tang (1):
      IB/qib: Improve SDMA performance

Hadar Hen Zion (3):
      IB/core: Add receive flow steering support
      IB/core: Export ib_create/destroy_flow through uverbs
      IB/mlx4: Add receive flow steering support

Igor Ivanov (1):
      IB/core: Infrastructure for extensible uverbs commands

Ira Weiny (1):
      IB/qib: Move COUNTER_MASK definition within qib_mad.h header guards

Jim Foraker (1):
      IPoIB: Fix race in deleting ipoib_neigh entries

Matan Barak (1):
      IB/core: Better checking of userspace values for receive flow steering

Naresh Gottumukkala (19):
      RDMA/ocrdma: Style and redundant code cleanup
      RDMA/ocrdma: Remove redundant dev reference
      RDMA/ocrdma: Don't allow zero/invalid sgid usage
      RDMA/ocrdma: Remove driver QP state machine
      RDMA/ocrdma: Remove __packed
      RDMA/ocrdma: Cache recv DB until QP moved to RTR
      RDMA/ocrdma: Create IRD queue fix
      RDMA/ocrdma: Add support for fast register work requests (FRWR)
      RDMA/ocrdma: Remove the MTU check based on Ethernet MTU
      RDMA/ocrdma: Fix to work with even a single MSI-X vector
      RDMA/ocrdma: For ERX2 irrespective of Qid, num_posted offset is 24
      RDMA/ocrdma: FRMA code cleanup
      RDMA/ocrdma: Dont use PD 0 for userpace CQ DB
      RDMA/ocrdma: Increase STAG array size
      RDMA/ocrdma: Fix for displaying proper link speed
      RDMA/ocrdma: Consider multiple SGES in case of DPP
      RDMA/ocrdma: Add ABI versioning support
      RDMA/ocrdma: Fill PVID in UMC case
      RDMA/ocrdma: Fix passing wrong opcode to modify_srq

Or Gerlitz (1):
      IB/iser: Use proper debug level value for info prints

Paul Bolle (1):
      IB/qib: Make qib_driver static

Roi Dayan (1):
      IB/iser: Fix possible memory leak in iser_create_frwr_pool()

Roland Dreier (2):
      RDMA/ocrdma: Fix compiler warning about int/pointer size mismatch
      Merge branches 'cxgb4', 'flowsteer', 'ipoib', 'iser', 'mlx4', 'ocrdma' and 'qib' into for-next

Sagi Grimberg (5):
      IB/iser: Generalize rdma memory registration
      IB/iser: Handle unaligned SG in separate function
      IB/iser: Place the fmr pool into a union in iser's IB conn struct
      IB/iser: Introduce fast memory registration model (FRWR)
      IB/iser: Fix redundant pointer check in dealloc flow

Shlomo Pongratz (2):
      IB/iser: Restructure allocation/deallocation of connection resources
      IB/iser: Accept session->cmds_max from user space

Steve Wise (9):
      RDMA/cma: Add IPv6 support for iWARP
      RDMA/cxgb4: Use correct bit shift macros for vlan filter tuples
      RDMA/cxgb4: Handle newer firmware changes
      RDMA/cxgb4: Fix QP flush logic
      RDMA/cxgb4: Fix accounting for unsignaled SQ WRs to deal with wrap
      RDMA/cxgb4: Set arp error handler for PASS_ACCEPT_RPL messages
      RDMA/cxgb4: Always do GTS write if cidx_inc == CIDXINC_MASK
      RDMA/cxgb4: Advertise ~0ULL as max MR size
      RDMA/cxgb4: Issue RI.FINI before closing when entering TERM

Vipul Pandya (3):
      cxgb4: Add routines to create and remove listening IPv6 servers
      cxgb4: Add CLIP support to store compressed IPv6 address
      RDMA/cxgb4: Add support for active and passive open connection with IPv6 address

Yijing Wang (1):
      IB/qib: Clean up unnecessary MSI/MSI-X capability find

Yishai Hadas (3):
      mlx4_core: Fix XRC QPs detection in the resource tracker
      IB/core: Add locking around event dispatching on XRC target QPs
      IB/core: Fixes to XRC reference counting in uverbs

 drivers/infiniband/core/cma.c                      |  44 +-
 drivers/infiniband/core/uverbs.h                   |   4 +
 drivers/infiniband/core/uverbs_cmd.c               | 250 +++++-
 drivers/infiniband/core/uverbs_main.c              |  42 +-
 drivers/infiniband/core/verbs.c                    |  30 +
 drivers/infiniband/hw/amso1100/c2_ae.c             |  18 +-
 drivers/infiniband/hw/amso1100/c2_cm.c             |  16 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c              |  46 +-
 drivers/infiniband/hw/cxgb4/Kconfig                |   2 +-
 drivers/infiniband/hw/cxgb4/cm.c                   | 860 ++++++++++++-------
 drivers/infiniband/hw/cxgb4/cq.c                   | 329 +++++---
 drivers/infiniband/hw/cxgb4/device.c               | 116 ++-
 drivers/infiniband/hw/cxgb4/ev.c                   |  10 -
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h             |   9 +-
 drivers/infiniband/hw/cxgb4/qp.c                   |  41 +-
 drivers/infiniband/hw/cxgb4/t4.h                   |  29 +-
 drivers/infiniband/hw/mlx4/main.c                  | 235 ++++++
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |  12 +
 drivers/infiniband/hw/nes/nes_cm.c                 | 153 ++--
 drivers/infiniband/hw/ocrdma/ocrdma.h              |  22 +-
 drivers/infiniband/hw/ocrdma/ocrdma_abi.h          |  32 +-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c           |  14 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c           | 458 +++++------
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h           |  13 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c         |   7 +
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h          | 210 +++--
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        | 878 ++++++++++++++++----
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h        |   6 +
 drivers/infiniband/hw/qib/qib.h                    |   5 +-
 drivers/infiniband/hw/qib/qib_common.h             |  32 +-
 drivers/infiniband/hw/qib/qib_file_ops.c           |   2 +-
 drivers/infiniband/hw/qib/qib_init.c               |   2 +-
 drivers/infiniband/hw/qib/qib_mad.h                |   3 +-
 drivers/infiniband/hw/qib/qib_pcie.c               |  10 +-
 drivers/infiniband/hw/qib/qib_sdma.c               |   8 +-
 drivers/infiniband/hw/qib/qib_user_sdma.c          | 909 ++++++++++++++++-----
 drivers/infiniband/ulp/ipoib/ipoib_cm.c            |   3 -
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |   9 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c           |  19 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h           |  73 +-
 drivers/infiniband/ulp/iser/iser_initiator.c       | 139 +++-
 drivers/infiniband/ulp/iser/iser_memory.c          | 231 +++++-
 drivers/infiniband/ulp/iser/iser_verbs.c           | 292 +++++--
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h         |   1 +
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c    | 288 ++++++-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h     |   5 +
 drivers/net/ethernet/chelsio/cxgb4/t4_msg.h        |  17 +-
 drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h      |  23 +
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |   3 +-
 include/linux/mlx4/device.h                        |   5 -
 include/rdma/ib_verbs.h                            | 128 ++-
 include/rdma/iw_cm.h                               |   8 +-
 include/uapi/rdma/ib_user_verbs.h                  |  99 ++-
 53 files changed, 4643 insertions(+), 1557 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2013-08-02 16:12 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-08-02 16:12 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

InfiniBand/RDMA fixes for 3.11-rc:
 - Fixes for the newly merged mlx5 hardware driver
 - Stack info leak fixes from Dan Carpenter
 - Fixes for pkey table handling with SR-IOV
 - A few other small things

----------------------------------------------------------------
Andi Shyti (1):
      mlx5_core: Variable may be used uninitialized

Dan Carpenter (6):
      RDMA/cxgb4: Fix stack info leak in c4iw_create_qp()
      RDMA/ocrdma: Fix several stack info leaks
      RDMA/nes: Fix info leaks in nes_create_qp() and nes_create_cq()
      RDMA/cxgb3: Fix stack info leak in iwch_create_cq()
      IB/mlx5: Fix stack info leak in mlx5_ib_alloc_ucontext()
      mlx5_core: Fix use after free in mlx5_cmd_comp_handler()

Eli Cohen (1):
      mlx5_core: Implement new initialization sequence

Erez Shitrit (1):
      IPoIB: Fix pkey change flow for virtualization environments

Jack Morgenstein (2):
      IB/mlx4: Use default pkey when creating tunnel QPs
      IB/core: Create QP1 using the pkey index which contains the default pkey

Mike Marciniszyn (1):
      IB/qib: Add err_decode() call for ring dump

Or Gerlitz (1):
      IPoIB: Make sure child devices use valid/proper pkeys

Paul Bolle (1):
      RDMA/cma: Fix gcc warning

Roland Dreier (3):
      RDMA/ocrdma: Remove unused include
      Revert "RDMA/nes: Fix compilation error when nes_debug is enabled"
      Merge branches 'cma', 'cxgb3', 'cxgb4', 'ipoib', 'misc', 'mlx4', 'mlx5', 'nes', 'ocrdma' and 'qib' into for-next

Sean Hefty (2):
      RDMA/cma: Fix accessing invalid private data for UD
      RDMA/cma: Only call cma_save_ib_info() for CM REQs

Wei Yongjun (1):
      IB/mlx5: Fix error return code in init_one()

 drivers/infiniband/core/cma.c                      | 29 +++++----
 drivers/infiniband/core/mad.c                      |  8 ++-
 drivers/infiniband/hw/cxgb3/iwch_provider.c        |  1 +
 drivers/infiniband/hw/cxgb4/qp.c                   |  2 +
 drivers/infiniband/hw/mlx4/mad.c                   | 10 ++-
 drivers/infiniband/hw/mlx5/main.c                  | 11 ++--
 drivers/infiniband/hw/mlx5/qp.c                    |  2 +-
 drivers/infiniband/hw/nes/nes_hw.c                 |  4 +-
 drivers/infiniband/hw/nes/nes_verbs.c              |  3 +-
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c           |  1 -
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        |  5 +-
 drivers/infiniband/hw/qib/qib_iba7322.c            |  2 +
 drivers/infiniband/hw/qib/qib_sdma.c               |  2 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c            | 76 ++++++++++++++++++----
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |  2 +-
 drivers/infiniband/ulp/ipoib/ipoib_netlink.c       |  9 +++
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c      | 19 ++++--
 drivers/net/ethernet/mellanox/mlx5/core/main.c     | 69 ++++++++++++++++++--
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    | 20 ++++--
 include/linux/mlx5/device.h                        | 20 ++++++
 include/linux/mlx5/driver.h                        |  4 +-
 21 files changed, 239 insertions(+), 60 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2013-07-11 23:52 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-07-11 23:52 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main (updated) batch of InfiniBand/RDMA changes for 3.11 merge window:

 - AF_IB (native IB addressing) for CMA from Sean Hefty
 - New mlx5 driver for Mellanox Connect-IB adapters (including post merge request fixes)
 - SRP fixes from Bart Van Assche (including fix to first merge request)
 - qib HW driver updates
 - Resurrection of ocrdma HW driver development
 - uverbs conversion to create fds with O_CLOEXEC set
 - Other small changes and fixes

----------------------------------------------------------------
Bart Van Assche (6):
      IB/srp: Avoid skipping srp_reset_host() after a transport error
      IB/srp: Skip host settle delay
      IB/srp: Fail I/O fast if target offline
      IB/srp: Maintain a single connection per I_T nexus
      IB/srp: Make HCA completion vector configurable
      IB/srp: Let srp_abort() return FAST_IO_FAIL if TL offline

Dan Carpenter (2):
      RDMA/cxgb3: Timeout condition is never true
      mlx5: Return -EFAULT instead of -EPERM

Dean Luick (1):
      IB/qib: Log all SDMA errors unconditionally

Dotan Barak (1):
      IB/srp: Fix remove_one crash due to resource exhaustion

Eli Cohen (1):
      mlx5: Add driver for Mellanox Connect-IB adapters

Gottumukkala, Naresh (1):
      RDMA/ocrdma: Remove use_cnt for queues

Jack Morgenstein (1):
      IB/core: Add reserved values to enums for low-level driver use

Mike Marciniszyn (7):
      IB/qib: Add DCA support
      IB/qib: Remove atomic_inc_not_zero() from QP RCU
      IB/qib: Optimize CQ callbacks
      IB/qib: Convert opcode counters to per-context
      IB/qib: Add per-context stats interface
      IB/qib: Add qp_stats debug file
      IB/qib: Fix module-level leak

Mitko Haralanov (1):
      IB/qib: New transmitter tunning settings for Dell 1.1 backplane

Moshe Lazer (1):
      mlx5_core: Adjust hca_cap.uar_page_sz to conform to Connect-IB spec

Naresh Gottumukkala (5):
      RDMA/ocrdma: Use MCC_CREATE_EXT_V1 for MCC create
      RDMA/ocrdma: Replace ocrdma_err with pr_err
      RDMA/ocrdma: Set bad_wr in error case
      RDMA/ocrdma: Change macros to inline funtions
      RDMA/ocrdma: Reorg structures to avoid padding

Ramkrishna Vepa (2):
      IB/qib: Add optional NUMA affinity
      IB/qib: Add dual-rail NUMA awareness for PSM processes

Roland Dreier (6):
      mlx5: Fix parameter type of health_handler_t
      IB/mlx5: Make profile[] static in main.c
      mlx5_core: Fixes for sparse warnings
      IB/uverbs: Use get_unused_fd_flags(O_CLOEXEC) instead of get_unused_fd()
      Merge branches 'af_ib', 'cxgb4', 'misc', 'mlx5', 'ocrdma', 'qib' and 'srp' into for-next
      Merge branches 'mlx5', 'qib' and 'srp' into for-next

Sean Hefty (28):
      RDMA/cma: Define native IB address
      RDMA/cma: Allow enabling reuseaddr in any state
      RDMA/cma: Include AF_IB in loopback and any address checks
      IB/addr: Add AF_IB support to ip_addr_size
      RDMA/cma: Update port reservation to support AF_IB
      RDMA/cma: Allow user to specify AF_IB when binding
      RDMA/cma: Do not modify sa_family when setting loopback address
      RDMA/cma: Add helper functions to return id address information
      RDMA/cma: Restrict AF_IB loopback to binding to IB devices only
      RDMA/cma: Verify that source and dest sa_family are the same
      RDMA/cma: Add support for AF_IB to rdma_resolve_addr()
      RDMA/cma: Add support for AF_IB to rdma_resolve_route()
      RDMA/cma: Add support for AF_IB to cma_get_service_id()
      RDMA/cma: Remove unused SDP related code
      RDMA/cma: Merge cma_get/save_net_info
      RDMA/cma: Expose private data when using AF_IB
      RDMA/cma: Set qkey for AF_IB
      RDMA/cma: Only listen on IB devices when using AF_IB
      RDMA/ucma: Support querying for AF_IB addresses
      IB/sa: Export function to pack a path record into wire format
      RDMA/ucma: Support querying when IB paths are not reversible
      RDMA/cma: Export cma_get_service_id()
      RDMA/ucma: Add ability to query GID addresses
      RDMA/ucma: Name changes to indicate only IP addresses supported
      RDMA/ucma: Allow user space to bind to AF_IB
      RDMA/ucma: Allow user space to pass AF_IB into resolve
      RDMA/ucma: Allow user space to specify AF_IB when joining multicast
      RDMA/cma: Export AF_IB statistics

Vinit Agnihotri (1):
      IB/qib: Update minor version number

Vu Pham (1):
      IB/srp: Bump driver version and release date

Wei Yongjun (3):
      IB/ehca: Fix error return code in ehca_create_slab_caches()
      RDMA/ocrdma: Fix error return code in ocrdma_set_create_qp_rq_cmd()
      IB/core: Fix error return code in add_port()

 Documentation/ABI/stable/sysfs-driver-ib_srp       |    7 +
 MAINTAINERS                                        |   22 +
 drivers/infiniband/Kconfig                         |    1 +
 drivers/infiniband/Makefile                        |    1 +
 drivers/infiniband/core/addr.c                     |   20 +-
 drivers/infiniband/core/cma.c                      |  906 ++++---
 drivers/infiniband/core/sa_query.c                 |    6 +
 drivers/infiniband/core/sysfs.c                    |    8 +-
 drivers/infiniband/core/ucma.c                     |  321 ++-
 drivers/infiniband/core/uverbs_cmd.c               |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c              |    3 +-
 drivers/infiniband/hw/ehca/ehca_main.c             |    1 +
 drivers/infiniband/hw/mlx5/Kconfig                 |   10 +
 drivers/infiniband/hw/mlx5/Makefile                |    3 +
 drivers/infiniband/hw/mlx5/ah.c                    |   92 +
 drivers/infiniband/hw/mlx5/cq.c                    |  843 +++++++
 drivers/infiniband/hw/mlx5/doorbell.c              |  100 +
 drivers/infiniband/hw/mlx5/mad.c                   |  139 ++
 drivers/infiniband/hw/mlx5/main.c                  | 1504 ++++++++++++
 drivers/infiniband/hw/mlx5/mem.c                   |  162 ++
 drivers/infiniband/hw/mlx5/mlx5_ib.h               |  545 +++++
 drivers/infiniband/hw/mlx5/mr.c                    | 1007 ++++++++
 drivers/infiniband/hw/mlx5/qp.c                    | 2524 ++++++++++++++++++++
 drivers/infiniband/hw/mlx5/srq.c                   |  473 ++++
 drivers/infiniband/hw/mlx5/user.h                  |  121 +
 drivers/infiniband/hw/ocrdma/ocrdma.h              |   63 +-
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c           |   86 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c         |    6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h          |   35 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c        |  135 +-
 drivers/infiniband/hw/qib/Kconfig                  |    8 +
 drivers/infiniband/hw/qib/Makefile                 |    1 +
 drivers/infiniband/hw/qib/qib.h                    |   63 +-
 drivers/infiniband/hw/qib/qib_common.h             |    2 +-
 drivers/infiniband/hw/qib/qib_cq.c                 |   67 +-
 drivers/infiniband/hw/qib/qib_debugfs.c            |  283 +++
 drivers/infiniband/hw/qib/qib_debugfs.h            |   45 +
 drivers/infiniband/hw/qib/qib_driver.c             |    1 -
 drivers/infiniband/hw/qib/qib_file_ops.c           |  176 +-
 drivers/infiniband/hw/qib/qib_iba6120.c            |   10 +
 drivers/infiniband/hw/qib/qib_iba7220.c            |   10 +
 drivers/infiniband/hw/qib/qib_iba7322.c            |  507 +++-
 drivers/infiniband/hw/qib/qib_init.c               |  145 +-
 drivers/infiniband/hw/qib/qib_qp.c                 |  123 +-
 drivers/infiniband/hw/qib/qib_sdma.c               |   56 +
 drivers/infiniband/hw/qib/qib_verbs.c              |    8 +-
 drivers/infiniband/hw/qib/qib_verbs.h              |   33 +-
 drivers/infiniband/ulp/srp/ib_srp.c                |   89 +-
 drivers/infiniband/ulp/srp/ib_srp.h                |    1 +
 drivers/net/ethernet/mellanox/Kconfig              |    1 +
 drivers/net/ethernet/mellanox/Makefile             |    1 +
 drivers/net/ethernet/mellanox/mlx5/core/Kconfig    |   18 +
 drivers/net/ethernet/mellanox/mlx5/core/Makefile   |    5 +
 drivers/net/ethernet/mellanox/mlx5/core/alloc.c    |  238 ++
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c      | 1515 ++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/cq.c       |  224 ++
 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c  |  583 +++++
 drivers/net/ethernet/mellanox/mlx5/core/eq.c       |  521 ++++
 drivers/net/ethernet/mellanox/mlx5/core/fw.c       |  185 ++
 drivers/net/ethernet/mellanox/mlx5/core/health.c   |  227 ++
 drivers/net/ethernet/mellanox/mlx5/core/mad.c      |   78 +
 drivers/net/ethernet/mellanox/mlx5/core/main.c     |  475 ++++
 drivers/net/ethernet/mellanox/mlx5/core/mcg.c      |  106 +
 .../net/ethernet/mellanox/mlx5/core/mlx5_core.h    |   73 +
 drivers/net/ethernet/mellanox/mlx5/core/mr.c       |  136 ++
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    |  435 ++++
 drivers/net/ethernet/mellanox/mlx5/core/pd.c       |  101 +
 drivers/net/ethernet/mellanox/mlx5/core/port.c     |  104 +
 drivers/net/ethernet/mellanox/mlx5/core/qp.c       |  301 +++
 drivers/net/ethernet/mellanox/mlx5/core/srq.c      |  223 ++
 drivers/net/ethernet/mellanox/mlx5/core/uar.c      |  223 ++
 include/linux/mlx5/cmd.h                           |   51 +
 include/linux/mlx5/cq.h                            |  165 ++
 include/linux/mlx5/device.h                        |  893 +++++++
 include/linux/mlx5/doorbell.h                      |   79 +
 include/linux/mlx5/driver.h                        |  769 ++++++
 include/linux/mlx5/qp.h                            |  467 ++++
 include/linux/mlx5/srq.h                           |   41 +
 include/linux/socket.h                             |    2 +
 include/rdma/ib.h                                  |   89 +
 include/rdma/ib_addr.h                             |    6 +-
 include/rdma/ib_sa.h                               |    7 +
 include/rdma/ib_verbs.h                            |   35 +-
 include/rdma/rdma_cm.h                             |   13 +
 include/uapi/rdma/rdma_user_cm.h                   |   73 +-
 85 files changed, 18436 insertions(+), 803 deletions(-)
 create mode 100644 drivers/infiniband/hw/mlx5/Kconfig
 create mode 100644 drivers/infiniband/hw/mlx5/Makefile
 create mode 100644 drivers/infiniband/hw/mlx5/ah.c
 create mode 100644 drivers/infiniband/hw/mlx5/cq.c
 create mode 100644 drivers/infiniband/hw/mlx5/doorbell.c
 create mode 100644 drivers/infiniband/hw/mlx5/mad.c
 create mode 100644 drivers/infiniband/hw/mlx5/main.c
 create mode 100644 drivers/infiniband/hw/mlx5/mem.c
 create mode 100644 drivers/infiniband/hw/mlx5/mlx5_ib.h
 create mode 100644 drivers/infiniband/hw/mlx5/mr.c
 create mode 100644 drivers/infiniband/hw/mlx5/qp.c
 create mode 100644 drivers/infiniband/hw/mlx5/srq.c
 create mode 100644 drivers/infiniband/hw/mlx5/user.h
 create mode 100644 drivers/infiniband/hw/qib/qib_debugfs.c
 create mode 100644 drivers/infiniband/hw/qib/qib_debugfs.h
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/Kconfig
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/Makefile
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/alloc.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/cmd.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/cq.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/eq.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/fw.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/health.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mad.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/main.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mcg.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mr.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/pd.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/port.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/qp.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/srq.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/uar.c
 create mode 100644 include/linux/mlx5/cmd.h
 create mode 100644 include/linux/mlx5/cq.h
 create mode 100644 include/linux/mlx5/device.h
 create mode 100644 include/linux/mlx5/doorbell.h
 create mode 100644 include/linux/mlx5/driver.h
 create mode 100644 include/linux/mlx5/qp.h
 create mode 100644 include/linux/mlx5/srq.h
 create mode 100644 include/rdma/ib.h

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

* Re: [GIT PULL] please pull infiniband.git
  2013-07-10 14:38   ` Roland Dreier
@ 2013-07-10 15:34     ` Bart Van Assche
  0 siblings, 0 replies; 223+ messages in thread
From: Bart Van Assche @ 2013-07-10 15:34 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Sebastian Riemer, Linus Torvalds, linux-kernel, linux-rdma

On 07/10/13 16:38, Roland Dreier wrote:
> On Wed, Jul 10, 2013 at 7:35 AM, Sebastian Riemer
> <sebastian.riemer@profitbricks.com> wrote:
>>
>> I've checked the commits on that tag and the following commit is not
>> what we've agreed on:
>
> Sorry about that.  The discussion was long and complex and I probably
> made a mistake in aplying the patches.  Please me send a patch to fix
> the driver to what it should be, and I will merge it ASAP.

I will send such a patch in reply to this e-mail but without CC-ing the 
LKML. Sebastian, if you could review that patch, that would be appreciated.

Bart.


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

* Re: [GIT PULL] please pull infiniband.git
  2013-07-10 14:35 ` Sebastian Riemer
@ 2013-07-10 14:38   ` Roland Dreier
  2013-07-10 15:34     ` Bart Van Assche
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2013-07-10 14:38 UTC (permalink / raw)
  To: Sebastian Riemer; +Cc: Linus Torvalds, linux-kernel, linux-rdma

On Wed, Jul 10, 2013 at 7:35 AM, Sebastian Riemer
<sebastian.riemer@profitbricks.com> wrote:
>
> I've checked the commits on that tag and the following commit is not
> what we've agreed on:

Sorry about that.  The discussion was long and complex and I probably
made a mistake in aplying the patches.  Please me send a patch to fix
the driver to what it should be, and I will merge it ASAP.

 - Roland

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

* Re: [GIT PULL] please pull infiniband.git
  2013-07-09 17:36 Roland Dreier
@ 2013-07-10 14:35 ` Sebastian Riemer
  2013-07-10 14:38   ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Sebastian Riemer @ 2013-07-10 14:35 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Linus Torvalds, linux-kernel, linux-rdma

Hi Roland,

I've checked the commits on that tag and the following commit is not
what we've agreed on:

commit 086f44f58855ae18bab19fb794cce6c6d2c6143b
Author: Bart Van Assche <bvanassche@acm.org>

    IB/srp: Avoid skipping srp_reset_host() after a transport error

Together with the following commit this results in the wrong return code
if transport_offline (SUCCESS instead of FAST_IO_FAIL):

commit 99e1c1398f44a056b16e78122133988c82b66d97
Author: Bart Van Assche <bvanassche@acm.org>

    IB/srp: Fail I/O fast if target offline


Resulting code:
1755         if (srp_send_tsk_mgmt(target, req->index, scmnd->device->lun,
1756                               SRP_TSK_ABORT_TASK) == 0 ||
1757             target->transport_offline)
1758                 ret = SUCCESS;
1759         else if (target->transport_offline)
1760                 ret = FAST_IO_FAIL;
1761         else
1762                 ret = FAILED;

This doesn't make sense. The check for transport_offline has to be
removed for the SUCCESS case! I've already told that on linux-rdma.

Cheers,
Sebastian


On 09.07.2013 19:36, Roland Dreier wrote:
> Hi Linus,
> 
> Please pull from
> 
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus
> 
> ----------------------------------------------------------------
> 
> Main batch of InfiniBand/RDMA changes for 3.11 merge window:
> 
>  - AF_IB (native IB addressing) for CMA from Sean Hefty
>  - New mlx5 driver for Mellanox Connect-IB adapters
>  - SRP fixes from Bart Van Assche
>  - qib HW driver updates
>  - Resurrection of ocrdma HW driver development
>  - uverbs conversion to create fds with O_CLOEXEC set
>  - Other small changes and fixes
> 
> ----------------------------------------------------------------
> Bart Van Assche (5):
>       IB/srp: Avoid skipping srp_reset_host() after a transport error
>       IB/srp: Skip host settle delay
>       IB/srp: Fail I/O fast if target offline
>       IB/srp: Maintain a single connection per I_T nexus
>       IB/srp: Make HCA completion vector configurable
> 
> Dan Carpenter (1):
>       RDMA/cxgb3: Timeout condition is never true
> 
> Dotan Barak (1):
>       IB/srp: Fix remove_one crash due to resource exhaustion
> 
> Eli Cohen (1):
>       mlx5: Add driver for Mellanox Connect-IB adapters
> 
> Gottumukkala, Naresh (1):
>       RDMA/ocrdma: Remove use_cnt for queues
> 
> Jack Morgenstein (1):
>       IB/core: Add reserved values to enums for low-level driver use
> 
> Mike Marciniszyn (6):
>       IB/qib: Add DCA support
>       IB/qib: Remove atomic_inc_not_zero() from QP RCU
>       IB/qib: Optimize CQ callbacks
>       IB/qib: Convert opcode counters to per-context
>       IB/qib: Add per-context stats interface
>       IB/qib: Add qp_stats debug file
> 
> Mitko Haralanov (1):
>       IB/qib: New transmitter tunning settings for Dell 1.1 backplane
> 
> Naresh Gottumukkala (5):
>       RDMA/ocrdma: Use MCC_CREATE_EXT_V1 for MCC create
>       RDMA/ocrdma: Replace ocrdma_err with pr_err
>       RDMA/ocrdma: Set bad_wr in error case
>       RDMA/ocrdma: Change macros to inline funtions
>       RDMA/ocrdma: Reorg structures to avoid padding
> 
> Ramkrishna Vepa (2):
>       IB/qib: Add optional NUMA affinity
>       IB/qib: Add dual-rail NUMA awareness for PSM processes
> 
> Roland Dreier (5):
>       mlx5: Fix parameter type of health_handler_t
>       IB/mlx5: Make profile[] static in main.c
>       mlx5_core: Fixes for sparse warnings
>       IB/uverbs: Use get_unused_fd_flags(O_CLOEXEC) instead of get_unused_fd()
>       Merge branches 'af_ib', 'cxgb4', 'misc', 'mlx5', 'ocrdma', 'qib' and 'srp' into for-next
> 
> Sean Hefty (28):
>       RDMA/cma: Define native IB address
>       RDMA/cma: Allow enabling reuseaddr in any state
>       RDMA/cma: Include AF_IB in loopback and any address checks
>       IB/addr: Add AF_IB support to ip_addr_size
>       RDMA/cma: Update port reservation to support AF_IB
>       RDMA/cma: Allow user to specify AF_IB when binding
>       RDMA/cma: Do not modify sa_family when setting loopback address
>       RDMA/cma: Add helper functions to return id address information
>       RDMA/cma: Restrict AF_IB loopback to binding to IB devices only
>       RDMA/cma: Verify that source and dest sa_family are the same
>       RDMA/cma: Add support for AF_IB to rdma_resolve_addr()
>       RDMA/cma: Add support for AF_IB to rdma_resolve_route()
>       RDMA/cma: Add support for AF_IB to cma_get_service_id()
>       RDMA/cma: Remove unused SDP related code
>       RDMA/cma: Merge cma_get/save_net_info
>       RDMA/cma: Expose private data when using AF_IB
>       RDMA/cma: Set qkey for AF_IB
>       RDMA/cma: Only listen on IB devices when using AF_IB
>       RDMA/ucma: Support querying for AF_IB addresses
>       IB/sa: Export function to pack a path record into wire format
>       RDMA/ucma: Support querying when IB paths are not reversible
>       RDMA/cma: Export cma_get_service_id()
>       RDMA/ucma: Add ability to query GID addresses
>       RDMA/ucma: Name changes to indicate only IP addresses supported
>       RDMA/ucma: Allow user space to bind to AF_IB
>       RDMA/ucma: Allow user space to pass AF_IB into resolve
>       RDMA/ucma: Allow user space to specify AF_IB when joining multicast
>       RDMA/cma: Export AF_IB statistics
> 
> Vinit Agnihotri (1):
>       IB/qib: Update minor version number
> 
> Vu Pham (1):
>       IB/srp: Bump driver version and release date
> 
> Wei Yongjun (3):
>       IB/ehca: Fix error return code in ehca_create_slab_caches()
>       RDMA/ocrdma: Fix error return code in ocrdma_set_create_qp_rq_cmd()
>       IB/core: Fix error return code in add_port()
> 
>  Documentation/ABI/stable/sysfs-driver-ib_srp        |    7 +
>  MAINTAINERS                                         |   22 ++
>  drivers/infiniband/Kconfig                          |    1 +
>  drivers/infiniband/Makefile                         |    1 +
>  drivers/infiniband/core/addr.c                      |   20 +-
>  drivers/infiniband/core/cma.c                       |  906 ++++++++++++++++++++++++++++++++++-------------------------
>  drivers/infiniband/core/sa_query.c                  |    6 +
>  drivers/infiniband/core/sysfs.c                     |    8 +-
>  drivers/infiniband/core/ucma.c                      |  321 ++++++++++++++++++---
>  drivers/infiniband/core/uverbs_cmd.c                |    4 +-
>  drivers/infiniband/hw/cxgb3/iwch_qp.c               |    3 +-
>  drivers/infiniband/hw/ehca/ehca_main.c              |    1 +
>  drivers/infiniband/hw/mlx5/Kconfig                  |   10 +
>  drivers/infiniband/hw/mlx5/Makefile                 |    3 +
>  drivers/infiniband/hw/mlx5/ah.c                     |   92 ++++++
>  drivers/infiniband/hw/mlx5/cq.c                     |  843 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/mlx5/doorbell.c               |  100 +++++++
>  drivers/infiniband/hw/mlx5/mad.c                    |  139 +++++++++
>  drivers/infiniband/hw/mlx5/main.c                   | 1504 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/mlx5/mem.c                    |  162 +++++++++++
>  drivers/infiniband/hw/mlx5/mlx5_ib.h                |  545 +++++++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/mlx5/mr.c                     | 1007 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/mlx5/qp.c                     | 2524 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/mlx5/srq.c                    |  473 +++++++++++++++++++++++++++++++
>  drivers/infiniband/hw/mlx5/user.h                   |  121 ++++++++
>  drivers/infiniband/hw/ocrdma/ocrdma.h               |   63 +++--
>  drivers/infiniband/hw/ocrdma/ocrdma_hw.c            |   86 +++---
>  drivers/infiniband/hw/ocrdma/ocrdma_main.c          |    6 +-
>  drivers/infiniband/hw/ocrdma/ocrdma_sli.h           |   35 +--
>  drivers/infiniband/hw/ocrdma/ocrdma_verbs.c         |  135 ++++-----
>  drivers/infiniband/hw/qib/Kconfig                   |    8 +
>  drivers/infiniband/hw/qib/Makefile                  |    1 +
>  drivers/infiniband/hw/qib/qib.h                     |   61 ++--
>  drivers/infiniband/hw/qib/qib_common.h              |    2 +-
>  drivers/infiniband/hw/qib/qib_cq.c                  |   67 ++++-
>  drivers/infiniband/hw/qib/qib_debugfs.c             |  283 +++++++++++++++++++
>  drivers/infiniband/hw/qib/qib_debugfs.h             |   45 +++
>  drivers/infiniband/hw/qib/qib_driver.c              |    1 -
>  drivers/infiniband/hw/qib/qib_file_ops.c            |  176 ++++++++----
>  drivers/infiniband/hw/qib/qib_iba6120.c             |   10 +
>  drivers/infiniband/hw/qib/qib_iba7220.c             |   10 +
>  drivers/infiniband/hw/qib/qib_iba7322.c             |  393 +++++++++++++++++++++++---
>  drivers/infiniband/hw/qib/qib_init.c                |  139 +++++++--
>  drivers/infiniband/hw/qib/qib_qp.c                  |  123 +++++++-
>  drivers/infiniband/hw/qib/qib_verbs.c               |    8 +-
>  drivers/infiniband/hw/qib/qib_verbs.h               |   33 ++-
>  drivers/infiniband/ulp/srp/ib_srp.c                 |   90 +++++-
>  drivers/infiniband/ulp/srp/ib_srp.h                 |    1 +
>  drivers/net/ethernet/mellanox/Kconfig               |    1 +
>  drivers/net/ethernet/mellanox/Makefile              |    1 +
>  drivers/net/ethernet/mellanox/mlx5/core/Kconfig     |   18 ++
>  drivers/net/ethernet/mellanox/mlx5/core/Makefile    |    5 +
>  drivers/net/ethernet/mellanox/mlx5/core/alloc.c     |  238 ++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/cmd.c       | 1515 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/cq.c        |  224 +++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/debugfs.c   |  587 ++++++++++++++++++++++++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/eq.c        |  521 ++++++++++++++++++++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/fw.c        |  185 ++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/health.c    |  227 +++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/mad.c       |   78 ++++++
>  drivers/net/ethernet/mellanox/mlx5/core/main.c      |  475 +++++++++++++++++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/mcg.c       |  106 +++++++
>  drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h |   73 +++++
>  drivers/net/ethernet/mellanox/mlx5/core/mr.c        |  136 +++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c |  435 ++++++++++++++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/pd.c        |  101 +++++++
>  drivers/net/ethernet/mellanox/mlx5/core/port.c      |  104 +++++++
>  drivers/net/ethernet/mellanox/mlx5/core/qp.c        |  301 ++++++++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/srq.c       |  223 +++++++++++++++
>  drivers/net/ethernet/mellanox/mlx5/core/uar.c       |  223 +++++++++++++++
>  include/linux/mlx5/cmd.h                            |   51 ++++
>  include/linux/mlx5/cq.h                             |  165 +++++++++++
>  include/linux/mlx5/device.h                         |  893 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/mlx5/doorbell.h                       |   79 ++++++
>  include/linux/mlx5/driver.h                         |  769 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/mlx5/qp.h                             |  467 ++++++++++++++++++++++++++++++
>  include/linux/mlx5/srq.h                            |   41 +++
>  include/linux/socket.h                              |    2 +
>  include/rdma/ib.h                                   |   89 ++++++
>  include/rdma/ib_addr.h                              |    6 +-
>  include/rdma/ib_sa.h                                |    7 +
>  include/rdma/ib_verbs.h                             |   35 ++-
>  include/rdma/rdma_cm.h                              |   13 +
>  include/uapi/rdma/rdma_user_cm.h                    |   73 ++++-
>  84 files changed, 18267 insertions(+), 799 deletions(-)
>  create mode 100644 drivers/infiniband/hw/mlx5/Kconfig
>  create mode 100644 drivers/infiniband/hw/mlx5/Makefile
>  create mode 100644 drivers/infiniband/hw/mlx5/ah.c
>  create mode 100644 drivers/infiniband/hw/mlx5/cq.c
>  create mode 100644 drivers/infiniband/hw/mlx5/doorbell.c
>  create mode 100644 drivers/infiniband/hw/mlx5/mad.c
>  create mode 100644 drivers/infiniband/hw/mlx5/main.c
>  create mode 100644 drivers/infiniband/hw/mlx5/mem.c
>  create mode 100644 drivers/infiniband/hw/mlx5/mlx5_ib.h
>  create mode 100644 drivers/infiniband/hw/mlx5/mr.c
>  create mode 100644 drivers/infiniband/hw/mlx5/qp.c
>  create mode 100644 drivers/infiniband/hw/mlx5/srq.c
>  create mode 100644 drivers/infiniband/hw/mlx5/user.h
>  create mode 100644 drivers/infiniband/hw/qib/qib_debugfs.c
>  create mode 100644 drivers/infiniband/hw/qib/qib_debugfs.h
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/Kconfig
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/Makefile
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/alloc.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/cmd.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/cq.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/eq.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/fw.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/health.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mad.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/main.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mcg.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mr.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/pd.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/port.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/qp.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/srq.c
>  create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/uar.c
>  create mode 100644 include/linux/mlx5/cmd.h
>  create mode 100644 include/linux/mlx5/cq.h
>  create mode 100644 include/linux/mlx5/device.h
>  create mode 100644 include/linux/mlx5/doorbell.h
>  create mode 100644 include/linux/mlx5/driver.h
>  create mode 100644 include/linux/mlx5/qp.h
>  create mode 100644 include/linux/mlx5/srq.h
>  create mode 100644 include/rdma/ib.h
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


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

* [GIT PULL] please pull infiniband.git
@ 2013-07-09 17:36 Roland Dreier
  2013-07-10 14:35 ` Sebastian Riemer
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2013-07-09 17:36 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.11 merge window:

 - AF_IB (native IB addressing) for CMA from Sean Hefty
 - New mlx5 driver for Mellanox Connect-IB adapters
 - SRP fixes from Bart Van Assche
 - qib HW driver updates
 - Resurrection of ocrdma HW driver development
 - uverbs conversion to create fds with O_CLOEXEC set
 - Other small changes and fixes

----------------------------------------------------------------
Bart Van Assche (5):
      IB/srp: Avoid skipping srp_reset_host() after a transport error
      IB/srp: Skip host settle delay
      IB/srp: Fail I/O fast if target offline
      IB/srp: Maintain a single connection per I_T nexus
      IB/srp: Make HCA completion vector configurable

Dan Carpenter (1):
      RDMA/cxgb3: Timeout condition is never true

Dotan Barak (1):
      IB/srp: Fix remove_one crash due to resource exhaustion

Eli Cohen (1):
      mlx5: Add driver for Mellanox Connect-IB adapters

Gottumukkala, Naresh (1):
      RDMA/ocrdma: Remove use_cnt for queues

Jack Morgenstein (1):
      IB/core: Add reserved values to enums for low-level driver use

Mike Marciniszyn (6):
      IB/qib: Add DCA support
      IB/qib: Remove atomic_inc_not_zero() from QP RCU
      IB/qib: Optimize CQ callbacks
      IB/qib: Convert opcode counters to per-context
      IB/qib: Add per-context stats interface
      IB/qib: Add qp_stats debug file

Mitko Haralanov (1):
      IB/qib: New transmitter tunning settings for Dell 1.1 backplane

Naresh Gottumukkala (5):
      RDMA/ocrdma: Use MCC_CREATE_EXT_V1 for MCC create
      RDMA/ocrdma: Replace ocrdma_err with pr_err
      RDMA/ocrdma: Set bad_wr in error case
      RDMA/ocrdma: Change macros to inline funtions
      RDMA/ocrdma: Reorg structures to avoid padding

Ramkrishna Vepa (2):
      IB/qib: Add optional NUMA affinity
      IB/qib: Add dual-rail NUMA awareness for PSM processes

Roland Dreier (5):
      mlx5: Fix parameter type of health_handler_t
      IB/mlx5: Make profile[] static in main.c
      mlx5_core: Fixes for sparse warnings
      IB/uverbs: Use get_unused_fd_flags(O_CLOEXEC) instead of get_unused_fd()
      Merge branches 'af_ib', 'cxgb4', 'misc', 'mlx5', 'ocrdma', 'qib' and 'srp' into for-next

Sean Hefty (28):
      RDMA/cma: Define native IB address
      RDMA/cma: Allow enabling reuseaddr in any state
      RDMA/cma: Include AF_IB in loopback and any address checks
      IB/addr: Add AF_IB support to ip_addr_size
      RDMA/cma: Update port reservation to support AF_IB
      RDMA/cma: Allow user to specify AF_IB when binding
      RDMA/cma: Do not modify sa_family when setting loopback address
      RDMA/cma: Add helper functions to return id address information
      RDMA/cma: Restrict AF_IB loopback to binding to IB devices only
      RDMA/cma: Verify that source and dest sa_family are the same
      RDMA/cma: Add support for AF_IB to rdma_resolve_addr()
      RDMA/cma: Add support for AF_IB to rdma_resolve_route()
      RDMA/cma: Add support for AF_IB to cma_get_service_id()
      RDMA/cma: Remove unused SDP related code
      RDMA/cma: Merge cma_get/save_net_info
      RDMA/cma: Expose private data when using AF_IB
      RDMA/cma: Set qkey for AF_IB
      RDMA/cma: Only listen on IB devices when using AF_IB
      RDMA/ucma: Support querying for AF_IB addresses
      IB/sa: Export function to pack a path record into wire format
      RDMA/ucma: Support querying when IB paths are not reversible
      RDMA/cma: Export cma_get_service_id()
      RDMA/ucma: Add ability to query GID addresses
      RDMA/ucma: Name changes to indicate only IP addresses supported
      RDMA/ucma: Allow user space to bind to AF_IB
      RDMA/ucma: Allow user space to pass AF_IB into resolve
      RDMA/ucma: Allow user space to specify AF_IB when joining multicast
      RDMA/cma: Export AF_IB statistics

Vinit Agnihotri (1):
      IB/qib: Update minor version number

Vu Pham (1):
      IB/srp: Bump driver version and release date

Wei Yongjun (3):
      IB/ehca: Fix error return code in ehca_create_slab_caches()
      RDMA/ocrdma: Fix error return code in ocrdma_set_create_qp_rq_cmd()
      IB/core: Fix error return code in add_port()

 Documentation/ABI/stable/sysfs-driver-ib_srp        |    7 +
 MAINTAINERS                                         |   22 ++
 drivers/infiniband/Kconfig                          |    1 +
 drivers/infiniband/Makefile                         |    1 +
 drivers/infiniband/core/addr.c                      |   20 +-
 drivers/infiniband/core/cma.c                       |  906 ++++++++++++++++++++++++++++++++++-------------------------
 drivers/infiniband/core/sa_query.c                  |    6 +
 drivers/infiniband/core/sysfs.c                     |    8 +-
 drivers/infiniband/core/ucma.c                      |  321 ++++++++++++++++++---
 drivers/infiniband/core/uverbs_cmd.c                |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c               |    3 +-
 drivers/infiniband/hw/ehca/ehca_main.c              |    1 +
 drivers/infiniband/hw/mlx5/Kconfig                  |   10 +
 drivers/infiniband/hw/mlx5/Makefile                 |    3 +
 drivers/infiniband/hw/mlx5/ah.c                     |   92 ++++++
 drivers/infiniband/hw/mlx5/cq.c                     |  843 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/doorbell.c               |  100 +++++++
 drivers/infiniband/hw/mlx5/mad.c                    |  139 +++++++++
 drivers/infiniband/hw/mlx5/main.c                   | 1504 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/mem.c                    |  162 +++++++++++
 drivers/infiniband/hw/mlx5/mlx5_ib.h                |  545 +++++++++++++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/mr.c                     | 1007 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/qp.c                     | 2524 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/srq.c                    |  473 +++++++++++++++++++++++++++++++
 drivers/infiniband/hw/mlx5/user.h                   |  121 ++++++++
 drivers/infiniband/hw/ocrdma/ocrdma.h               |   63 +++--
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c            |   86 +++---
 drivers/infiniband/hw/ocrdma/ocrdma_main.c          |    6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h           |   35 +--
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c         |  135 ++++-----
 drivers/infiniband/hw/qib/Kconfig                   |    8 +
 drivers/infiniband/hw/qib/Makefile                  |    1 +
 drivers/infiniband/hw/qib/qib.h                     |   61 ++--
 drivers/infiniband/hw/qib/qib_common.h              |    2 +-
 drivers/infiniband/hw/qib/qib_cq.c                  |   67 ++++-
 drivers/infiniband/hw/qib/qib_debugfs.c             |  283 +++++++++++++++++++
 drivers/infiniband/hw/qib/qib_debugfs.h             |   45 +++
 drivers/infiniband/hw/qib/qib_driver.c              |    1 -
 drivers/infiniband/hw/qib/qib_file_ops.c            |  176 ++++++++----
 drivers/infiniband/hw/qib/qib_iba6120.c             |   10 +
 drivers/infiniband/hw/qib/qib_iba7220.c             |   10 +
 drivers/infiniband/hw/qib/qib_iba7322.c             |  393 +++++++++++++++++++++++---
 drivers/infiniband/hw/qib/qib_init.c                |  139 +++++++--
 drivers/infiniband/hw/qib/qib_qp.c                  |  123 +++++++-
 drivers/infiniband/hw/qib/qib_verbs.c               |    8 +-
 drivers/infiniband/hw/qib/qib_verbs.h               |   33 ++-
 drivers/infiniband/ulp/srp/ib_srp.c                 |   90 +++++-
 drivers/infiniband/ulp/srp/ib_srp.h                 |    1 +
 drivers/net/ethernet/mellanox/Kconfig               |    1 +
 drivers/net/ethernet/mellanox/Makefile              |    1 +
 drivers/net/ethernet/mellanox/mlx5/core/Kconfig     |   18 ++
 drivers/net/ethernet/mellanox/mlx5/core/Makefile    |    5 +
 drivers/net/ethernet/mellanox/mlx5/core/alloc.c     |  238 ++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c       | 1515 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/cq.c        |  224 +++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c   |  587 ++++++++++++++++++++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/eq.c        |  521 ++++++++++++++++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/fw.c        |  185 ++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/health.c    |  227 +++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/mad.c       |   78 ++++++
 drivers/net/ethernet/mellanox/mlx5/core/main.c      |  475 +++++++++++++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/mcg.c       |  106 +++++++
 drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h |   73 +++++
 drivers/net/ethernet/mellanox/mlx5/core/mr.c        |  136 +++++++++
 drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c |  435 ++++++++++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/pd.c        |  101 +++++++
 drivers/net/ethernet/mellanox/mlx5/core/port.c      |  104 +++++++
 drivers/net/ethernet/mellanox/mlx5/core/qp.c        |  301 ++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/srq.c       |  223 +++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/uar.c       |  223 +++++++++++++++
 include/linux/mlx5/cmd.h                            |   51 ++++
 include/linux/mlx5/cq.h                             |  165 +++++++++++
 include/linux/mlx5/device.h                         |  893 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/mlx5/doorbell.h                       |   79 ++++++
 include/linux/mlx5/driver.h                         |  769 ++++++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/mlx5/qp.h                             |  467 ++++++++++++++++++++++++++++++
 include/linux/mlx5/srq.h                            |   41 +++
 include/linux/socket.h                              |    2 +
 include/rdma/ib.h                                   |   89 ++++++
 include/rdma/ib_addr.h                              |    6 +-
 include/rdma/ib_sa.h                                |    7 +
 include/rdma/ib_verbs.h                             |   35 ++-
 include/rdma/rdma_cm.h                              |   13 +
 include/uapi/rdma/rdma_user_cm.h                    |   73 ++++-
 84 files changed, 18267 insertions(+), 799 deletions(-)
 create mode 100644 drivers/infiniband/hw/mlx5/Kconfig
 create mode 100644 drivers/infiniband/hw/mlx5/Makefile
 create mode 100644 drivers/infiniband/hw/mlx5/ah.c
 create mode 100644 drivers/infiniband/hw/mlx5/cq.c
 create mode 100644 drivers/infiniband/hw/mlx5/doorbell.c
 create mode 100644 drivers/infiniband/hw/mlx5/mad.c
 create mode 100644 drivers/infiniband/hw/mlx5/main.c
 create mode 100644 drivers/infiniband/hw/mlx5/mem.c
 create mode 100644 drivers/infiniband/hw/mlx5/mlx5_ib.h
 create mode 100644 drivers/infiniband/hw/mlx5/mr.c
 create mode 100644 drivers/infiniband/hw/mlx5/qp.c
 create mode 100644 drivers/infiniband/hw/mlx5/srq.c
 create mode 100644 drivers/infiniband/hw/mlx5/user.h
 create mode 100644 drivers/infiniband/hw/qib/qib_debugfs.c
 create mode 100644 drivers/infiniband/hw/qib/qib_debugfs.h
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/Kconfig
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/Makefile
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/alloc.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/cmd.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/cq.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/eq.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/fw.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/health.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mad.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/main.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mcg.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/mr.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/pd.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/port.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/qp.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/srq.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/uar.c
 create mode 100644 include/linux/mlx5/cmd.h
 create mode 100644 include/linux/mlx5/cq.h
 create mode 100644 include/linux/mlx5/device.h
 create mode 100644 include/linux/mlx5/doorbell.h
 create mode 100644 include/linux/mlx5/driver.h
 create mode 100644 include/linux/mlx5/qp.h
 create mode 100644 include/linux/mlx5/srq.h
 create mode 100644 include/rdma/ib.h

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

* [GIT PULL] please pull infiniband.git
@ 2013-06-07 22:28 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-06-07 22:28 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

InfiniBand fixes for 3.10-rc:
 - qib RCU/lockdep fix
 - iser device removal fix, plus doc fixes

----------------------------------------------------------------
Mike Marciniszyn (1):
      IB/qib: Fix lockdep splat in qib_alloc_lkey()

Or Gerlitz (2):
      IB/iser: Add Mellanox copyright
      MAINTAINERS: Add entry for iSCSI Extensions for RDMA (iSER) initiator

Roi Dayan (1):
      IB/iser: Fix device removal flow

Roland Dreier (1):
      Merge branches 'iser' and 'qib' into for-next

 MAINTAINERS                                  | 10 ++++++++++
 drivers/infiniband/hw/qib/qib_keys.c         |  2 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c     |  1 +
 drivers/infiniband/ulp/iser/iscsi_iser.h     |  1 +
 drivers/infiniband/ulp/iser/iser_initiator.c |  1 +
 drivers/infiniband/ulp/iser/iser_memory.c    |  1 +
 drivers/infiniband/ulp/iser/iser_verbs.c     | 16 +++++++++-------
 7 files changed, 24 insertions(+), 8 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2013-05-08 21:20 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-05-08 21:20 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

InfiniBand/RDMA changes for the 3.10 merge window:
 - XRC transport fixes
 - Fix DHCP on IPoIB
 - mlx4 preparations for flow steering
 - iSER fixes
 - miscellaneous other fixes

Sorry for being so late on this -- I moved houses and the system with
all my private keys was offline for a week or so.

----------------------------------------------------------------
Akinobu Mita (1):
      RDMA: Rename random32() to prandom_u32()

Cong Ding (1):
      RDMA/cxgb3: Fix uninitialized variable

Dotan Barak (1):
      IB/mlx4: Disable VLAN stripping for RAW PACKET QPs

Doug Ledford (1):
      IPoIB: Fix ipoib_hard_header() return value

Eli Cohen (1):
      IB/mlx4: Set link type for RAW PACKET QPs in the QP context

Grant Grundler (1):
      SRPT: Fix odd use of WARN_ON()

Hadar Hen Zion (5):
      mlx4_core: Move DMFS HW structs to common header file
      mlx4: Match DMFS promiscuous field names to firmware spec
      mlx4_core: Change a few DMFS fields names to match firmare spec
      mlx4_core: Directly expose fields of DMFS HW rule control segment
      mlx4_core: Expose a few helpers to fill DMFS HW strucutures

Jack Morgenstein (1):
      mlx4_core: Reduce warning message for SRQ_LIMIT event to debug level

Mike Marciniszyn (2):
      IB/ipath: Correct ipath_verbs_register_sysfs() error handling
      IB/qib: Correct qib_verbs_register_sysfs() error handling

Or Gerlitz (2):
      IB/iser: Return error to upper layers on EAGAIN registration failures
      IB/iser: Add support for iser CM REQ additional info

Roi Dayan (2):
      IB/iser: Add module version
      IB/iser: Move informational messages from error to info level

Roland Dreier (1):
      Merge branches 'cxgb4', 'ipoib', 'iser', 'misc', 'mlx4', 'qib' and 'srp' into for-next

Shlomo Pongratz (3):
      IB/core: Verify that QP handler is valid before dispatching events
      mlx4_core: Implement SRQ object lookup from srqn
      IB/mlx4: Fetch XRC SRQ in the CQ polling code

Steve Wise (1):
      RDMA/iwcm: Don't touch cmid after dropping reference

Thadeu Lima de Souza Cascardo (1):
      RDMA/cxgb4: Fix SQ allocation when on-chip SQ is disabled

 drivers/infiniband/core/iwcm.c                  |   2 +
 drivers/infiniband/core/verbs.c                 |   3 +-
 drivers/infiniband/hw/cxgb3/cxio_resource.c     |   4 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c     |   2 +-
 drivers/infiniband/hw/cxgb4/id_table.c          |   4 +-
 drivers/infiniband/hw/cxgb4/qp.c                |  25 ++---
 drivers/infiniband/hw/ipath/ipath_verbs.c       |  19 ++--
 drivers/infiniband/hw/mlx4/cq.c                 |  21 +++++
 drivers/infiniband/hw/mlx4/mad.c                |   2 +-
 drivers/infiniband/hw/mlx4/qp.c                 |   6 ++
 drivers/infiniband/hw/qib/qib_sysfs.c           |   6 +-
 drivers/infiniband/hw/qib/qib_verbs.c           |   3 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c         |   2 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c       |   2 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c        |  24 ++---
 drivers/infiniband/ulp/iser/iscsi_iser.h        |  24 ++++-
 drivers/infiniband/ulp/iser/iser_memory.c       |   3 +-
 drivers/infiniband/ulp/iser/iser_verbs.c        |  36 ++++---
 drivers/infiniband/ulp/srpt/ib_srpt.c           |   2 +-
 drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |   2 +-
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c  |  16 ++--
 drivers/net/ethernet/mellanox/mlx4/eq.c         |   4 +-
 drivers/net/ethernet/mellanox/mlx4/mcg.c        | 120 +++++++++++++++---------
 drivers/net/ethernet/mellanox/mlx4/mlx4.h       |  79 ----------------
 drivers/net/ethernet/mellanox/mlx4/srq.c        |  15 +++
 include/linux/mlx4/device.h                     | 104 ++++++++++++++++++--
 include/linux/mlx4/srq.h                        |   2 +
 27 files changed, 328 insertions(+), 204 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2013-03-25 16:42 Roland Dreier
@ 2013-04-05 15:56 ` David Woodhouse
  0 siblings, 0 replies; 223+ messages in thread
From: David Woodhouse @ 2013-04-05 15:56 UTC (permalink / raw)
  To: Roland Dreier, Vinit Agnihotri, Dean Luick, Mike Marciniszyn
  Cc: Linus Torvalds, linux-kernel, linux-rdma

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

On Mon, 2013-03-25 at 09:42 -0700, Roland Dreier wrote:
> Hi Linus,
> 
> Please pull from
> 
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

> Vinit Agnihotri (1):
>       IB/qib: change QLogic to Intel

>  firmware/Makefile                         | 2 +-
>  firmware/{qlogic => intel}/sd7220.fw.ihex | 0

This is an ABI change, and it's wrong. Moving the firmware from one
location to another breaks drivers which look for it in one place when
it is actually in the other.

Besides, the firmware/ directory of the kernel is deprecated and very
few people actually use it. I don't think *any* distributions do
anything other than ignore its contents, or have done for some years.
Any changes need to be made in the separate linux-firmware repository.
I don't recall seeing this change being submitted there, and if it *was*
it would have been rejected on the basis that it breaks old kernels.
Unless we *duplicate* the file in both qlogic/ and intel/ directories,
but that's just silly.

We already have a *bunch* of other firmwares in the qlogic/ directory
which nobody seems interested in moving. There is no point in this
marketing-driven revisionism; please leave this one where it is too.

Please revert this part of commit e2eed58b4 before 3.9. Thanks.

-- 
dwmw2

[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 6171 bytes --]

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

* [GIT PULL] please pull infiniband.git
@ 2013-03-25 16:42 Roland Dreier
  2013-04-05 15:56 ` David Woodhouse
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2013-03-25 16:42 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Small batch of InfiniBand/RDMA fixes for 3.9:

 - Fix for TX lockup in IPoIB
 - QLogic -> Intel update for qib driver
 - Small static checker fix for qib
 - Fix error path return value in cxgb4

----------------------------------------------------------------
Dan Carpenter (1):
      IB/ipath: Silence a static checker warning

Mike Marciniszyn (1):
      IPoIB: Fix send lockup due to missed TX completion

Roland Dreier (1):
      Merge branches 'cxgb4', 'ipoib' and 'qib' into for-next

Vinit Agnihotri (1):
      IB/qib: change QLogic to Intel

Wei Yongjun (1):
      RDMA/cxgb4: Fix error return code in create_qp()

 drivers/infiniband/hw/cxgb4/qp.c          | 4 +++-
 drivers/infiniband/hw/ipath/ipath_verbs.c | 2 +-
 drivers/infiniband/hw/qib/Kconfig         | 6 +++---
 drivers/infiniband/hw/qib/qib_driver.c    | 5 +++--
 drivers/infiniband/hw/qib/qib_iba6120.c   | 3 ++-
 drivers/infiniband/hw/qib/qib_init.c      | 8 ++++----
 drivers/infiniband/hw/qib/qib_sd7220.c    | 4 ++--
 drivers/infiniband/hw/qib/qib_verbs.c     | 4 ++--
 drivers/infiniband/ulp/ipoib/ipoib_cm.c   | 8 ++++++--
 firmware/Makefile                         | 2 +-
 firmware/{qlogic => intel}/sd7220.fw.ihex | 0
 11 files changed, 27 insertions(+), 19 deletions(-)
 rename firmware/{qlogic => intel}/sd7220.fw.ihex (100%)

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

* [GIT PULL] please pull infiniband.git
@ 2013-02-26 17:41 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-02-26 17:41 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Main batch of InfiniBand/RDMA changes for 3.9:
 - SRP error handling fixes from Bart Van Assche
 - Implementation of memory windows for mlx4 from Shani Michaeli
 - Lots of cxgb4 HW driver fixes from Vipul Pandya
 - Make iSER work for virtual functions, other fixes from Or Gerlitz
 - Fix for bug in qib HW driver from Mike Marciniszyn
 - IPoIB fixes from me, Itai Garbi, Shlomo Pongratz, Yan Burman
 - Various cleanups and warning fixes from Julia Lawall, Paul Bolle, Wei Yongjun

----------------------------------------------------------------
Bart Van Assche (4):
      IB/srp: Track connection state properly
      IB/srp: Avoid sending a task management function needlessly
      IB/srp: Avoid endless SCSI error handling loop
      IB/srp: Fail I/O requests if the transport is offline

Dan Carpenter (1):
      IB/mlx4: Fix bug unwinding on error in mlx4_ib_init_sriov()

Itai Garbi (1):
      IPoIB: Don't attempt to release resources on error flow

Julia Lawall (1):
      IB/mlx4: Adjust duplicate test

Mike Marciniszyn (1):
      IB/qib: Fix QP locate/remove race

Or Gerlitz (3):
      IB/iser: Use proper define for the commands per LUN value advertised to SCSI ML
      IB/iser: Avoid error prints on EAGAIN registration failures
      IB/iser: Enable iser when FMRs are not supported

Paul Bolle (2):
      RDMA/cxgb4: "cookie" can stay in host endianness
      IB/mlx4: Fix compiler warning about uninitialized 'vlan' variable

Roland Dreier (3):
      IB/mlx4: Convert is_xxx variables in build_mlx_header() to bool
      IPoIB: Free ipoib neigh on path record failure so path rec queries are retried
      Merge branches 'core', 'cxgb4', 'ipoib', 'iser', 'misc', 'mlx4', 'qib' and 'srp' into for-next

Shani Michaeli (10):
      IB/mlx4_ib: Remove local invalidate segment unused fields
      mlx4_core: Rename MPT-related functions to have mpt_ prefix
      mlx4_core: Propagate MR deregistration failures to caller
      IB/core: Add "type 2" memory windows support
      IB/uverbs: Implement memory windows support in uverbs
      mlx4_core: Disable memory windows for virtual functions
      mlx4_core: Enable memory windows in {INIT, QUERY}_HCA
      mlx4: Implement memory windows allocation and deallocation
      IB/mlx4: Support memory window binding
      IB/mlx4: Advertise MW support

Shlomo Pongratz (1):
      IPoIB: Fix ipoib_neigh hashing to use the correct daddr octets

Stefan Hasko (1):
      RDMA/cxgb4: Fix cast warning

Syam Sidhardhan (1):
      IB/mlx4: Remove redundant NULL check before kfree

Vipul Pandya (11):
      RDMA/cxgb4: Abort connections that receive unexpected streaming mode data
      RDMA/cxgb4: Abort connections when moving to ERROR state
      RDMA/cxgb4: Display streaming mode error only if detected in RTS
      RDMA/cxgb4: Keep QP referenced until TID released
      RDMA/cxgb4: Always log async errors
      RDMA/cxgb4: Only log rx_data warnings if cpl status is non-zero
      RDMA/cxgb4: Fix endpoint timeout race condition
      RDMA/cxgb4: Don't reconnect on abort for mpa_rev 1
      RDMA/cxgb4: Don't wakeup threads for MPAv2
      RDMA/cxgb4: Insert hwtid in pass_accept_req instead in pass_establish
      RDMA/cxgb4: Address sparse warnings

Wei Yongjun (1):
      RDMA/amso1100: Use module_pci_driver() to simplify the code

Yan Burman (1):
      IPoIB: Add version and firmware info to ethtool reporting

 drivers/infiniband/core/uverbs.h                   |   2 +
 drivers/infiniband/core/uverbs_cmd.c               | 121 ++++++++++++++
 drivers/infiniband/core/uverbs_main.c              |  13 +-
 drivers/infiniband/core/verbs.c                    |   5 +-
 drivers/infiniband/hw/amso1100/c2.c                |  13 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c        |   5 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c              |  15 +-
 drivers/infiniband/hw/cxgb4/cm.c                   | 170 +++++++++++--------
 drivers/infiniband/hw/cxgb4/device.c               |   5 +-
 drivers/infiniband/hw/cxgb4/ev.c                   |   8 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h             |   4 +-
 drivers/infiniband/hw/cxgb4/mem.c                  |   5 +-
 drivers/infiniband/hw/cxgb4/qp.c                   |   1 +
 drivers/infiniband/hw/ehca/ehca_iverbs.h           |   2 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c             |   5 +-
 drivers/infiniband/hw/mlx4/mad.c                   |   7 +-
 drivers/infiniband/hw/mlx4/main.c                  |  22 ++-
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |  18 +-
 drivers/infiniband/hw/mlx4/mr.c                    |  87 +++++++++-
 drivers/infiniband/hw/mlx4/qp.c                    |  49 ++++--
 drivers/infiniband/hw/mlx4/sysfs.c                 |   2 +-
 drivers/infiniband/hw/nes/nes_verbs.c              |  19 ++-
 drivers/infiniband/hw/qib/qib_qp.c                 |   5 +-
 drivers/infiniband/ulp/ipoib/ipoib.h               |   4 +
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c       |  19 ++-
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |  14 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h           |   2 +-
 drivers/infiniband/ulp/iser/iser_memory.c          |   9 +-
 drivers/infiniband/ulp/iser/iser_verbs.c           |   8 +-
 drivers/infiniband/ulp/srp/ib_srp.c                |  42 +++--
 drivers/infiniband/ulp/srp/ib_srp.h                |   1 +
 drivers/net/ethernet/mellanox/mlx4/en_main.c       |   4 +-
 drivers/net/ethernet/mellanox/mlx4/fw.c            |  14 +-
 drivers/net/ethernet/mellanox/mlx4/fw.h            |   1 +
 drivers/net/ethernet/mellanox/mlx4/main.c          |   4 +
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |  34 +++-
 drivers/net/ethernet/mellanox/mlx4/mr.c            | 186 ++++++++++++++++-----
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |  63 ++++++-
 include/linux/mlx4/device.h                        |  22 ++-
 include/linux/mlx4/qp.h                            |  19 ++-
 include/rdma/ib_verbs.h                            |  73 +++++++-
 include/uapi/rdma/ib_user_verbs.h                  |  16 ++
 net/sunrpc/xprtrdma/verbs.c                        |  20 +--
 43 files changed, 885 insertions(+), 253 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2013-02-07  1:15 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2013-02-07  1:15 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

IB regression fixes for 3.8:
 - Fix mlx4 VFs not working on old guests because of 64B CQE changes
 - Fix ill-considered sparse fix for qib
 - Fix IPoIB crash due to skb double destruct introduced in 3.8-rc1

----------------------------------------------------------------
Mike Marciniszyn (1):
      IB/qib: Fix for broken sparse warning fix

Or Gerlitz (1):
      mlx4_core: Fix advertisement of wrong PF context behaviour

Roland Dreier (1):
      Merge branches 'ipoib', 'mlx4' and 'qib' into for-next

Shlomo Pongratz (1):
      IPoIB: Fix crash due to skb double destruct

 drivers/infiniband/hw/qib/qib_qp.c        | 11 +++--------
 drivers/infiniband/ulp/ipoib/ipoib_cm.c   |  6 +++---
 drivers/infiniband/ulp/ipoib/ipoib_ib.c   |  6 +++---
 drivers/net/ethernet/mellanox/mlx4/main.c |  2 +-
 4 files changed, 10 insertions(+), 15 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-12-21 21:42 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-12-21 21:42 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Second batch of InfiniBand/RDMA changes for 3.8:
 - cxgb4 changes to fix lookup engine hash collisions
 - mlx4 changes to make flow steering usable
 - fix to IPoIB to avoid pinning dst reference for too long

----------------------------------------------------------------
Hadar Hen Zion (2):
      mlx4_core: Add QPN enforcement for flow steering rules set by VFs
      mlx4_core: Fix error flow in the flow steering wrapper

Jack Morgenstein (2):
      mlx4_core: Adjustments to Flow Steering activation logic for SR-IOV
      mlx4_core: Allow choosing flow steering mode

Roland Dreier (2):
      IPoIB: Call skb_dst_drop() once skb is enqueued for sending
      Merge branches 'cxgb4', 'ipoib' and 'mlx4' into for-next

Vipul Pandya (5):
      cxgb4: Add T4 filter support
      cxgb4: Add LE hash collision bug fix path in LLD driver
      RDMA/cxgb4: Fix LE hash collision bug for active open connection
      RDMA/cxgb4: Fix LE hash collision bug for passive open connection
      RDMA/cxgb4: Fix bug for active and passive LE hash collision path

 drivers/infiniband/hw/cxgb4/cm.c                   | 791 ++++++++++++++++++---
 drivers/infiniband/hw/cxgb4/device.c               | 210 +++++-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h             |  33 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c            |   3 +
 drivers/infiniband/ulp/ipoib/ipoib_ib.c            |   3 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h         | 136 ++++
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c    | 459 +++++++++++-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h     |  23 +-
 drivers/net/ethernet/chelsio/cxgb4/l2t.c           |  32 +
 drivers/net/ethernet/chelsio/cxgb4/l2t.h           |   3 +
 drivers/net/ethernet/chelsio/cxgb4/t4_hw.c         |  22 +-
 drivers/net/ethernet/chelsio/cxgb4/t4_msg.h        |  66 ++
 drivers/net/ethernet/chelsio/cxgb4/t4_regs.h       |  37 +
 drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h      | 418 +++++++++++
 drivers/net/ethernet/mellanox/mlx4/fw.c            |  15 +-
 drivers/net/ethernet/mellanox/mlx4/fw.h            |   1 +
 drivers/net/ethernet/mellanox/mlx4/main.c          | 115 ++-
 drivers/net/ethernet/mellanox/mlx4/mcg.c           |   7 +-
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |   6 +-
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |  28 +-
 drivers/scsi/csiostor/t4fw_api_stor.h              |  39 -
 include/linux/mlx4/device.h                        |   1 +
 22 files changed, 2234 insertions(+), 214 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2012-12-14 15:36   ` Linus Torvalds
@ 2012-12-14 23:57     ` Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-12-14 23:57 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: LKML, linux-rdma

On Fri, Dec 14, 2012 at 7:36 AM, Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>> Any problem with this tree, or did it just slip through the cracks?
>
> It was merged seven hours before your email. Forgot to check?

No, just dumb-assery in how I fetched in one place and checked in
another.  Sorry.

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

* Re: [GIT PULL] please pull infiniband.git
  2012-12-14  9:56 ` Roland Dreier
@ 2012-12-14 15:36   ` Linus Torvalds
  2012-12-14 23:57     ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Linus Torvalds @ 2012-12-14 15:36 UTC (permalink / raw)
  To: Roland Dreier; +Cc: LKML, linux-rdma

On Fri, Dec 14, 2012 at 1:56 AM, Roland Dreier <roland@kernel.org> wrote:
>
> Any problem with this tree, or did it just slip through the cracks?

It was merged seven hours before your email. Forgot to check?

          Linus

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

* Re: [GIT PULL] please pull infiniband.git
  2012-12-11  5:59 Roland Dreier
@ 2012-12-14  9:56 ` Roland Dreier
  2012-12-14 15:36   ` Linus Torvalds
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2012-12-14  9:56 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: LKML, linux-rdma

On Mon, Dec 10, 2012 at 9:59 PM, Roland Dreier <roland@kernel.org> wrote:
> Hi Linus,
>
> Please pull from
>
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

Hi Linus,

Any problem with this tree, or did it just slip through the cracks?

Thanks,
  Roland

> ----------------------------------------------------------------
>
> First batch of InfiniBand/RDMA changes for the 3.8 merge window:
>  - A good chunk of Bart Van Assche's SRP fixes
>  - UAPI disintegration from David Howells
>  - mlx4 support for "64-byte CQE" hardware feature from Or Gerlitz
>  - Other miscellaneous fixes
>
> ----------------------------------------------------------------
> Alan Cox (2):
>       IB/ipath: Remove unreachable code
>       RDMA/amsol1100: Fix missing break
>
> Bart Van Assche (14):
>       IB/srp: Increase block layer timeout
>       IB/srp: Eliminate state SRP_TARGET_CONNECTING
>       IB/srp: Keep processing commands during host removal
>       IB/srp: Simplify SCSI error handling
>       IB/srp: Introduce srp_handle_qp_err()
>       IB/srp: Process all error completions
>       IB/srp: Suppress superfluous error messages
>       IB/srp: Introduce the helper function srp_remove_target()
>       IB/srp: Eliminate state SRP_TARGET_DEAD
>       IB/srp: Document sysfs attributes
>       srp_transport: Fix attribute registration
>       srp_transport: Simplify attribute initialization code
>       srp_transport: Document sysfs attributes
>       IB/srp: Allow SRP disconnect through sysfs
>
> David Howells (1):
>       UAPI: (Scripted) Disintegrate include/rdma
>
> Ishai Rabinovitz (1):
>       IB/srp: destroy and recreate QP and CQs when reconnecting
>
> Jack Morgenstein (2):
>       IB/mlx4: Fix spinlock order to avoid lockdep warnings
>       mlx4_core: Fix potential deadlock in mlx4_eq_int()
>
> Julia Lawall (3):
>       RDMA/nes: Use WARN()
>       RDMA/cxgb4: use WARN
>       RDMA/cxgb3: use WARN
>
> Or Gerlitz (1):
>       mlx4: 64-byte CQE/EQE support
>
> Roland Dreier (4):
>       Merge branches 'cxgb4', 'misc', 'mlx4', 'nes' and 'uapi' into for-next
>       Merge branches 'cma' and 'mlx4' into for-next
>       Merge branch 'srp' into for-next
>       Merge branch 'nes' into for-next
>
> Tatyana Nikolova (7):
>       RDMA/nes: Fix incorrect address of IP header
>       RDMA/nes: Fix for unlinking skbs from empty list
>       RDMA/nes: Fix for sending fpdus in order to hardware
>       RDMA/nes: Fix for incorrect multicast address in the perfect filter table
>       RDMA/nes: Fix for BUG_ON due to adding already-pending timer
>       RDMA/nes: Fix for terminate timer crash
>       RDMA/nes: Fix for crash when registering zero length MR for CQ
>
> Vu Pham (1):
>       IB/srp: send disconnect request without waiting for CM timewait exit
>
> shefty (1):
>       RDMA/cm: Change return value from find_gid_port()
>
>  Documentation/ABI/stable/sysfs-driver-ib_srp   |  156 ++++++++++++
>  Documentation/ABI/stable/sysfs-transport-srp   |   19 ++
>  drivers/infiniband/core/cma.c                  |    9 +-
>  drivers/infiniband/hw/amso1100/c2_ae.c         |    1 +
>  drivers/infiniband/hw/cxgb3/iwch_cm.c          |    6 +-
>  drivers/infiniband/hw/cxgb4/cm.c               |    6 +-
>  drivers/infiniband/hw/ipath/ipath_init_chip.c  |   10 -
>  drivers/infiniband/hw/mlx4/cm.c                |    4 +-
>  drivers/infiniband/hw/mlx4/cq.c                |   34 ++-
>  drivers/infiniband/hw/mlx4/main.c              |   27 +-
>  drivers/infiniband/hw/mlx4/mlx4_ib.h           |    1 +
>  drivers/infiniband/hw/mlx4/user.h              |   12 +-
>  drivers/infiniband/hw/nes/nes.h                |    1 +
>  drivers/infiniband/hw/nes/nes_cm.c             |   32 +--
>  drivers/infiniband/hw/nes/nes_hw.c             |    9 +-
>  drivers/infiniband/hw/nes/nes_mgt.c            |   42 ++--
>  drivers/infiniband/hw/nes/nes_nic.c            |   13 +-
>  drivers/infiniband/hw/nes/nes_verbs.c          |    9 +-
>  drivers/infiniband/ulp/srp/ib_srp.c            |  314 ++++++++++++++----------
>  drivers/infiniband/ulp/srp/ib_srp.h            |   11 +-
>  drivers/net/ethernet/mellanox/mlx4/cmd.c       |   11 +-
>  drivers/net/ethernet/mellanox/mlx4/en_cq.c     |    2 +-
>  drivers/net/ethernet/mellanox/mlx4/en_netdev.c |    1 +
>  drivers/net/ethernet/mellanox/mlx4/en_rx.c     |    5 +-
>  drivers/net/ethernet/mellanox/mlx4/en_tx.c     |    5 +-
>  drivers/net/ethernet/mellanox/mlx4/eq.c        |   36 ++-
>  drivers/net/ethernet/mellanox/mlx4/fw.c        |   30 ++-
>  drivers/net/ethernet/mellanox/mlx4/fw.h        |    1 +
>  drivers/net/ethernet/mellanox/mlx4/main.c      |   38 ++-
>  drivers/net/ethernet/mellanox/mlx4/mlx4_en.h   |    1 +
>  drivers/scsi/scsi_transport_srp.c              |   51 ++--
>  include/linux/mlx4/device.h                    |   21 ++
>  include/rdma/Kbuild                            |    6 -
>  include/rdma/rdma_netlink.h                    |   36 +--
>  include/scsi/scsi_transport_srp.h              |    8 +
>  include/uapi/rdma/Kbuild                       |    6 +
>  include/{ => uapi}/rdma/ib_user_cm.h           |    0
>  include/{ => uapi}/rdma/ib_user_mad.h          |    0
>  include/{ => uapi}/rdma/ib_user_sa.h           |    0
>  include/{ => uapi}/rdma/ib_user_verbs.h        |    0
>  include/uapi/rdma/rdma_netlink.h               |   37 +++
>  include/{ => uapi}/rdma/rdma_user_cm.h         |    0
>  42 files changed, 689 insertions(+), 322 deletions(-)
>  create mode 100644 Documentation/ABI/stable/sysfs-driver-ib_srp
>  create mode 100644 Documentation/ABI/stable/sysfs-transport-srp
>  rename include/{ => uapi}/rdma/ib_user_cm.h (100%)
>  rename include/{ => uapi}/rdma/ib_user_mad.h (100%)
>  rename include/{ => uapi}/rdma/ib_user_sa.h (100%)
>  rename include/{ => uapi}/rdma/ib_user_verbs.h (100%)
>  create mode 100644 include/uapi/rdma/rdma_netlink.h
>  rename include/{ => uapi}/rdma/rdma_user_cm.h (100%)

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

* [GIT PULL] please pull infiniband.git
@ 2012-12-11  5:59 Roland Dreier
  2012-12-14  9:56 ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2012-12-11  5:59 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

First batch of InfiniBand/RDMA changes for the 3.8 merge window:
 - A good chunk of Bart Van Assche's SRP fixes
 - UAPI disintegration from David Howells
 - mlx4 support for "64-byte CQE" hardware feature from Or Gerlitz
 - Other miscellaneous fixes

----------------------------------------------------------------
Alan Cox (2):
      IB/ipath: Remove unreachable code
      RDMA/amsol1100: Fix missing break

Bart Van Assche (14):
      IB/srp: Increase block layer timeout
      IB/srp: Eliminate state SRP_TARGET_CONNECTING
      IB/srp: Keep processing commands during host removal
      IB/srp: Simplify SCSI error handling
      IB/srp: Introduce srp_handle_qp_err()
      IB/srp: Process all error completions
      IB/srp: Suppress superfluous error messages
      IB/srp: Introduce the helper function srp_remove_target()
      IB/srp: Eliminate state SRP_TARGET_DEAD
      IB/srp: Document sysfs attributes
      srp_transport: Fix attribute registration
      srp_transport: Simplify attribute initialization code
      srp_transport: Document sysfs attributes
      IB/srp: Allow SRP disconnect through sysfs

David Howells (1):
      UAPI: (Scripted) Disintegrate include/rdma

Ishai Rabinovitz (1):
      IB/srp: destroy and recreate QP and CQs when reconnecting

Jack Morgenstein (2):
      IB/mlx4: Fix spinlock order to avoid lockdep warnings
      mlx4_core: Fix potential deadlock in mlx4_eq_int()

Julia Lawall (3):
      RDMA/nes: Use WARN()
      RDMA/cxgb4: use WARN
      RDMA/cxgb3: use WARN

Or Gerlitz (1):
      mlx4: 64-byte CQE/EQE support

Roland Dreier (4):
      Merge branches 'cxgb4', 'misc', 'mlx4', 'nes' and 'uapi' into for-next
      Merge branches 'cma' and 'mlx4' into for-next
      Merge branch 'srp' into for-next
      Merge branch 'nes' into for-next

Tatyana Nikolova (7):
      RDMA/nes: Fix incorrect address of IP header
      RDMA/nes: Fix for unlinking skbs from empty list
      RDMA/nes: Fix for sending fpdus in order to hardware
      RDMA/nes: Fix for incorrect multicast address in the perfect filter table
      RDMA/nes: Fix for BUG_ON due to adding already-pending timer
      RDMA/nes: Fix for terminate timer crash
      RDMA/nes: Fix for crash when registering zero length MR for CQ

Vu Pham (1):
      IB/srp: send disconnect request without waiting for CM timewait exit

shefty (1):
      RDMA/cm: Change return value from find_gid_port()

 Documentation/ABI/stable/sysfs-driver-ib_srp   |  156 ++++++++++++
 Documentation/ABI/stable/sysfs-transport-srp   |   19 ++
 drivers/infiniband/core/cma.c                  |    9 +-
 drivers/infiniband/hw/amso1100/c2_ae.c         |    1 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |    6 +-
 drivers/infiniband/hw/cxgb4/cm.c               |    6 +-
 drivers/infiniband/hw/ipath/ipath_init_chip.c  |   10 -
 drivers/infiniband/hw/mlx4/cm.c                |    4 +-
 drivers/infiniband/hw/mlx4/cq.c                |   34 ++-
 drivers/infiniband/hw/mlx4/main.c              |   27 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h           |    1 +
 drivers/infiniband/hw/mlx4/user.h              |   12 +-
 drivers/infiniband/hw/nes/nes.h                |    1 +
 drivers/infiniband/hw/nes/nes_cm.c             |   32 +--
 drivers/infiniband/hw/nes/nes_hw.c             |    9 +-
 drivers/infiniband/hw/nes/nes_mgt.c            |   42 ++--
 drivers/infiniband/hw/nes/nes_nic.c            |   13 +-
 drivers/infiniband/hw/nes/nes_verbs.c          |    9 +-
 drivers/infiniband/ulp/srp/ib_srp.c            |  314 ++++++++++++++----------
 drivers/infiniband/ulp/srp/ib_srp.h            |   11 +-
 drivers/net/ethernet/mellanox/mlx4/cmd.c       |   11 +-
 drivers/net/ethernet/mellanox/mlx4/en_cq.c     |    2 +-
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c |    1 +
 drivers/net/ethernet/mellanox/mlx4/en_rx.c     |    5 +-
 drivers/net/ethernet/mellanox/mlx4/en_tx.c     |    5 +-
 drivers/net/ethernet/mellanox/mlx4/eq.c        |   36 ++-
 drivers/net/ethernet/mellanox/mlx4/fw.c        |   30 ++-
 drivers/net/ethernet/mellanox/mlx4/fw.h        |    1 +
 drivers/net/ethernet/mellanox/mlx4/main.c      |   38 ++-
 drivers/net/ethernet/mellanox/mlx4/mlx4_en.h   |    1 +
 drivers/scsi/scsi_transport_srp.c              |   51 ++--
 include/linux/mlx4/device.h                    |   21 ++
 include/rdma/Kbuild                            |    6 -
 include/rdma/rdma_netlink.h                    |   36 +--
 include/scsi/scsi_transport_srp.h              |    8 +
 include/uapi/rdma/Kbuild                       |    6 +
 include/{ => uapi}/rdma/ib_user_cm.h           |    0
 include/{ => uapi}/rdma/ib_user_mad.h          |    0
 include/{ => uapi}/rdma/ib_user_sa.h           |    0
 include/{ => uapi}/rdma/ib_user_verbs.h        |    0
 include/uapi/rdma/rdma_netlink.h               |   37 +++
 include/{ => uapi}/rdma/rdma_user_cm.h         |    0
 42 files changed, 689 insertions(+), 322 deletions(-)
 create mode 100644 Documentation/ABI/stable/sysfs-driver-ib_srp
 create mode 100644 Documentation/ABI/stable/sysfs-transport-srp
 rename include/{ => uapi}/rdma/ib_user_cm.h (100%)
 rename include/{ => uapi}/rdma/ib_user_mad.h (100%)
 rename include/{ => uapi}/rdma/ib_user_sa.h (100%)
 rename include/{ => uapi}/rdma/ib_user_verbs.h (100%)
 create mode 100644 include/uapi/rdma/rdma_netlink.h
 rename include/{ => uapi}/rdma/rdma_user_cm.h (100%)

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

* [GIT PULL] please pull infiniband.git
@ 2012-10-26 19:55 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-10-26 19:55 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Small batch of fixes for 3.7:
 - Fix crash in error path in cxgb4
 - Fix build error on 32 bits in mlx4
 - Fix SR-IOV bugs in mlx4

----------------------------------------------------------------
Dotan Barak (1):
      mlx4_core: Perform correct resource cleanup if mlx4_QUERY_ADAPTER() fails

Doug Ledford (1):
      IB/mlx4: Fix build error on platforms where UL is not 64 bits

Eli Cohen (1):
      IB/mlx4: Synchronize cleanup of MCGs in MCG paravirtualization

Jack Morgenstein (1):
      IB/mlx4: Fix QP1 P_Key processing in the Primary Physical Function (PPF)

Or Gerlitz (1):
      mlx4_core: Remove annoying debug messages from SR-IOV flow

Roland Dreier (1):
      Merge branches 'cxgb4' and 'mlx4' into for-next

Thadeu Lima de Souza Cascardo (1):
      RDMA/cxgb4: Don't free chunk that we have failed to allocate

 drivers/infiniband/hw/cxgb4/mem.c                  |    2 +-
 drivers/infiniband/hw/mlx4/alias_GUID.c            |    2 +-
 drivers/infiniband/hw/mlx4/mad.c                   |   85 +++++++++-----------
 drivers/infiniband/hw/mlx4/mcg.c                   |   18 +++--
 drivers/net/ethernet/mellanox/mlx4/eq.c            |    6 --
 drivers/net/ethernet/mellanox/mlx4/main.c          |    5 +-
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |    6 --
 7 files changed, 56 insertions(+), 68 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-10-05  2:20 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-10-05  2:20 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Second batch of changes for the 3.7 merge window:
 - Late-breaking fix for IPoIB on mlx4 SR-IOV VFs.
 - Fix for IPoIB build breakage with CONFIG_INFINIBAND_IPOIB_CM=n
   (new netlink config changes are to blame).
 - Make sure retry count values are in range in RDMA CM.
 - A few nes hardware driver fixes and cleanups.
 - Have iSER initiator use >1 interrupt vectors if available.

----------------------------------------------------------------
Alex Tabachnik (1):
      IB/iser: Add more RX CQs to scale out processing of SCSI responses

Jack Morgenstein (1):
      mlx4_core: Adjust flow steering attach wrapper so that IB works on SR-IOV VFs

Roland Dreier (2):
      IPoIB: Fix build with CONFIG_INFINIBAND_IPOIB_CM=n
      Merge branches 'cma', 'ipoib', 'iser', 'mlx4' and 'nes' into for-next

Sean Hefty (1):
      RDMA/cma: Check that retry count values are in range

Tatyana Nikolova (4):
      RDMA/nes: Add missing break to switch.
      RDMA/nes: Remove unnecessary if-else statement
      RDMA/nes: Remove unused module parameter "send_first"
      RDMA/nes: Bump the version number of nes driver

 drivers/infiniband/core/cma.c                      |    6 +-
 drivers/infiniband/hw/nes/nes.c                    |    5 -
 drivers/infiniband/hw/nes/nes.h                    |    3 +-
 drivers/infiniband/hw/nes/nes_verbs.c              |   16 +--
 drivers/infiniband/ulp/ipoib/ipoib.h               |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c            |   31 -----
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |   31 +++++
 drivers/infiniband/ulp/iser/iscsi_iser.h           |   17 ++-
 drivers/infiniband/ulp/iser/iser_verbs.c           |  130 ++++++++++++++------
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |    2 +
 10 files changed, 146 insertions(+), 99 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-10-02 16:08 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-10-02 16:08 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

First batch of InfiniBand/RDMA changes for the 3.7 merge window:
 - mlx4 IB support for SR-IOV
 - A couple of SRP initiator fixes
 - Batch of nes hardware driver fixes
 - Fix for long-standing use-after-free crash in IPoIB
 - Other miscellaneous fixes

----------------------------------------------------------------
Amir Vadai (1):
      IB/mlx4: Add CM paravirtualization

Bart Van Assche (2):
      IB/srp: Fix use-after-free in srp_reset_req()
      IB/srp: Avoid having aborted requests hang

Dean Luick (1):
      IB/qib: Add a qib driver version

Dotan Barak (4):
      IB/core: Remove unused variables in ucm/ucma
      RDMA/cma: Use consistent component mask for IPoIB port space multicast joins
      IB/mlx4: Fill in sq_sig_type in query QP
      mlx4_core: Fix wrong offset in parsing query device caps response

Emil Goode (1):
      RDMA/cxgb4: Fix error handling in create_qp()

Jack Morgenstein (20):
      IB/core: Reserve bits in enum ib_qp_create_flags for low-level driver use
      IB/core: Handle table with full and partial membership for the same P_Key
      IB/core: Add ib_find_exact_cached_pkey()
      IB/mlx4: SR-IOV IB context objects and proxy/tunnel SQP support
      mlx4_core: Add proxy and tunnel QPs to the reserved QP area
      IB/mlx4: Initialize SR-IOV IB support for slaves in master context
      mlx4: Implement QP paravirtualization and maintain phys_pkey_cache for smp_snoop
      IB/mlx4: SR-IOV multiplex and demultiplex MADs
      mlx4: MAD_IFC paravirtualization
      mlx4_core: Add IB port-state machine and port mgmt event propagation
      mlx4: Add alias_guid mechanism
      IB/mlx4: Propagate P_Key and guid change port management events to slaves
      IB/mlx4: Add iov directory in sysfs under the ib device
      net/mlx4_core: Adjustments to SET_PORT for IB SR-IOV
      mlx4_core: INIT/CLOSE port logic for IB ports in SR-IOV mode
      IB/mlx4: Miscellaneous adjustments for SR-IOV IB support
      mlx4: Activate SR-IOV mode for IB
      mlx4: Paravirtualize Node Guids for slaves
      mlx4: Modify proxy/tunnel QP mechanism so that guests do no calculations
      IB/mlx4: Create paravirt contexts for VFs when master IB driver initializes

Mike Marciniszyn (1):
      IB/qib: Fix local access validation for user MRs

Or Gerlitz (1):
      mlx4_core: Remove annoying debug message in the resource tracker

Oren Duer (1):
      IB/mlx4: Add multicast group (MCG) paravirtualization for SR-IOV

Patrick McHardy (1):
      IPoIB: Fix use-after-free of multicast object

Roland Dreier (7):
      mlx4_core: Trivial readability fix: "0X30" -> "0x30"
      mlx4_core: Trivial cleanups to driver log messages
      mlx4_core: Fix crash on uninitialized priv->cmd.slave_sem
      mlx4_core: Stash PCI ID driver_data in mlx4_priv structure
      mlx4_core: Clean up enabling of SENSE_PORT for older (ConnectX-1/-2) HCAs
      mlx4_core: Disable SENSE_PORT for multifunction devices
      Merge branches 'cma', 'cxgb4', 'ipoib', 'mlx4', 'mlx4-sriov', 'nes', 'qib' and 'srp' into for-linus

Tatyana Nikolova (6):
      RDMA/nes: Fix incorrect resolving of the loopback MAC address
      RDMA/nes: Fix for incorrect MSS when TSO is on
      RDMA/nes: Cosmetic changes
      RDMA/nes: Fix for crash when TX checksum offload is off
      RDMA/nes: Print hardware resource type
      RDMA/nes: Fix compilation error when nes_debug is enabled

 drivers/infiniband/core/cache.c                    |   43 +-
 drivers/infiniband/core/cma.c                      |    5 +-
 drivers/infiniband/core/device.c                   |   16 +-
 drivers/infiniband/core/ucm.c                      |    1 -
 drivers/infiniband/core/ucma.c                     |    1 -
 drivers/infiniband/hw/cxgb4/qp.c                   |   62 +-
 drivers/infiniband/hw/mlx4/Makefile                |    2 +-
 drivers/infiniband/hw/mlx4/alias_GUID.c            |  688 +++++++++
 drivers/infiniband/hw/mlx4/cm.c                    |  437 ++++++
 drivers/infiniband/hw/mlx4/cq.c                    |   31 +-
 drivers/infiniband/hw/mlx4/mad.c                   | 1573 +++++++++++++++++++-
 drivers/infiniband/hw/mlx4/main.c                  |  273 +++-
 drivers/infiniband/hw/mlx4/mcg.c                   | 1254 ++++++++++++++++
 drivers/infiniband/hw/mlx4/mlx4_ib.h               |  341 ++++-
 drivers/infiniband/hw/mlx4/qp.c                    |  660 +++++++-
 drivers/infiniband/hw/mlx4/sysfs.c                 |  794 ++++++++++
 drivers/infiniband/hw/nes/nes.h                    |   15 +-
 drivers/infiniband/hw/nes/nes_cm.c                 |   34 +-
 drivers/infiniband/hw/nes/nes_hw.c                 |    4 +-
 drivers/infiniband/hw/nes/nes_nic.c                |   40 +-
 drivers/infiniband/hw/nes/nes_utils.c              |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c              |   14 +-
 drivers/infiniband/hw/qib/qib_common.h             |   14 +-
 drivers/infiniband/hw/qib/qib_driver.c             |    3 +-
 drivers/infiniband/hw/qib/qib_keys.c               |    5 +-
 drivers/infiniband/hw/qib/qib_verbs.c              |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c          |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c     |   19 +-
 drivers/infiniband/ulp/srp/ib_srp.c                |    3 +-
 drivers/net/ethernet/mellanox/mlx4/cmd.c           |  242 ++-
 drivers/net/ethernet/mellanox/mlx4/eq.c            |  245 ++-
 drivers/net/ethernet/mellanox/mlx4/fw.c            |  246 ++-
 drivers/net/ethernet/mellanox/mlx4/fw.h            |   11 +-
 drivers/net/ethernet/mellanox/mlx4/main.c          |  171 ++-
 drivers/net/ethernet/mellanox/mlx4/mlx4.h          |   59 +-
 drivers/net/ethernet/mellanox/mlx4/port.c          |   10 +
 drivers/net/ethernet/mellanox/mlx4/qp.c            |  100 +-
 .../net/ethernet/mellanox/mlx4/resource_tracker.c  |  222 ++-
 include/linux/mlx4/device.h                        |   69 +-
 include/linux/mlx4/driver.h                        |    2 +
 include/linux/mlx4/qp.h                            |    3 +-
 include/rdma/ib_cache.h                            |   16 +
 include/rdma/ib_verbs.h                            |    3 +
 43 files changed, 7289 insertions(+), 448 deletions(-)
 create mode 100644 drivers/infiniband/hw/mlx4/alias_GUID.c
 create mode 100644 drivers/infiniband/hw/mlx4/cm.c
 create mode 100644 drivers/infiniband/hw/mlx4/mcg.c
 create mode 100644 drivers/infiniband/hw/mlx4/sysfs.c

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

* [GIT PULL] please pull infiniband.git
@ 2012-09-17 15:57 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-09-17 15:57 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Last set of InfiniBand/RDMA fixes for 3.6:
 - Couple more IPoIB fixes for regressions introduced by path database conversion
 - Minor other fixes to low-level drivers (cxgb4, mlx4, qib, ocrdma)

----------------------------------------------------------------
Mike Marciniszyn (1):
      IB/qib: Fix failure of compliance test C14-024#06_LocalPortNum

Parav Pandit (1):
      RDMA/ocrdma: Fix CQE expansion of unsignaled WQE

Roland Dreier (1):
      Merge branches 'cxgb4', 'ipoib', 'mlx4', 'ocrdma' and 'qib' into for-next

Shlomo Pongratz (2):
      IPoIB: Fix memory leak in the neigh table deletion flow
      IPoIB: Fix AB-BA deadlock when deleting neighbours

Wei Yongjun (1):
      RDMA/cxgb4: Move dereference below NULL test

Yishai Hadas (1):
      mlx4_core: Fix integer overflows so 8TBs of memory registration works

 drivers/infiniband/hw/cxgb4/cm.c               |    2 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c    |    8 +-
 drivers/infiniband/hw/qib/qib_mad.c            |    3 +-
 drivers/infiniband/ulp/ipoib/ipoib.h           |    5 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   93 +++++++++++-------------
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    2 -
 drivers/net/ethernet/mellanox/mlx4/icm.c       |   30 +++++---
 drivers/net/ethernet/mellanox/mlx4/icm.h       |   10 +--
 8 files changed, 78 insertions(+), 75 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-08-17 18:38 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-08-17 18:38 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------

Grab bag of InfiniBand/RDMA fixes:
 - IPoIB fixes for regressions introduced by path database conversion
 - mlx4 fixes for bugs with large memory systems and regressions from SR-IOV patches
 - RDMA CM fix for passing bad event up to userspace
 - Other minor fixes

----------------------------------------------------------------
Bart Van Assche (1):
      IB/srp: Fix a race condition

Jack Morgenstein (1):
      IB/mlx4: Fix possible deadlock on sm_lock spinlock

Julia Lawall (1):
      IB/qib: Fix error return code in qib_init_7322_variables()

Kleber Sacilotto de Souza (1):
      IB/mlx4: Check iboe netdev pointer before dereferencing it

Masanari Iida (1):
      IB: Fix typos in infiniband drivers

Roland Dreier (3):
      RDMA/ocrdma: Don't call vlan_dev_real_dev() for non-VLAN netdevs
      mlx4_core: Clean up buddy bitmap allocation
      Merge branches 'cma', 'ipoib', 'misc', 'mlx4', 'ocrdma', 'qib' and 'srp' into for-next

Shlomo Pongratz (2):
      IB/ipoib: Add missing locking when CM object is deleted
      IB/ipoib: Fix RCU pointer dereference of wrong object

Tatyana Nikolova (1):
      RDMA/ucma.c: Fix for events with wrong context on iWARP

Yishai Hadas (2):
      mlx4_core: Allow large mlx4_buddy bitmaps
      mlx4_core: Fix integer overflow issues around MTT table

 drivers/infiniband/core/ucma.c               |    2 +-
 drivers/infiniband/hw/amso1100/c2_rnic.c     |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c        |    2 +-
 drivers/infiniband/hw/mlx4/mad.c             |   16 +++--
 drivers/infiniband/hw/mlx4/main.c            |    5 +-
 drivers/infiniband/hw/mlx4/qp.c              |    6 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c   |   16 ++---
 drivers/infiniband/hw/qib/qib_iba7322.c      |    4 +-
 drivers/infiniband/hw/qib/qib_sd7220.c       |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c      |    3 +
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c          |   87 +++++++++++++++++++-------
 drivers/infiniband/ulp/srpt/ib_srpt.c        |    2 +-
 drivers/net/ethernet/mellanox/mlx4/icm.c     |    9 ++-
 drivers/net/ethernet/mellanox/mlx4/icm.h     |    2 +-
 drivers/net/ethernet/mellanox/mlx4/mlx4.h    |    4 +-
 drivers/net/ethernet/mellanox/mlx4/mr.c      |   27 +++++---
 drivers/net/ethernet/mellanox/mlx4/profile.c |    4 +-
 18 files changed, 130 insertions(+), 65 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-07-23 16:17 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-07-23 16:17 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-3.6

----------------------------------------------------------------

InfiniBand/RDMA changes for the 3.6 merge window:
 - Updates to the qib low-level driver
 - First chunk of changes for SR-IOV support for mlx4 IB
 - RDMA CM support for IPv6-only binding
 - Other misc cleanups and fixes

----------------------------------------------------------------
Betty Dall (1):
      IB/qib: Fix an incorrect log message

Dotan Barak (6):
      IB/mthca: Warning about event for non-existent QPs should show event type
      IB/mthca: Fill in sq_sig_type in query QP
      IB/mlx4: Fill the masked_atomic_cap attribute in query device
      mlx4_core: Remove double function declarations
      IB/cm: Destroy idr as part of the module init error flow
      net/mlx4_core: Free ICM table in case of error

Erez Shitrit (1):
      IB/sa: Add GuidInfoRecord query support

Jack Morgenstein (8):
      mlx4_core: Pass an invalid PCI id number to VFs
      IB/mlx4: Add debug prints
      IB/core: Move CM_xxx_ATTR_ID macros from cm_msgs.h to ib_cm.h
      mlx4: Use port management change event instead of smp_snoop
      net/mlx4_core: Initialize IB port capabilities for all slaves
      mlx4_core: Implement mechanism for reserved Q_Keys
      mlx4_core: Allow guests to have IB ports
      mlx4: Put physical GID and P_Key table sizes in mlx4_phys_caps struct and paravirtualize them

Mike Marciniszyn (8):
      IB/qib: Fix UC MR refs for immediate operations
      IB/qib: Avoid returning EBUSY from MR deregister
      IB/qib: RCU locking for MR validation
      IB/qib: Fix sparse RCU warnings in qib_keys.c
      IB/qib: Fix QP RCU sparse warnings
      IB/qib: Reduce sdma_lock contention
      IB/qib: Add congestion control agent implementation
      IB/qib: checkpatch fixes

Roland Dreier (4):
      RDMA/ocrdma: Fix assignment of max_srq_sge in device query
      RDMA/cxgb4: Fix endianness of addition to mpa->private_data_size
      IB: Use IS_ENABLED(CONFIG_IPV6)
      Merge branches 'cma', 'cxgb4', 'misc', 'mlx4-sriov', 'mlx-cleanups', 'ocrdma' and 'qib' into for-linus

Sean Hefty (3):
      RDMA/cma: Bind to a specific address family
      RDMA/cma: Listen on specific address family
      RDMA/cma: Allow user to restrict listens to bound address family

 drivers/infiniband/core/addr.c               |    4 +-
 drivers/infiniband/core/cm.c                 |   16 +-
 drivers/infiniband/core/cm_msgs.h            |   12 -
 drivers/infiniband/core/cma.c                |   77 ++++--
 drivers/infiniband/core/sa_query.c           |  133 +++++++++++
 drivers/infiniband/core/ucma.c               |    7 +
 drivers/infiniband/hw/cxgb4/cm.c             |   12 +-
 drivers/infiniband/hw/mlx4/mad.c             |  141 ++++++++---
 drivers/infiniband/hw/mlx4/main.c            |   33 ++-
 drivers/infiniband/hw/mlx4/mlx4_ib.h         |   19 ++
 drivers/infiniband/hw/mlx4/qp.c              |   27 ++-
 drivers/infiniband/hw/mthca/mthca_qp.c       |    4 +-
 drivers/infiniband/hw/ocrdma/ocrdma_main.c   |    7 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c  |    2 +-
 drivers/infiniband/hw/qib/qib.h              |   45 +++-
 drivers/infiniband/hw/qib/qib_diag.c         |   13 +-
 drivers/infiniband/hw/qib/qib_driver.c       |   15 +-
 drivers/infiniband/hw/qib/qib_eeprom.c       |   41 ++--
 drivers/infiniband/hw/qib/qib_file_ops.c     |   63 ++---
 drivers/infiniband/hw/qib/qib_fs.c           |   21 +-
 drivers/infiniband/hw/qib/qib_iba6120.c      |   91 +++----
 drivers/infiniband/hw/qib/qib_iba7220.c      |   92 ++++----
 drivers/infiniband/hw/qib/qib_iba7322.c      |  160 +++++++------
 drivers/infiniband/hw/qib/qib_init.c         |  238 +++++++++++++++----
 drivers/infiniband/hw/qib/qib_intr.c         |    8 +-
 drivers/infiniband/hw/qib/qib_keys.c         |  152 +++++++-----
 drivers/infiniband/hw/qib/qib_mad.c          |  327 +++++++++++++++++++++++++-
 drivers/infiniband/hw/qib/qib_mad.h          |  198 +++++++++++++++-
 drivers/infiniband/hw/qib/qib_mr.c           |  247 ++++++++++---------
 drivers/infiniband/hw/qib/qib_pcie.c         |   25 +-
 drivers/infiniband/hw/qib/qib_qp.c           |   56 +++--
 drivers/infiniband/hw/qib/qib_rc.c           |   24 +-
 drivers/infiniband/hw/qib/qib_ruc.c          |   14 +-
 drivers/infiniband/hw/qib/qib_sd7220.c       |   41 ++--
 drivers/infiniband/hw/qib/qib_sdma.c         |   11 +-
 drivers/infiniband/hw/qib/qib_sysfs.c        |  246 +++++++++++++------
 drivers/infiniband/hw/qib/qib_twsi.c         |    8 +-
 drivers/infiniband/hw/qib/qib_uc.c           |   31 +--
 drivers/infiniband/hw/qib/qib_ud.c           |   12 +-
 drivers/infiniband/hw/qib/qib_verbs.c        |   66 +++++-
 drivers/infiniband/hw/qib/qib_verbs.h        |   56 +++--
 drivers/infiniband/hw/qib/qib_wc_x86_64.c    |   14 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c      |    2 +-
 drivers/net/ethernet/mellanox/mlx4/en_main.c |    5 +-
 drivers/net/ethernet/mellanox/mlx4/eq.c      |   22 +-
 drivers/net/ethernet/mellanox/mlx4/fw.c      |  132 ++++++++---
 drivers/net/ethernet/mellanox/mlx4/icm.c     |    2 +
 drivers/net/ethernet/mellanox/mlx4/icm.h     |    6 -
 drivers/net/ethernet/mellanox/mlx4/intf.c    |    5 +-
 drivers/net/ethernet/mellanox/mlx4/main.c    |   86 +++++--
 drivers/net/ethernet/mellanox/mlx4/mlx4.h    |   67 +-----
 drivers/net/ethernet/mellanox/mlx4/port.c    |   11 +-
 include/linux/mlx4/device.h                  |  119 +++++++++-
 include/linux/mlx4/driver.h                  |    3 +-
 include/rdma/ib_cm.h                         |   12 +
 include/rdma/ib_sa.h                         |   33 +++
 include/rdma/rdma_cm.h                       |   10 +
 include/rdma/rdma_user_cm.h                  |    1 +
 58 files changed, 2414 insertions(+), 911 deletions(-)

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

* RE: [GIT PULL] please pull infiniband.git
  2012-06-24 12:09 Roland Dreier
@ 2012-06-25 14:11 ` Tziporet Koren
  0 siblings, 0 replies; 223+ messages in thread
From: Tziporet Koren @ 2012-06-25 14:11 UTC (permalink / raw)
  To: Roland Dreier, Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Roland

Can you updated us on status of review of our mlx4 SRIOV IB submission?

Thanks
Tziporet

-----Original Message-----
From: linux-rdma-owner@vger.kernel.org [mailto:linux-rdma-owner@vger.kernel.org] On Behalf Of Roland Dreier
Sent: Sunday, June 24, 2012 5:11 AM
To: Linus Torvalds
Cc: linux-rdma@vger.kernel.org; linux-kernel@vger.kernel.org
Subject: [GIT PULL] please pull infiniband.git

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-fixes

----------------------------------------------------------------

InfiniBand/RDMA fixes for 3.5-rc:
 - Fixes to new ocrdma driver
 - Typo in test in CMA

----------------------------------------------------------------
Dan Carpenter (1):
      RDMA/ocrdma: Fix off by one in ocrdma_query_gid()

Mahesh Vardhamanaiah (2):
      RDMA/ocrdma: Correct reported max queue sizes
      RDMA/ocrdma: Correct queue SGE calculation

Parav Pandit (2):
      RDMA/ocrdma: Fixed GID table for vlan and events
      RDMA/ocrdma: Fixed RQ error CQE polling

Roland Dreier (1):
      Merge branches 'cma' and 'ocrdma' into for-linus

Sean Hefty (1):
      RDMA/cma: QP type check on received REQs should be AND not OR

 drivers/infiniband/core/cma.c               |    2 +-
 drivers/infiniband/hw/ocrdma/ocrdma.h       |    1 +
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c    |   18 ++++----
 drivers/infiniband/hw/ocrdma/ocrdma_main.c  |   63 +++++++++++++++------------
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h   |    5 ++-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c |   12 ++---
 6 files changed, 55 insertions(+), 46 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [GIT PULL] please pull infiniband.git
@ 2012-06-24 12:09 Roland Dreier
  2012-06-25 14:11 ` Tziporet Koren
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2012-06-24 12:09 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-fixes

----------------------------------------------------------------

InfiniBand/RDMA fixes for 3.5-rc:
 - Fixes to new ocrdma driver
 - Typo in test in CMA

----------------------------------------------------------------
Dan Carpenter (1):
      RDMA/ocrdma: Fix off by one in ocrdma_query_gid()

Mahesh Vardhamanaiah (2):
      RDMA/ocrdma: Correct reported max queue sizes
      RDMA/ocrdma: Correct queue SGE calculation

Parav Pandit (2):
      RDMA/ocrdma: Fixed GID table for vlan and events
      RDMA/ocrdma: Fixed RQ error CQE polling

Roland Dreier (1):
      Merge branches 'cma' and 'ocrdma' into for-linus

Sean Hefty (1):
      RDMA/cma: QP type check on received REQs should be AND not OR

 drivers/infiniband/core/cma.c               |    2 +-
 drivers/infiniband/hw/ocrdma/ocrdma.h       |    1 +
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c    |   18 ++++----
 drivers/infiniband/hw/ocrdma/ocrdma_main.c  |   63 +++++++++++++++------------
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h   |    5 ++-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c |   12 ++---
 6 files changed, 55 insertions(+), 46 deletions(-)

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

* [GIT PULL] please pull infiniband.git
  2012-05-21  1:14 Roland Dreier
  2012-05-21  2:05 ` Stephen Rothwell
  2012-05-21 16:07 ` Roland Dreier
@ 2012-06-06 17:44 ` Roland Dreier
  2 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-06-06 17:44 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-fixes

----------------------------------------------------------------

InfiniBand/RDMA fixes for 3.5-rc2, all in hardware drivers:
 - Fix crash in cxgb4
 - Fixes to new ocrdma driver
 - Regression fixes for mlx4

----------------------------------------------------------------
Devendra Naga (1):
      RDMA/ocrdma: Remove unnecessary version.h includes

Jack Morgenstein (1):
      mlx4_core: Fix setting VL_cap in mlx4_SET_PORT wrapper flow

Parav Pandit (2):
      RDMA/ocrdma: Correct queue free count math
      RDMA/ocrdma: Fix signaled event for SRQ_LIMIT_REACHED

Roland Dreier (1):
      Merge branches 'cxgb4', 'mlx4' and 'ocrdma' into for-linus

Sagi Grimberg (1):
      IB/mlx4: Fix max_wqe capacity reported from query device

Shlomo Pongratz (1):
      IB/mlx4: Fix EQ deallocation in legacy mode

Thadeu Lima de Souza Cascardo (1):
      RDMA/cxgb4: Fix crash when peer address is 0.0.0.0

 drivers/infiniband/hw/cxgb4/cm.c            |    4 ++++
 drivers/infiniband/hw/mlx4/main.c           |   21 ++++++++-------------
 drivers/infiniband/hw/mlx4/mlx4_ib.h        |    8 ++++++++
 drivers/infiniband/hw/mlx4/qp.c             |   21 +++++++++++++++------
 drivers/infiniband/hw/ocrdma/ocrdma.h       |    1 -
 drivers/infiniband/hw/ocrdma/ocrdma_abi.h   |    5 +----
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c    |    9 +--------
 drivers/infiniband/hw/ocrdma/ocrdma_main.c  |    1 -
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c |    5 -----
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h |    1 -
 drivers/net/ethernet/mellanox/mlx4/port.c   |    4 ++--
 11 files changed, 39 insertions(+), 41 deletions(-)

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

* [GIT PULL] please pull infiniband.git
  2012-05-21  1:14 Roland Dreier
  2012-05-21  2:05 ` Stephen Rothwell
@ 2012-05-21 16:07 ` Roland Dreier
  2012-06-06 17:44 ` Roland Dreier
  2 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-05-21 16:07 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

I updated my tag with the patch to fix powerpc build breakage with the
one-liner

      RDMA/cxgb4: Include vmalloc.h for vmalloc and vfree

so the pull request now looks like the following.

Thanks,
  Roland

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-3.5

----------------------------------------------------------------

InfiniBand/RDMA changes for the 3.5 merge window:
 - Add ocrdma hardware driver for Emulex IB-over-Ethernet adapters
 - Add generic and mlx4 support for "raw" QPs: allow suitably privileged
   applications to send and receive arbitrary packets directly to/from
   the hardware
 - Add "doorbell drop" handling to the cxgb4 driver
 - A fairly large batch of qib hardware driver changes
 - A few fixes for lockdep-detected issues
 - A few other miscellaneous fixes and cleanups

----------------------------------------------------------------
Dan Carpenter (2):
      RDMA/ocrdma: Fix check for NULL instead of IS_ERR
      RDMA/ocrdma: Tiny locking cleanup

Jack Morgenstein (3):
      mlx4_core: Change bitmap allocator to work in round-robin fashion
      IB/core: Fix IB_SA_COMP_MASK macro
      IB/mlx4: Fix mlx4_ib_add() error flow

Jim Cromie (1):
      IB/ipath: Replace open-coded ARRAY_SIZE with macro

Jim Foraker (2):
      IB/qib: Fix M_Key lease timeout handling
      IB/qib: MADs with misset M_Keys should return failure

Mike Marciniszyn (5):
      IB/ipath: Replace open-coded ARRAY_SIZE with macro
      MAINTAINERS: Update qib and ipath entries from QLogic to Intel
      IB/qib: Add prefetch for eager buffers
      IB/qib: Optimize pio ack buffer allocation
      IB/qib: Add cache line awareness to qib_qp and qib_devdata structures

Mitko Haralanov (2):
      IB/qib: Display correct value for number of contexts
      IB/qib: Fix QLE734X link cycling

Or Gerlitz (4):
      IB/core: Use qp->usecnt to track multicast attach/detach
      IB/core: Add raw packet QP type
      IB/mlx4: Add raw packet QP support
      IB/iser: Fix error flow in iser ep connection establishment

Oren Duer (1):
      IB/mlx4: Put priority bits in WQE of IBoE MLX QP

Parav Pandit (3):
      be2net: Add function to issue mailbox cmd on MQ
      be2net: Add functionality to support RoCE driver
      RDMA/ocrdma: Add driver for Emulex OneConnect IBoE RDMA adapter

Roland Dreier (8):
      IB/uverbs: Make lockdep output more readable
      IB/uverbs: Lock SRQ / CQ / PD objects in a consistent order
      RDMA/ocrdma: Fix warnings about uninitialized variables
      RDMA/ocrdma: Make needlessly global functions/structs static
      RDMA/ocrdma: Set event's device member in ocrdma_dispatch_ibevent()
      RDMA/ocrdma: Remove write-only variables
      RDMA/ocrdma: Fix build with IPV6=n
      Merge branches 'core', 'cxgb4', 'ipath', 'iser', 'lockdep', 'mlx4', 'nes', 'ocrdma', 'qib' and 'raw-qp' into for-linus

Sasha Levin (1):
      RDMA/ocrdma: Don't sleep in atomic notifier handler

Sean Hefty (1):
      RDMA/cma: Fix lockdep false positive recursive locking

Shlomo Pongratz (3):
      mlx4_core: Add second capabilities flags field
      IB/mlx4: Replace printk(KERN_yyy...) with pr_yyy(...)
      IB/mlx4: Increase the number of vectors (EQs) available for ULPs

Steve Wise (3):
      RDMA/cxgb4: Use dst parameter in import_ep()
      RDMA/cxgb4: Always wake up waiters in c4iw_peer_abort_intr()
      RDMA/cxgb4: Drop peer_abort when no endpoint found

Tatyana Nikolova (2):
      RDMA/nes: Fix for the ORD value of the connecting peer
      RDMA/nes: Don't call event handler if pointer is NULL

Todd Rimmer (1):
      IB/qib: Correct ordering of reregister vs. port active events

Vipul Pandya (11):
      cxgb4: Detect DB FULL events and notify RDMA ULD
      cxgb4: Common platform specific changes for DB Drop Recovery
      cxgb4: DB Drop Recovery for RDMA and LLD queues
      RDMA/cxgb4: Add debugfs RDMA memory stats
      RDMA/cxgb4: Add DB Overflow Avoidance
      RDMA/cxgb4: Disable interrupts in c4iw_ev_dispatch()
      RDMA/cxgb4: DB Drop Recovery for RDMA and LLD queues
      RDMA/cxgb4: Use vmalloc() for debugfs QP dump
      RDMA/cxgb4: Remove kfifo usage
      RDMA/cxgb4: Add query_qp support
      RDMA/cxgb4: Include vmalloc.h for vmalloc and vfree

Yishai Hadas (1):
      IB/core: Fix mismatch between locked and pinned pages

 MAINTAINERS                                     |    4 +-
 drivers/infiniband/Kconfig                      |    1 +
 drivers/infiniband/Makefile                     |    1 +
 drivers/infiniband/core/cma.c                   |   42 +-
 drivers/infiniband/core/umem.c                  |    2 +-
 drivers/infiniband/core/uverbs_cmd.c            |  108 +-
 drivers/infiniband/core/verbs.c                 |   15 +-
 drivers/infiniband/hw/cxgb4/Makefile            |    2 +-
 drivers/infiniband/hw/cxgb4/cm.c                |   36 +-
 drivers/infiniband/hw/cxgb4/device.c            |  340 ++-
 drivers/infiniband/hw/cxgb4/ev.c                |    8 +-
 drivers/infiniband/hw/cxgb4/id_table.c          |  112 +
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h          |  134 +-
 drivers/infiniband/hw/cxgb4/mem.c               |   21 +-
 drivers/infiniband/hw/cxgb4/provider.c          |   19 +-
 drivers/infiniband/hw/cxgb4/qp.c                |  105 +-
 drivers/infiniband/hw/cxgb4/resource.c          |  180 +-
 drivers/infiniband/hw/cxgb4/t4.h                |   24 +
 drivers/infiniband/hw/cxgb4/user.h              |    2 +-
 drivers/infiniband/hw/ipath/ipath_iba6110.c     |    3 +-
 drivers/infiniband/hw/ipath/ipath_intr.c        |    3 +-
 drivers/infiniband/hw/mlx4/cq.c                 |   13 +-
 drivers/infiniband/hw/mlx4/main.c               |  104 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h            |    2 +
 drivers/infiniband/hw/mlx4/mr.c                 |    2 +-
 drivers/infiniband/hw/mlx4/qp.c                 |   54 +-
 drivers/infiniband/hw/mlx4/srq.c                |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c              |    7 +-
 drivers/infiniband/hw/ocrdma/Kconfig            |    8 +
 drivers/infiniband/hw/ocrdma/Makefile           |    5 +
 drivers/infiniband/hw/ocrdma/ocrdma.h           |  393 ++++
 drivers/infiniband/hw/ocrdma/ocrdma_abi.h       |  134 ++
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c        |  172 ++
 drivers/infiniband/hw/ocrdma/ocrdma_ah.h        |   42 +
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c        | 2640 +++++++++++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h        |  132 ++
 drivers/infiniband/hw/ocrdma/ocrdma_main.c      |  577 +++++
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h       | 1672 ++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c     | 2537 ++++++++++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h     |   94 +
 drivers/infiniband/hw/qib/qib.h                 |   35 +-
 drivers/infiniband/hw/qib/qib_driver.c          |    5 +-
 drivers/infiniband/hw/qib/qib_iba6120.c         |    1 +
 drivers/infiniband/hw/qib/qib_iba7220.c         |    1 +
 drivers/infiniband/hw/qib/qib_iba7322.c         |    3 +-
 drivers/infiniband/hw/qib/qib_init.c            |    3 +-
 drivers/infiniband/hw/qib/qib_mad.c             |   63 +-
 drivers/infiniband/hw/qib/qib_qp.c              |    7 +
 drivers/infiniband/hw/qib/qib_rc.c              |    4 +-
 drivers/infiniband/hw/qib/qib_ruc.c             |   12 +-
 drivers/infiniband/hw/qib/qib_sysfs.c           |    7 +-
 drivers/infiniband/hw/qib/qib_tx.c              |   25 +-
 drivers/infiniband/hw/qib/qib_uc.c              |    4 +-
 drivers/infiniband/hw/qib/qib_ud.c              |   16 +-
 drivers/infiniband/hw/qib/qib_verbs.h           |  145 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c        |    5 +-
 drivers/infiniband/ulp/iser/iser_verbs.c        |    3 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h      |   23 +
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |  235 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h  |   11 +
 drivers/net/ethernet/chelsio/cxgb4/sge.c        |   22 +-
 drivers/net/ethernet/chelsio/cxgb4/t4_hw.c      |   62 +-
 drivers/net/ethernet/chelsio/cxgb4/t4_regs.h    |   53 +
 drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h   |   15 +
 drivers/net/ethernet/emulex/benet/Makefile      |    2 +-
 drivers/net/ethernet/emulex/benet/be.h          |   38 +-
 drivers/net/ethernet/emulex/benet/be_cmds.c     |   39 +
 drivers/net/ethernet/emulex/benet/be_cmds.h     |    1 +
 drivers/net/ethernet/emulex/benet/be_hw.h       |    4 +-
 drivers/net/ethernet/emulex/benet/be_main.c     |   88 +-
 drivers/net/ethernet/emulex/benet/be_roce.c     |  182 ++
 drivers/net/ethernet/emulex/benet/be_roce.h     |   75 +
 drivers/net/ethernet/mellanox/mlx4/alloc.c      |    3 -
 drivers/net/ethernet/mellanox/mlx4/fw.c         |   29 +
 drivers/net/ethernet/mellanox/mlx4/fw.h         |    2 +
 drivers/net/ethernet/mellanox/mlx4/main.c       |    2 +
 include/linux/mlx4/device.h                     |    8 +
 include/linux/mlx4/qp.h                         |    3 +-
 include/rdma/ib_mad.h                           |    2 +-
 include/rdma/ib_verbs.h                         |    4 +-
 80 files changed, 10547 insertions(+), 447 deletions(-)
 create mode 100644 drivers/infiniband/hw/cxgb4/id_table.c
 create mode 100644 drivers/infiniband/hw/ocrdma/Kconfig
 create mode 100644 drivers/infiniband/hw/ocrdma/Makefile
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_abi.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_ah.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_ah.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_hw.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_hw.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_main.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_sli.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
 create mode 100644 drivers/net/ethernet/emulex/benet/be_roce.c
 create mode 100644 drivers/net/ethernet/emulex/benet/be_roce.h

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

* Re: [GIT PULL] please pull infiniband.git
  2012-05-21  2:35   ` Roland Dreier
@ 2012-05-21  3:39     ` Stephen Rothwell
  0 siblings, 0 replies; 223+ messages in thread
From: Stephen Rothwell @ 2012-05-21  3:39 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Linus Torvalds, linux-kernel, linux-rdma

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

Hi Roland,

On Sun, 20 May 2012 19:35:30 -0700 Roland Dreier <roland@kernel.org> wrote:
>
> Sorry about that. Which commit in particular?  The vmalloc one?
> What's the error?

Yeah, the vmalloc patch - see my linux-next build error report.  Its just
missing an include.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [GIT PULL] please pull infiniband.git
  2012-05-21  2:05 ` Stephen Rothwell
@ 2012-05-21  2:35   ` Roland Dreier
  2012-05-21  3:39     ` Stephen Rothwell
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2012-05-21  2:35 UTC (permalink / raw)
  To: Stephen Rothwell; +Cc: Linus Torvalds, linux-kernel, linux-rdma

On Sun, May 20, 2012 at 7:05 PM, Stephen Rothwell <sfr@canb.auug.org.au> wrote:

>> Vipul Pandya (10):
>>       cxgb4: Detect DB FULL events and notify RDMA ULD
>>       cxgb4: Common platform specific changes for DB Drop Recovery
>>       cxgb4: DB Drop Recovery for RDMA and LLD queues
>>       RDMA/cxgb4: Add debugfs RDMA memory stats
>>       RDMA/cxgb4: Add DB Overflow Avoidance
>>       RDMA/cxgb4: Disable interrupts in c4iw_ev_dispatch()
>>       RDMA/cxgb4: DB Drop Recovery for RDMA and LLD queues
>>       RDMA/cxgb4: Use vmalloc() for debugfs QP dump

> This commit breaks (at least) powerpc builds and has not bee in linux-next
> before today.

Sorry about that. Which commit in particular?  The vmalloc one?
What's the error?

(I did add this patchset to my for-next branch on Friday at the
latest, but I understand if you didn't do a linux-next build over the
past 48 weekend hours :)

 - R.

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

* Re: [GIT PULL] please pull infiniband.git
  2012-05-21  1:14 Roland Dreier
@ 2012-05-21  2:05 ` Stephen Rothwell
  2012-05-21  2:35   ` Roland Dreier
  2012-05-21 16:07 ` Roland Dreier
  2012-06-06 17:44 ` Roland Dreier
  2 siblings, 1 reply; 223+ messages in thread
From: Stephen Rothwell @ 2012-05-21  2:05 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Linus Torvalds, linux-kernel, linux-rdma

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

Hi Roland,

On Sun, 20 May 2012 18:14:28 -0700 Roland Dreier <roland@kernel.org> wrote:
>
> Vipul Pandya (10):
>       cxgb4: Detect DB FULL events and notify RDMA ULD
>       cxgb4: Common platform specific changes for DB Drop Recovery
>       cxgb4: DB Drop Recovery for RDMA and LLD queues
>       RDMA/cxgb4: Add debugfs RDMA memory stats
>       RDMA/cxgb4: Add DB Overflow Avoidance
>       RDMA/cxgb4: Disable interrupts in c4iw_ev_dispatch()
>       RDMA/cxgb4: DB Drop Recovery for RDMA and LLD queues
>       RDMA/cxgb4: Use vmalloc() for debugfs QP dump

This commit breaks (at least) powerpc builds and has not bee in linux-next
before today.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

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

* [GIT PULL] please pull infiniband.git
@ 2012-05-21  1:14 Roland Dreier
  2012-05-21  2:05 ` Stephen Rothwell
                   ` (2 more replies)
  0 siblings, 3 replies; 223+ messages in thread
From: Roland Dreier @ 2012-05-21  1:14 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-3.5

----------------------------------------------------------------

InfiniBand/RDMA changes for the 3.5 merge window:
 - Add ocrdma hardware driver for Emulex IB-over-Ethernet adapters
 - Add generic and mlx4 support for "raw" QPs: allow suitably privileged
   applications to send and receive arbitrary packets directly to/from
   the hardware
 - Add "doorbell drop" handling to the cxgb4 driver
 - A fairly large batch of qib hardware driver changes
 - A few fixes for lockdep-detected issues
 - A few other miscellaneous fixes and cleanups

----------------------------------------------------------------
Dan Carpenter (2):
      RDMA/ocrdma: Fix check for NULL instead of IS_ERR
      RDMA/ocrdma: Tiny locking cleanup

Jack Morgenstein (3):
      mlx4_core: Change bitmap allocator to work in round-robin fashion
      IB/core: Fix IB_SA_COMP_MASK macro
      IB/mlx4: Fix mlx4_ib_add() error flow

Jim Cromie (1):
      IB/ipath: Replace open-coded ARRAY_SIZE with macro

Jim Foraker (2):
      IB/qib: Fix M_Key lease timeout handling
      IB/qib: MADs with misset M_Keys should return failure

Mike Marciniszyn (5):
      IB/ipath: Replace open-coded ARRAY_SIZE with macro
      MAINTAINERS: Update qib and ipath entries from QLogic to Intel
      IB/qib: Add prefetch for eager buffers
      IB/qib: Optimize pio ack buffer allocation
      IB/qib: Add cache line awareness to qib_qp and qib_devdata structures

Mitko Haralanov (2):
      IB/qib: Display correct value for number of contexts
      IB/qib: Fix QLE734X link cycling

Or Gerlitz (4):
      IB/core: Use qp->usecnt to track multicast attach/detach
      IB/core: Add raw packet QP type
      IB/mlx4: Add raw packet QP support
      IB/iser: Fix error flow in iser ep connection establishment

Oren Duer (1):
      IB/mlx4: Put priority bits in WQE of IBoE MLX QP

Parav Pandit (3):
      be2net: Add function to issue mailbox cmd on MQ
      be2net: Add functionality to support RoCE driver
      RDMA/ocrdma: Add driver for Emulex OneConnect IBoE RDMA adapter

Roland Dreier (8):
      IB/uverbs: Make lockdep output more readable
      IB/uverbs: Lock SRQ / CQ / PD objects in a consistent order
      RDMA/ocrdma: Fix warnings about uninitialized variables
      RDMA/ocrdma: Make needlessly global functions/structs static
      RDMA/ocrdma: Set event's device member in ocrdma_dispatch_ibevent()
      RDMA/ocrdma: Remove write-only variables
      RDMA/ocrdma: Fix build with IPV6=n
      Merge branches 'core', 'cxgb4', 'ipath', 'iser', 'lockdep', 'mlx4', 'nes', 'ocrdma', 'qib' and 'raw-qp' into for-linus

Sasha Levin (1):
      RDMA/ocrdma: Don't sleep in atomic notifier handler

Sean Hefty (1):
      RDMA/cma: Fix lockdep false positive recursive locking

Shlomo Pongratz (3):
      mlx4_core: Add second capabilities flags field
      IB/mlx4: Replace printk(KERN_yyy...) with pr_yyy(...)
      IB/mlx4: Increase the number of vectors (EQs) available for ULPs

Steve Wise (3):
      RDMA/cxgb4: Use dst parameter in import_ep()
      RDMA/cxgb4: Always wake up waiters in c4iw_peer_abort_intr()
      RDMA/cxgb4: Drop peer_abort when no endpoint found

Tatyana Nikolova (2):
      RDMA/nes: Fix for the ORD value of the connecting peer
      RDMA/nes: Don't call event handler if pointer is NULL

Todd Rimmer (1):
      IB/qib: Correct ordering of reregister vs. port active events

Vipul Pandya (10):
      cxgb4: Detect DB FULL events and notify RDMA ULD
      cxgb4: Common platform specific changes for DB Drop Recovery
      cxgb4: DB Drop Recovery for RDMA and LLD queues
      RDMA/cxgb4: Add debugfs RDMA memory stats
      RDMA/cxgb4: Add DB Overflow Avoidance
      RDMA/cxgb4: Disable interrupts in c4iw_ev_dispatch()
      RDMA/cxgb4: DB Drop Recovery for RDMA and LLD queues
      RDMA/cxgb4: Use vmalloc() for debugfs QP dump
      RDMA/cxgb4: Remove kfifo usage
      RDMA/cxgb4: Add query_qp support

Yishai Hadas (1):
      IB/core: Fix mismatch between locked and pinned pages

 MAINTAINERS                                     |    4 +-
 drivers/infiniband/Kconfig                      |    1 +
 drivers/infiniband/Makefile                     |    1 +
 drivers/infiniband/core/cma.c                   |   42 +-
 drivers/infiniband/core/umem.c                  |    2 +-
 drivers/infiniband/core/uverbs_cmd.c            |  108 +-
 drivers/infiniband/core/verbs.c                 |   15 +-
 drivers/infiniband/hw/cxgb4/Makefile            |    2 +-
 drivers/infiniband/hw/cxgb4/cm.c                |   36 +-
 drivers/infiniband/hw/cxgb4/device.c            |  339 ++-
 drivers/infiniband/hw/cxgb4/ev.c                |    8 +-
 drivers/infiniband/hw/cxgb4/id_table.c          |  112 +
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h          |  134 +-
 drivers/infiniband/hw/cxgb4/mem.c               |   21 +-
 drivers/infiniband/hw/cxgb4/provider.c          |   19 +-
 drivers/infiniband/hw/cxgb4/qp.c                |  105 +-
 drivers/infiniband/hw/cxgb4/resource.c          |  180 +-
 drivers/infiniband/hw/cxgb4/t4.h                |   24 +
 drivers/infiniband/hw/cxgb4/user.h              |    2 +-
 drivers/infiniband/hw/ipath/ipath_iba6110.c     |    3 +-
 drivers/infiniband/hw/ipath/ipath_intr.c        |    3 +-
 drivers/infiniband/hw/mlx4/cq.c                 |   13 +-
 drivers/infiniband/hw/mlx4/main.c               |  104 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h            |    2 +
 drivers/infiniband/hw/mlx4/mr.c                 |    2 +-
 drivers/infiniband/hw/mlx4/qp.c                 |   54 +-
 drivers/infiniband/hw/mlx4/srq.c                |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c              |    7 +-
 drivers/infiniband/hw/ocrdma/Kconfig            |    8 +
 drivers/infiniband/hw/ocrdma/Makefile           |    5 +
 drivers/infiniband/hw/ocrdma/ocrdma.h           |  393 ++++
 drivers/infiniband/hw/ocrdma/ocrdma_abi.h       |  134 ++
 drivers/infiniband/hw/ocrdma/ocrdma_ah.c        |  172 ++
 drivers/infiniband/hw/ocrdma/ocrdma_ah.h        |   42 +
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c        | 2640 +++++++++++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_hw.h        |  132 ++
 drivers/infiniband/hw/ocrdma/ocrdma_main.c      |  577 +++++
 drivers/infiniband/hw/ocrdma/ocrdma_sli.h       | 1672 ++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c     | 2537 ++++++++++++++++++++++
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h     |   94 +
 drivers/infiniband/hw/qib/qib.h                 |   35 +-
 drivers/infiniband/hw/qib/qib_driver.c          |    5 +-
 drivers/infiniband/hw/qib/qib_iba6120.c         |    1 +
 drivers/infiniband/hw/qib/qib_iba7220.c         |    1 +
 drivers/infiniband/hw/qib/qib_iba7322.c         |    3 +-
 drivers/infiniband/hw/qib/qib_init.c            |    3 +-
 drivers/infiniband/hw/qib/qib_mad.c             |   63 +-
 drivers/infiniband/hw/qib/qib_qp.c              |    7 +
 drivers/infiniband/hw/qib/qib_rc.c              |    4 +-
 drivers/infiniband/hw/qib/qib_ruc.c             |   12 +-
 drivers/infiniband/hw/qib/qib_sysfs.c           |    7 +-
 drivers/infiniband/hw/qib/qib_tx.c              |   25 +-
 drivers/infiniband/hw/qib/qib_uc.c              |    4 +-
 drivers/infiniband/hw/qib/qib_ud.c              |   16 +-
 drivers/infiniband/hw/qib/qib_verbs.h           |  145 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c        |    5 +-
 drivers/infiniband/ulp/iser/iser_verbs.c        |    3 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h      |   23 +
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |  235 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h  |   11 +
 drivers/net/ethernet/chelsio/cxgb4/sge.c        |   22 +-
 drivers/net/ethernet/chelsio/cxgb4/t4_hw.c      |   62 +-
 drivers/net/ethernet/chelsio/cxgb4/t4_regs.h    |   53 +
 drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h   |   15 +
 drivers/net/ethernet/emulex/benet/Makefile      |    2 +-
 drivers/net/ethernet/emulex/benet/be.h          |   38 +-
 drivers/net/ethernet/emulex/benet/be_cmds.c     |   39 +
 drivers/net/ethernet/emulex/benet/be_cmds.h     |    1 +
 drivers/net/ethernet/emulex/benet/be_hw.h       |    4 +-
 drivers/net/ethernet/emulex/benet/be_main.c     |   88 +-
 drivers/net/ethernet/emulex/benet/be_roce.c     |  182 ++
 drivers/net/ethernet/emulex/benet/be_roce.h     |   75 +
 drivers/net/ethernet/mellanox/mlx4/alloc.c      |    3 -
 drivers/net/ethernet/mellanox/mlx4/fw.c         |   29 +
 drivers/net/ethernet/mellanox/mlx4/fw.h         |    2 +
 drivers/net/ethernet/mellanox/mlx4/main.c       |    2 +
 include/linux/mlx4/device.h                     |    8 +
 include/linux/mlx4/qp.h                         |    3 +-
 include/rdma/ib_mad.h                           |    2 +-
 include/rdma/ib_verbs.h                         |    4 +-
 80 files changed, 10546 insertions(+), 447 deletions(-)
 create mode 100644 drivers/infiniband/hw/cxgb4/id_table.c
 create mode 100644 drivers/infiniband/hw/ocrdma/Kconfig
 create mode 100644 drivers/infiniband/hw/ocrdma/Makefile
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_abi.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_ah.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_ah.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_hw.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_hw.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_main.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_sli.h
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
 create mode 100644 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
 create mode 100644 drivers/net/ethernet/emulex/benet/be_roce.c
 create mode 100644 drivers/net/ethernet/emulex/benet/be_roce.h

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

* [GIT PULL] please pull infiniband.git
@ 2012-04-26 17:39 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-04-26 17:39 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/ib-fixes

----------------------------------------------------------------

A few fixes for regressions introduced in 3.4-rc1:
 - fix memory leak in mlx4
 - fix two problems with new MAD response generation code

----------------------------------------------------------------
Jack Morgenstein (2):
      IB/mad: Set 'D' bit in response for unhandled MADs
      IB/mad: Don't send response for failed MADs

Jesper Juhl (1):
      IB/mlx4: Fix memory leaks in ib_link_query_port()

Roland Dreier (1):
      Merge branches 'mad-response' and 'mlx4' into fixes

 drivers/infiniband/core/mad.c     |    8 +++++---
 drivers/infiniband/hw/mlx4/main.c |    2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-04-12 23:45 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-04-12 23:45 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, target-devel, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/srpt-srq-type fixes

----------------------------------------------------------------
Add a fix for a bug hit by Alexey Shvetsov in ib_srtp that hits on
non-mlx4 hardware.

----------------------------------------------------------------
Roland Dreier (1):
      IB/srpt: Set srq_type to IB_SRQT_BASIC

 drivers/infiniband/ulp/srpt/ib_srpt.c |    1 +
 1 file changed, 1 insertion(+)

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

* [GIT PULL] please pull infiniband.git
@ 2012-04-11 20:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-04-11 20:07 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git tags/rdma-for-linus

----------------------------------------------------------------
Fix regression in the /sys/class/infiniband/.../rate attribute -- old
kernels used to just return something, even if the underlying value was
out-of-bounds, while 3.4-rc1 returned EINVAL to userspace.  This breaks
some applications that check for the error, so go back to the old
behavior.

----------------------------------------------------------------
Or Gerlitz (1):
      IB/mlx4: Don't return an invalid speed when a port is down

Roland Dreier (1):
      IB/core: Don't return EINVAL from sysfs rate attribute for invalid speeds

 drivers/infiniband/core/sysfs.c   |    9 +++++----
 drivers/infiniband/hw/mlx4/main.c |    5 +++++
 2 files changed, 10 insertions(+), 4 deletions(-)

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

* RE: [GIT PULL] please pull infiniband.git
  2012-03-26 21:13   ` Roland Dreier
@ 2012-03-27 16:33     ` Tziporet Koren
  0 siblings, 0 replies; 223+ messages in thread
From: Tziporet Koren @ 2012-03-27 16:33 UTC (permalink / raw)
  To: Roland Dreier; +Cc: Linus Torvalds, linux-kernel, linux-rdma

>> What about the IPoIB patches (e.g. use Interrupt moderation)

> I have no idea what patch that might be.  We've had the modify_cq call in ipoib for years now, with moderation parameters set through ethtool.

http://www.spinics.net/lists/linux-rdma/msg09142.html
 and
http://www.spinics.net/lists/linux-rdma/msg09143.html

Tziporet

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

* Re: [GIT PULL] please pull infiniband.git
  2012-03-26 21:04 ` Tziporet Koren
@ 2012-03-26 21:13   ` Roland Dreier
  2012-03-27 16:33     ` Tziporet Koren
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2012-03-26 21:13 UTC (permalink / raw)
  To: Tziporet Koren; +Cc: Linus Torvalds, linux-kernel, linux-rdma

On Mon, Mar 26, 2012 at 2:04 PM, Tziporet Koren <tziporet@mellanox.com> wrote:
> What about the IPoIB patches (e.g. use Interrupt moderation)

I have no idea what patch that might be.  We've had the modify_cq call
in ipoib for years now,
with moderation parameters set through ethtool.

 - R.

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

* RE: [GIT PULL] please pull infiniband.git
  2012-03-19 17:11 Roland Dreier
@ 2012-03-26 21:04 ` Tziporet Koren
  2012-03-26 21:13   ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Tziporet Koren @ 2012-03-26 21:04 UTC (permalink / raw)
  To: Roland Dreier, Linus Torvalds; +Cc: linux-kernel, linux-rdma

Roland
What about the IPoIB patches (e.g. use Interrupt moderation)

Regards,
Tziporet


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

* [GIT PULL] please pull infiniband.git
@ 2012-03-19 17:11 Roland Dreier
  2012-03-26 21:04 ` Tziporet Koren
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2012-03-19 17:11 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git rdma-for-linus

----------------------------------------------------------------

InfiniBand/RDMA changes for the 3.4 merge window.  Nothing big really
stands out; by patch count lots of fixes to the mlx4 driver plus some
cleanups and fixes to the core and other drivers.

----------------------------------------------------------------
Bart Van Assche (2):
      IB/srp: Use pr_fmt() and pr_err()/pr_warn()
      IB/srp: Consolidate repetitive sysfs code

Doug Ledford (1):
      IB/iser: Free IB connection resources in the proper place

Eli Cohen (3):
      IB/mlx4: Set bad_wr for invalid send opcode
      mlx4: Enforce device max FMR maps in FMR alloc
      IB/mlx4: Fix possible missed completion event

Eric Dumazet (1):
      IB/ehca: Use kthread_create_on_node()

Hefty, Sean (1):
      RDMA/ucma: Fix AB-BA deadlock

Jack Morgenstein (1):
      mlx4_core: Report thermal error events

Kumar Sanghvi (1):
      RDMA/cxgb4: Add missing peer2peer check in MPAv2 code

Kyle McMartin (1):
      IB/ehca: Fix ilog2() compile failure

Masanari Iida (1):
      IB/srpt: Fix typo "alocate" -> "allocate"

Mike Marciniszyn (2):
      IB/qib: Add logic for affinity hint
      IB/qib: Avoid filtering LID on SMA portinfo

Or Gerlitz (6):
      IB/iser: Post initial receive buffers before sending the final login request
      IB: Use central enum for speed instead of hard-coded values
      mlx4_core: Get rid of redundant ext_port_cap flags
      IB: Change CQE "csum_ok" field to a bit flag
      IB/mlx4: Fix info returned when querying IBoE ports
      mlx4_core: Allow dynamic MTU configuration for IB ports

Roland Dreier (5):
      IB/core: Fix SDR rates in sysfs
      mlx4_core: Fix one more static exported function
      mlx4_core: Scale size of MTT table with system RAM
      Merge branches 'misc' and 'mlx4' into for-next
      Merge branches 'cma', 'cxgb3', 'cxgb4', 'ehca', 'iser', 'mad', 'nes', 'qib', 'srp' and 'srpt' into for-next

Steve Wise (2):
      RDMA/cxgb3: Don't pass irq flags to flush_qp()
      RDMA/iwcm: Reject connect requests if cmid is not in LISTEN state

Swapna Thete (2):
      IB/mad: Add MAD error codes from IBA spec
      IB/mad: Return error response for unsupported MADs

Tatyana Nikolova (1):
      RDMA/nes: Fixes for sparse endianness warnings

 drivers/infiniband/core/iwcm.c               |   24 +++--
 drivers/infiniband/core/mad.c                |   21 ++++
 drivers/infiniband/core/sysfs.c              |   27 +++---
 drivers/infiniband/core/ucma.c               |   37 ++++----
 drivers/infiniband/hw/amso1100/c2_provider.c |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c  |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c        |   40 ++++----
 drivers/infiniband/hw/cxgb4/cm.c             |    2 +-
 drivers/infiniband/hw/cxgb4/provider.c       |    2 +-
 drivers/infiniband/hw/ehca/ehca_hca.c        |    2 +-
 drivers/infiniband/hw/ehca/ehca_irq.c        |    3 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c       |    2 +-
 drivers/infiniband/hw/mlx4/cq.c              |    6 +-
 drivers/infiniband/hw/mlx4/main.c            |  130 +++++++++++++------------
 drivers/infiniband/hw/mlx4/qp.c              |    1 +
 drivers/infiniband/hw/mthca/mthca_cq.c       |    3 +-
 drivers/infiniband/hw/nes/nes_cm.c           |   39 +++++----
 drivers/infiniband/hw/nes/nes_verbs.c        |    2 +-
 drivers/infiniband/hw/qib/qib.h              |   10 ++-
 drivers/infiniband/hw/qib/qib_iba7322.c      |  107 +++++++++++++++------
 drivers/infiniband/hw/qib/qib_mad.c          |    4 +-
 drivers/infiniband/hw/qib/qib_pcie.c         |   21 ++++-
 drivers/infiniband/hw/qib/qib_rc.c           |    1 -
 drivers/infiniband/hw/qib/qib_uc.c           |    1 -
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |    3 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c     |   18 +---
 drivers/infiniband/ulp/iser/iscsi_iser.h     |    1 +
 drivers/infiniband/ulp/iser/iser_initiator.c |   42 ++++-----
 drivers/infiniband/ulp/iser/iser_verbs.c     |   12 +++
 drivers/infiniband/ulp/srp/ib_srp.c          |  103 +++++++++-----------
 drivers/infiniband/ulp/srpt/ib_srpt.c        |    2 +-
 drivers/net/ethernet/mellanox/mlx4/eq.c      |   32 ++++++-
 drivers/net/ethernet/mellanox/mlx4/main.c    |  126 +++++++++++++++++++++++--
 drivers/net/ethernet/mellanox/mlx4/mlx4.h    |    9 ++-
 drivers/net/ethernet/mellanox/mlx4/mr.c      |    3 +
 drivers/net/ethernet/mellanox/mlx4/port.c    |   68 +++++---------
 drivers/net/ethernet/mellanox/mlx4/profile.c |   19 ++++
 include/linux/mlx4/device.h                  |   12 ++-
 include/rdma/ib_mad.h                        |    9 ++
 include/rdma/ib_verbs.h                      |   11 ++-
 40 files changed, 607 insertions(+), 352 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-02-25  2:32 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-02-25  2:32 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git rdma-for-linus

----------------------------------------------------------------
One InfiniBand/RDMA regression fix for 3.3:

 - mlx4 SR-IOV changes added static exported functions, which doesn't
   build on powerpc at least.  Fix from Doug Ledford for this.

----------------------------------------------------------------
Doug Ledford (1):
      mlx4_core: Exported functions can't be static

 drivers/net/ethernet/mellanox/mlx4/fw.c |    2 +-
 drivers/net/ethernet/mellanox/mlx4/mr.c |   12 ++++++------
 2 files changed, 7 insertions(+), 7 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-02-07 17:34 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-02-07 17:34 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, target-devel, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git ib-srpt-fixes

This will get a few small cleanups and fixes for the srpt fabric
driver.  The driver is new for 3.3 so it makes sense to get this in
before the first release.

----------------------------------------------------------------
Cleanups and error path fixes for the new SRP (SCSI RDMA protocol) target.

----------------------------------------------------------------
Dan Carpenter (1):
      IB/srpt: Fix ERR_PTR() vs. NULL checking confusion

Jesper Juhl (2):
      IB/srpt: Remove unneeded <linux/version.h> include
      IB/srpt: Don't return freed pointer from srpt_alloc_ioctx_ring()

Roland Dreier (2):
      IB/srpt: Use DEFINE_SPINLOCK()/LIST_HEAD()
      IB/srpt: Use ARRAY_SIZE() instead of open-coding

 drivers/infiniband/ulp/srpt/ib_srpt.c |   17 +++++++----------
 drivers/infiniband/ulp/srpt/ib_srpt.h |    1 -
 2 files changed, 7 insertions(+), 11 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2012-01-06 17:38 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2012-01-06 17:38 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

[Trying the signed tag thing for the first time here]

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git infiniband-for-linus

This will get my small batch of stuff for 3.3:
 - Fix for userspace-provokable multicast membership list corruption
 - Fix for CM protocol message layout
 - Fixes and cleanups for qib hardware driver
 - Fixes and cleanup for nes hardware driver
 - Fix for mlx4 handling of Ethernet priority bits
 - Fix for bugs and warnings found by sparse in core code

Eli Cohen (2):
      IB/uverbs: Protect QP multicast list
      IB/cm: Fix layout of APR message

Mike Marciniszyn (4):
      IB/qib: Fix style issues
      IB/qib: Eliminate 64-bit jiffies use
      IB/qib: Optimize locking for get_txreq()
      IB/qib: Default some module parameters optimally

Or Gerlitz (1):
      IB/mlx4: Fix SL to 802.1Q priority-bits mapping for IBoE

Ram Vepa (1):
      IB/qib: Fix a possible data corruption when receiving packets

Roland Dreier (1):
      Merge branches 'cma', 'misc', 'mlx4', 'nes', 'qib' and 'uverbs' into for-next

Sean Hefty (2):
      RDMA/cma: Fix endianness bugs
      rdma/core: Fix sparse warnings

Tatyana Nikolova (3):
      RDMA/nes: Change MDIO bus clock to 2.5MHz
      RDMA/nes: Make unnecessarily global nes_set_pau() static
      RDMA/nes: Fix terminate during AE

 drivers/infiniband/core/cm_msgs.h       |    1 +
 drivers/infiniband/core/cma.c           |    6 ++--
 drivers/infiniband/core/ucm.c           |    3 --
 drivers/infiniband/core/uverbs_cmd.c    |   27 ++++++++++++++-----
 drivers/infiniband/hw/mlx4/ah.c         |    2 +-
 drivers/infiniband/hw/mlx4/cq.c         |    6 +++-
 drivers/infiniband/hw/mlx4/qp.c         |    4 +-
 drivers/infiniband/hw/nes/nes_cm.c      |    1 +
 drivers/infiniband/hw/nes/nes_hw.c      |    6 +---
 drivers/infiniband/hw/nes/nes_utils.c   |    2 +-
 drivers/infiniband/hw/qib/qib_7220.h    |    2 +-
 drivers/infiniband/hw/qib/qib_driver.c  |    3 +-
 drivers/infiniband/hw/qib/qib_iba6120.c |    4 ++-
 drivers/infiniband/hw/qib/qib_iba7220.c |   10 ++++---
 drivers/infiniband/hw/qib/qib_iba7322.c |   40 ++++++++++++++--------------
 drivers/infiniband/hw/qib/qib_init.c    |    2 +-
 drivers/infiniband/hw/qib/qib_pcie.c    |    4 +-
 drivers/infiniband/hw/qib/qib_qsfp.h    |    2 +-
 drivers/infiniband/hw/qib/qib_sd7220.c  |    2 +-
 drivers/infiniband/hw/qib/qib_sysfs.c   |    2 +-
 drivers/infiniband/hw/qib/qib_verbs.c   |   43 +++++++++++++++++++++++-------
 include/rdma/ib_addr.h                  |    2 +-
 include/rdma/ib_cm.h                    |    3 ++
 23 files changed, 109 insertions(+), 68 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-12-19 17:39 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-12-19 17:39 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few last fixes:

 - Fix for crash on mlx4 module unload
 - Fix for crash on too-long private data in RDMA CM
 - Trivial fix for context counting bug in qib

Thanks!

Mike Marciniszyn (1):
      IB/qib: Correct sense on freectxts increment and decrement

Roland Dreier (2):
      IB/mlx4: Fix shutdown crash accessing a non-existent bitmap
      Merge branches 'cma', 'mlx4' and 'qib' into for-next

Sean Hefty (1):
      RDMA/cma: Verify private data length

 drivers/infiniband/core/cma.c            |    6 ++++++
 drivers/infiniband/hw/mlx4/main.c        |    6 ++++--
 drivers/infiniband/hw/qib/qib_file_ops.c |    4 ++--
 3 files changed, 12 insertions(+), 4 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-11-30 17:50 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-11-30 17:50 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few fixes:

 - Fixes for missing RCU read locking due to net neighbour changes
 - Fix for IPoIB softlockup in error path
 - Low-level driver fixes to cxgb4 and qib

Thanks!

Eric Dumazet (1):
      IB: Fix RCU lockdep splats

Jonathan Lallinger (1):
      RDMA/cxgb4: Fix iw_cxgb4 count_rcqes() logic

Kumar Sanghvi (1):
      RDMA/cxgb4: Fix retry with MPAv1 logic for MPAv2

Mike Marciniszyn (3):
      IB/qib: Don't use schedule_work()
      IB/qib: Fix over-scheduling of QSFP work
      IB/ipoib: Prevent hung task or softlockup processing multicast response

Roland Dreier (1):
      Merge branches 'cxgb4', 'ipoib', 'misc' and 'qib' into for-next

 drivers/infiniband/core/addr.c                 |    9 ++++++---
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |    4 ++++
 drivers/infiniband/hw/cxgb4/cm.c               |   10 +++++++++-
 drivers/infiniband/hw/cxgb4/cq.c               |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c             |    6 ++++--
 drivers/infiniband/hw/qib/qib_iba7322.c        |   18 +++++++++---------
 drivers/infiniband/hw/qib/qib_qsfp.c           |   12 ------------
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |   13 ++++++++-----
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   20 ++++++++++++--------
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   13 +++++++++----
 10 files changed, 62 insertions(+), 45 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-11-04 18:26 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-11-04 18:26 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few more 3.2 merge window changes:

 - a panic fix for the qib hardware driver
 - a couple of cleanups to iSER's use of the DMA mapping API
 - a fix to mthca that reduces memory use a bit

Mike Marciniszyn (1):
      IB/qib: Fix panic in RC error flushing logic

Or Gerlitz (2):
      IB/iser: Use separate buffers for the login request/response
      IB/iser: DMA unmap TX bufs used for iSCSI/iSER headers

Roland Dreier (2):
      IB/mthca: Fix buddy->num_free allocation size
      Merge branches 'iser', 'mthca' and 'qib' into for-next

 drivers/infiniband/hw/mthca/mthca_mr.c       |    2 +-
 drivers/infiniband/hw/qib/qib_rc.c           |   10 ++-----
 drivers/infiniband/ulp/iser/iscsi_iser.c     |   11 ++++++--
 drivers/infiniband/ulp/iser/iscsi_iser.h     |    4 +-
 drivers/infiniband/ulp/iser/iser_initiator.c |   31 ++++++++++++++++++-----
 drivers/infiniband/ulp/iser/iser_verbs.c     |   33 ++++++++++++++++++++-----
 6 files changed, 64 insertions(+), 27 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-11-01 16:54 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-11-01 16:54 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

From: Roland Dreier <roland@kernel.org>

Hi Linus,

Please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the main batch of changes for 3.2.  One note: my tree is
based on 3.1-rc9, and I have some changes to drivers/net/mlx4, but in
your tree that driver has moved to drivers/net/ethernet/mellanox/mlx4.
With a high enough merge.renamelimit, git handles this merge fine in
my test, so I'm assuming you would want to do the merge yourself.

Anyway, the main things here are:
 - Finally we get XRC support upstream, thanks to Sean Hefty's
   cleaning up of the series.
 - MPAv2 support for iWARP devices, which makes negotiating limits
   during connection much cleaner.
 - Support for reporting new higher link speeds (FDR, FDR-10, EDR).
 - Optimizations to the qib driver.
 - Various fixes and cleanups, mostly to low-level hardware drivers.

Andy Shevchenko (1):
      RDMA/amso1100: Use '%pM' format option to print MAC

Dotan Barak (2):
      mlx4_core: Use the right function to free eq->page_list entries
      IPoIB: Use the right function to do DMA unmap pages

Eli Cohen (1):
      mlx4_core: Fix buddy->num_free allocation size

Faisal Latif (3):
      RDMA/nes: Fix terminate connection
      RDMA/nes: Print IP address for critcal errors
      RDMA/nes: Support for Packed And Unaligned fpdus

Hefty, Sean (4):
      RDMA/cma: Fix crash in cma_req_handler
      RDMA/cma: Check for NULL conn_param in rdma_accept
      IB/mad: Verify mgmt class in received MADs
      RDMA/ucm: Removed checks for unsigned value < 0

Jonathan Lallinger (1):
      RDMA/cxgb4: Use correct QID in insert_recv_cqe()

Julia Lawall (1):
      RDMA/nes: Add missing calls to ib_umem_release()

Kumar Sanghvi (6):
      RDMA/iwcm: Propagate ird/ord values upwards
      RDMA/{amso1100,cxgb3}: Minimal MPAv2 support
      RDMA/cxgb4: Add support for MPAv2 Enhanced RDMA Negotiation
      RDMA/cxgb4: Make sure flush CQ entries are collected on connection close
      RDMA/cxgb3: Serialize calls to CQ's comp_handler
      RDMA/cxgb4: Serialize calls to CQ's comp_handler

Marcel Apfelbaum (4):
      IB: Add new InfiniBand link speeds
      IPoIB: Handle extended rates in debugfs
      mlx4_core: Add extended port capabilities support
      IB/mlx4: Configure extended active speeds

Mike Marciniszyn (8):
      IB/qib: Correct nfreectxts for multiple HCAs
      IB/qib: Optimize RC/UC code by IB operation
      IB/qib: Decode path MTU optimization
      IB/qib: Eliminate divide/mod in converting idx to egr buf pointer
      IB/qib: Use RCU for qpn lookup
      IB/qib: Precompute timeout jiffies to optimize latency
      IB/qib: Remove s_lock around header validation
      IB/qib: Clean up checkpatch issue

Mitko Haralanov (2):
      IB/qib: Hold links until tuning data is available
      IB/qib: Fix issue with link states and QSFP cables

Or Gerlitz (3):
      IB/mlx4: Enable 4K mtu for IBoE
      IB/mlx4: Don't set VLAN in IBoE WQEs' control segment
      mlx4_core: Deprecate log_num_vlan module param

Randy Dunlap (1):
      IB/ipath: Add missing <linux/stat.h> in ipath_chip_init.c

Roland Dreier (2):
      mlx4_core: Clean up error flow in mlx4_register_mac()
      Merge branches 'amso1100', 'cma', 'cxgb3', 'cxgb4', 'fdr', 'ipath', 'ipoib', 'misc', 'mlx4', 'misc', 'nes', 'qib' and 'xrc' into for-next

Sean Hefty (20):
      RDMA/core: Add XRC domain support
      RDMA/core: Add SRQ type field
      RDMA/core: Add XRC SRQ type
      RDMA/core: Add XRC QPs
      RDMA/verbs: Cleanup XRC TGT QPs when destroying XRCD
      RDMA/uverbs: Export XRC domains to user space
      RDMA/uverbs: Export XRC SRQs to user space
      RDMA/uverbs: Export XRC INI QPs to userspace
      RDMA/uverbs: Export XRC TGT QPs to user space
      IB/cm: Update protocol to support XRC
      IB/cm: Update XRC support based on XRC annex errata
      RDMA/cm: Define new RDMA port space specific to IB
      RDMA/ucm: Allow user to specify QP type when creating id
      RDMA/cma: Support XRC QPs
      IB/cm: Do not automatically disconnect XRC TGT QPs
      IB/mlx4: Add support for XRC domains
      IB/mlx4: Add support for XRC SRQs
      IB/mlx4: Add support for XRC QPs
      RDMA/core: Export ib_open_qp() to share XRC TGT QPs
      RDMA/uverbs: Export ib_open_qp() capability to user space

Steve Wise (1):
      RDMA/cxgb4: Fail RDMA initialization for unsupported cards

Tatyana Nikolova (1):
      RDMA/nes: Add support for MPAv2 Enhanced RDMA Negotiation

Tom Tucker (1):
      RDMA/cxgb4: Mark QP in error before disabling the queue in firmware

Yong Zhang (1):
      IB/ehca: Remove IRQF_DISABLED, since it's a no-op

 drivers/infiniband/core/cm.c                  |   63 +-
 drivers/infiniband/core/cm_msgs.h             |   32 +-
 drivers/infiniband/core/cma.c                 |   67 +-
 drivers/infiniband/core/mad.c                 |    3 +
 drivers/infiniband/core/sysfs.c               |   26 +-
 drivers/infiniband/core/ucm.c                 |    2 +-
 drivers/infiniband/core/ucma.c                |    7 +-
 drivers/infiniband/core/user_mad.c            |    5 +-
 drivers/infiniband/core/uverbs.h              |   18 +
 drivers/infiniband/core/uverbs_cmd.c          |  703 ++++++++++++++--
 drivers/infiniband/core/uverbs_main.c         |   30 +-
 drivers/infiniband/core/verbs.c               |  376 ++++++++-
 drivers/infiniband/hw/amso1100/c2_ae.c        |    5 +
 drivers/infiniband/hw/amso1100/c2_intr.c      |    5 +
 drivers/infiniband/hw/amso1100/c2_provider.c  |    5 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c         |   10 +
 drivers/infiniband/hw/cxgb3/iwch_ev.c         |    6 +
 drivers/infiniband/hw/cxgb3/iwch_provider.c   |    1 +
 drivers/infiniband/hw/cxgb3/iwch_provider.h   |    1 +
 drivers/infiniband/hw/cxgb3/iwch_qp.c         |   14 +-
 drivers/infiniband/hw/cxgb4/cm.c              |  469 +++++++++-
 drivers/infiniband/hw/cxgb4/cq.c              |    3 +-
 drivers/infiniband/hw/cxgb4/device.c          |   41 +-
 drivers/infiniband/hw/cxgb4/ev.c              |   10 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h        |   23 +-
 drivers/infiniband/hw/cxgb4/qp.c              |   39 +-
 drivers/infiniband/hw/ehca/ehca_eq.c          |    4 +-
 drivers/infiniband/hw/ehca/ehca_qp.c          |    3 +
 drivers/infiniband/hw/ipath/ipath_init_chip.c |    1 +
 drivers/infiniband/hw/ipath/ipath_srq.c       |    5 +
 drivers/infiniband/hw/mlx4/main.c             |  106 +++-
 drivers/infiniband/hw/mlx4/mlx4_ib.h          |   13 +
 drivers/infiniband/hw/mlx4/qp.c               |  131 ++-
 drivers/infiniband/hw/mlx4/srq.c              |   10 +-
 drivers/infiniband/hw/mthca/mthca_provider.c  |    3 +
 drivers/infiniband/hw/nes/Makefile            |    2 +-
 drivers/infiniband/hw/nes/nes.c               |    8 +-
 drivers/infiniband/hw/nes/nes.h               |   17 +-
 drivers/infiniband/hw/nes/nes_cm.c            | 1121 ++++++++++++++----------
 drivers/infiniband/hw/nes/nes_cm.h            |   75 ++-
 drivers/infiniband/hw/nes/nes_hw.c            |   99 ++-
 drivers/infiniband/hw/nes/nes_hw.h            |   35 +-
 drivers/infiniband/hw/nes/nes_mgt.c           | 1162 +++++++++++++++++++++++++
 drivers/infiniband/hw/nes/nes_mgt.h           |   97 ++
 drivers/infiniband/hw/nes/nes_nic.c           |    4 +
 drivers/infiniband/hw/nes/nes_utils.c         |   53 +-
 drivers/infiniband/hw/nes/nes_verbs.c         |    8 +-
 drivers/infiniband/hw/nes/nes_verbs.h         |   12 +-
 drivers/infiniband/hw/qib/qib.h               |   15 +-
 drivers/infiniband/hw/qib/qib_driver.c        |   20 +-
 drivers/infiniband/hw/qib/qib_file_ops.c      |    2 +
 drivers/infiniband/hw/qib/qib_iba6120.c       |    2 +
 drivers/infiniband/hw/qib/qib_iba7220.c       |    2 +
 drivers/infiniband/hw/qib/qib_iba7322.c       |  135 ++-
 drivers/infiniband/hw/qib/qib_init.c          |    8 +-
 drivers/infiniband/hw/qib/qib_qp.c            |   90 ++-
 drivers/infiniband/hw/qib/qib_qsfp.c          |   25 +-
 drivers/infiniband/hw/qib/qib_qsfp.h          |    3 +
 drivers/infiniband/hw/qib/qib_rc.c            |   36 +-
 drivers/infiniband/hw/qib/qib_ruc.c           |    7 +-
 drivers/infiniband/hw/qib/qib_srq.c           |    5 +
 drivers/infiniband/hw/qib/qib_sysfs.c         |    3 +-
 drivers/infiniband/hw/qib/qib_uc.c            |   25 +-
 drivers/infiniband/hw/qib/qib_verbs.c         |   36 +-
 drivers/infiniband/hw/qib/qib_verbs.h         |    5 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c       |    5 +-
 drivers/infiniband/ulp/ipoib/ipoib_fs.c       |    7 +-
 drivers/net/mlx4/eq.c                         |    2 +-
 drivers/net/mlx4/fw.c                         |    6 +
 drivers/net/mlx4/fw.h                         |    2 +
 drivers/net/mlx4/main.c                       |   36 +-
 drivers/net/mlx4/mlx4.h                       |    4 +
 drivers/net/mlx4/mr.c                         |    2 +-
 drivers/net/mlx4/pd.c                         |   30 +
 drivers/net/mlx4/port.c                       |   72 ++-
 drivers/net/mlx4/qp.c                         |    3 +
 drivers/net/mlx4/srq.c                        |   20 +-
 include/linux/mlx4/device.h                   |   16 +-
 include/linux/mlx4/qp.h                       |    3 +-
 include/rdma/ib_user_verbs.h                  |   48 +-
 include/rdma/ib_verbs.h                       |  106 +++-
 include/rdma/iw_cm.h                          |    4 +-
 include/rdma/rdma_cm.h                        |    1 +
 include/rdma/rdma_user_cm.h                   |    3 +-
 84 files changed, 4738 insertions(+), 984 deletions(-)
 create mode 100644 drivers/infiniband/hw/nes/nes_mgt.c
 create mode 100644 drivers/infiniband/hw/nes/nes_mgt.h

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

* [GIT PULL] please pull infiniband.git
@ 2011-08-18 15:54 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-08-18 15:54 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Hi Linus,

Please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few fixes:
 - Fix for crash on boot in IPoIB from Bernd Schubert
 - Two iSER bugs from Or Gerlitz

Bernd Schubert (1):
      IPoIB: Fix possible NULL dereference in ipoib_start_xmit()

Or Gerlitz (2):
      IBiser: Fix wrong mask when sizeof (dma_addr_t) > sizeof (unsigned long)
      IB/iser: Support iSCSI PDU padding

Roland Dreier (1):
      Merge branches 'ipoib' and 'iser' into for-next

 drivers/infiniband/ulp/ipoib/ipoib_main.c    |    8 +++++---
 drivers/infiniband/ulp/iser/iscsi_iser.c     |   10 +++++++---
 drivers/infiniband/ulp/iser/iscsi_iser.h     |    2 +-
 drivers/infiniband/ulp/iser/iser_initiator.c |    2 +-
 4 files changed, 14 insertions(+), 8 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-07-22 19:08 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-07-22 19:08 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel, linux-rdma

Hi Linus,

Congrats on the recent version number bump.  Please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get my 3.1 merge window changes:
 - Various fixes to the qib hardware driver.
 - Improvements to IBoE support, mostly in the mlx4 hardware driver.
 - A nice cleanup to the mthca driver from Goldwyn Rodrigues that
   actually lets this pull request delete more lines than it adds.
 - Various other small fixes.

Bart Van Assche (2):
      IB/srp: Avoid duplicate devices from LUN scan
      RDMA: Allow for NULL .modify_device() and .modify_port() methods

Dotan Barak (1):
      mlx4_core: Bump the driver version to 1.0

Edwin van Vliet (1):
      IB/qib: Remove double define

Goldwyn Rodrigues (1):
      IB/mthca: Stop returning separate error and status from FW commands

Jack Morgenstein (1):
      RDMA/cma: Avoid assigning an IS_ERR value to cm_id pointer in CMA id object

Jon Mason (2):
      IB/qib: Remove unnecessary read of PCI_CAP_ID_EXP
      IB/mthca: Remove unnecessary read of PCI_CAP_ID_EXP

Manuel Zerpies (1):
      RDMA/cxgb4: Use printk_ratelimited() instead of printk_ratelimit()

Mike Marciniszyn (2):
      MAINTAINERS: Update ipath/qib (QLogic IB adapter) entries
      IB/qib: Defer HCA error events to tasklet

Mitko Haralanov (1):
      IB/qib: Update active link width

Moni Shoua (1):
      RDMA/cma: Don't allow IPoIB port space for IBoE

Motohiro KOSAKI (2):
      IB/qib: Convert old cpumask api into new one
      IB/ipath: Convert old cpumask api into new one

Or Gerlitz (9):
      IB/core: Add GID change event
      IB/mlx4: Generate GID change events in IBoE code
      mlx4_core: Extend capability flags to 64 bits
      mlx4_core: Read extended capabilities into the flags field
      mlx4_core: Fix location of counter index in QP context struct
      mlx4_core: Add network flow counters
      IB/pma: Add include file for IBA performance counters definitions
      IB/mlx4: Use flow counters on IBoE ports
      IB/mlx4: Support PMA counters for IBoE

Ram Vepa (2):
      IB/qib: Add sysfs interface to read free contexts
      IB/qib: Fix potential deadlock with link down interrupt

Roland Dreier (1):
      Merge branches 'cma', 'cxgb4', 'ipath', 'misc', 'mlx4', 'mthca', 'qib' and 'srp' into for-next

 MAINTAINERS                                  |   11 +-
 drivers/infiniband/core/cache.c              |    3 +-
 drivers/infiniband/core/cma.c                |   84 ++++----
 drivers/infiniband/core/device.c             |    6 +
 drivers/infiniband/hw/amso1100/c2_provider.c |    9 -
 drivers/infiniband/hw/cxgb3/iwch_provider.c  |    8 -
 drivers/infiniband/hw/cxgb4/provider.c       |    8 -
 drivers/infiniband/hw/cxgb4/resource.c       |    9 +-
 drivers/infiniband/hw/ipath/ipath_file_ops.c |   11 +-
 drivers/infiniband/hw/ipath/ipath_mad.c      |  198 +++---------------
 drivers/infiniband/hw/mlx4/mad.c             |   68 +++++++-
 drivers/infiniband/hw/mlx4/main.c            |   21 ++-
 drivers/infiniband/hw/mlx4/mlx4_ib.h         |    1 +
 drivers/infiniband/hw/mlx4/qp.c              |   10 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c      |  276 ++++++++++++++------------
 drivers/infiniband/hw/mthca/mthca_cmd.h      |   93 ++++-----
 drivers/infiniband/hw/mthca/mthca_cq.c       |   15 +--
 drivers/infiniband/hw/mthca/mthca_eq.c       |   43 +---
 drivers/infiniband/hw/mthca/mthca_mad.c      |   15 +-
 drivers/infiniband/hw/mthca/mthca_main.c     |  175 +++++------------
 drivers/infiniband/hw/mthca/mthca_mcg.c      |  101 +++-------
 drivers/infiniband/hw/mthca/mthca_memfree.c  |   43 ++---
 drivers/infiniband/hw/mthca/mthca_mr.c       |   35 +---
 drivers/infiniband/hw/mthca/mthca_provider.c |   77 +------
 drivers/infiniband/hw/mthca/mthca_qp.c       |   49 ++----
 drivers/infiniband/hw/mthca/mthca_reset.c    |    2 +-
 drivers/infiniband/hw/mthca/mthca_srq.c      |   33 +---
 drivers/infiniband/hw/nes/nes_verbs.c        |   11 -
 drivers/infiniband/hw/qib/qib.h              |    3 +
 drivers/infiniband/hw/qib/qib_file_ops.c     |   16 +-
 drivers/infiniband/hw/qib/qib_iba7220.c      |   26 +++-
 drivers/infiniband/hw/qib/qib_iba7322.c      |   72 +++++--
 drivers/infiniband/hw/qib/qib_mad.c          |   78 ++++----
 drivers/infiniband/hw/qib/qib_mad.h          |  143 +-------------
 drivers/infiniband/hw/qib/qib_pcie.c         |    8 +-
 drivers/infiniband/hw/qib/qib_sysfs.c        |   14 ++
 drivers/infiniband/ulp/srp/ib_srp.c          |    2 +
 drivers/net/mlx4/en_ethtool.c                |    9 +-
 drivers/net/mlx4/en_main.c                   |    3 +-
 drivers/net/mlx4/en_netdev.c                 |    5 +-
 drivers/net/mlx4/en_port.c                   |    6 +-
 drivers/net/mlx4/en_selftest.c               |    3 +-
 drivers/net/mlx4/fw.c                        |   39 +++--
 drivers/net/mlx4/fw.h                        |    8 +-
 drivers/net/mlx4/main.c                      |   58 +++++-
 drivers/net/mlx4/mcg.c                       |   17 +-
 drivers/net/mlx4/mlx4.h                      |    5 +-
 drivers/net/mlx4/port.c                      |    8 +-
 include/linux/mlx4/cmd.h                     |    3 +
 include/linux/mlx4/device.h                  |   60 ++++--
 include/linux/mlx4/qp.h                      |    8 +-
 include/rdma/ib_pma.h                        |  156 +++++++++++++++
 include/rdma/ib_verbs.h                      |    3 +-
 53 files changed, 1006 insertions(+), 1162 deletions(-)
 create mode 100644 include/rdma/ib_pma.h

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

* [GIT PULL] please pull infiniband.git
@ 2011-06-21 16:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-06-21 16:18 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few fixes for the cxgb4 and qib hardware device drivers.

Mitko Haralanov (1):
      IB/qib: Ensure that LOS and DFE are being turned off

Roland Dreier (1):
      Merge branches 'cxgb4' and 'qib' into for-next

Steve Wise (3):
      RDMA/cxgb4: Don't exceed hw IQ depth limit for user CQs
      RDMA/cxgb4: Don't truncate MR lengths
      RDMA/cxgb4: Couple of abort fixes

 drivers/infiniband/hw/cxgb4/cm.c        |   46 +++++++++++++++++++++++++------
 drivers/infiniband/hw/cxgb4/cq.c        |    4 +++
 drivers/infiniband/hw/cxgb4/mem.c       |    2 +-
 drivers/infiniband/hw/cxgb4/qp.c        |    5 +---
 drivers/infiniband/hw/qib/qib_iba7322.c |   25 ++++++++++++-----
 drivers/infiniband/hw/qib/qib_intr.c    |    6 +++-
 6 files changed, 66 insertions(+), 22 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-05-26 16:46 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-05-26 16:46 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the second, main batch of 2.6.40 changes:
 - Add netlink-based way to dump active RDMA connections
 - Update char devices to use /dev/infiniband/... paths
 - Chelsio driver fixes
 - Fix for crash on access to QP0 with IBoE devices
 - Couple of warning fixes

Ira Weiny (1):
      IB/mad: Return EPROTONOSUPPORT when an RDMA device lacks the QP required

Liu Yuan (1):
      RDMA/nes: Add a check for strict_strtoul()

Nir Muchtar (4):
      RDMA: Add error handling to ib_core_init()
      RDMA/cma: Export enum cma_state in <rdma/rdma_cm.h>
      RDMA/cma: Add support for netlink statistics export
      RDMA/cma: Save PID of ID's owner

Roland Dreier (7):
      RDMA: Add netlink infrastructure
      RDMA/ucma: Add .nodename/.mode to tell userspace where to create device node
      IB/uverbs: Add devnode method to set path/mode
      IB: Add devnode methods to cm_class and umad_class
      IB/srp: Fix integer -> pointer cast warnings
      RDMA: Update exported headers list
      Merge branches 'cma', 'cxgb3', 'cxgb4', 'misc', 'nes', 'netlink', 'srp' and 'uverbs' into for-next

Sean Hefty (1):
      RDMA/cma: Pass QP type into rdma_create_id()

Steve Wise (2):
      RDMA/cxgb4: Use completion objects for event blocking
      RDMA/cxgb3: Don't post zero-byte read if endpoint is going away

 drivers/infiniband/Kconfig                  |    1 +
 drivers/infiniband/core/Makefile            |    2 +-
 drivers/infiniband/core/cm.c                |    8 +
 drivers/infiniband/core/cma.c               |  308 +++++++++++++++++----------
 drivers/infiniband/core/device.c            |   25 ++-
 drivers/infiniband/core/mad.c               |    7 +
 drivers/infiniband/core/netlink.c           |  190 +++++++++++++++++
 drivers/infiniband/core/ucma.c              |   35 +++-
 drivers/infiniband/core/user_mad.c          |    7 +
 drivers/infiniband/core/uverbs_main.c       |    8 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c       |   26 ++-
 drivers/infiniband/hw/cxgb3/iwch_provider.h |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c       |    6 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h      |   18 +--
 drivers/infiniband/hw/nes/nes.c             |    4 +-
 drivers/infiniband/hw/qib/Kconfig           |    2 +-
 drivers/infiniband/ulp/iser/iser_verbs.c    |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c         |    4 +-
 include/linux/netlink.h                     |    1 +
 include/rdma/Kbuild                         |    5 +
 include/rdma/ib_user_cm.h                   |    1 +
 include/rdma/rdma_cm.h                      |   19 ++-
 include/rdma/rdma_netlink.h                 |   92 ++++++++
 net/9p/trans_rdma.c                         |    3 +-
 net/rds/ib.c                                |    2 +-
 net/rds/ib_cm.c                             |    2 +-
 net/rds/iw.c                                |    2 +-
 net/rds/iw_cm.c                             |    2 +-
 net/rds/rdma_transport.c                    |    3 +-
 net/sunrpc/xprtrdma/svc_rdma_transport.c    |    3 +-
 net/sunrpc/xprtrdma/verbs.c                 |    2 +-
 31 files changed, 633 insertions(+), 159 deletions(-)
 create mode 100644 drivers/infiniband/core/netlink.c
 create mode 100644 include/rdma/rdma_netlink.h

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

* [GIT PULL] please pull infiniband.git
@ 2011-05-19 18:17 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-05-19 18:17 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first batch of 2.6.40 changes: mostly fixes to the
cxgb4 and qib low-level drivers, plus a couple of RDMA CM fixes.

Hefty, Sean (2):
      RDMA/cma: Fix handling of IPv6 addressing in cma_use_port
      RDMA/cma: Add an ID_REUSEADDR option

Mitko Haralanov (1):
      IB/qib: Prevent driver hang with unprogrammed boards

Roel Kluin (1):
      RDMA/cxgb4: Fix missing parentheses

Roland Dreier (2):
      RDMA/iwcm: Get rid of enum iw_cm_event_status
      Merge branches 'cma', 'cxgb4' and 'qib' into for-next

Sergei Shtylyov (2):
      IB/ipath: Use pci_dev->revision, again
      IB/qib: Use pci_dev->revision

Steve Wise (4):
      RDMA/cxgb4: Don't change QP state outside EP lock
      RDMA/cxgb4: Initialization errors can cause crash
      RDMA/cxgb4: Reset wait condition atomically
      RDMA/cxgb4: EEH errors can hang the driver

 drivers/infiniband/core/cma.c              |  207 +++++++++++++++++++---------
 drivers/infiniband/core/iwcm.c             |    2 +-
 drivers/infiniband/core/ucma.c             |    7 +
 drivers/infiniband/hw/cxgb4/cm.c           |   46 ++-----
 drivers/infiniband/hw/cxgb4/device.c       |  115 +++++++++-------
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h     |   36 ++++--
 drivers/infiniband/hw/cxgb4/provider.c     |    2 -
 drivers/infiniband/hw/cxgb4/qp.c           |    3 +-
 drivers/infiniband/hw/ipath/ipath_driver.c |    9 +-
 drivers/infiniband/hw/nes/nes_cm.c         |   16 +-
 drivers/infiniband/hw/nes/nes_verbs.c      |    2 +-
 drivers/infiniband/hw/qib/qib_iba7322.c    |    3 +-
 drivers/infiniband/hw/qib/qib_pcie.c       |    5 +-
 include/rdma/iw_cm.h                       |   11 +--
 include/rdma/rdma_cm.h                     |   10 ++
 include/rdma/rdma_user_cm.h                |    5 +-
 16 files changed, 278 insertions(+), 201 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-03-25 19:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-03-25 19:07 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one fix for a bug introduced into the nes driver through
the net tree:

Roland Dreier (1):
      RDMA/nes: Fix test of uninitialized netdev

 drivers/infiniband/hw/nes/nes_cm.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2011-03-23 17:47 Roland Dreier
@ 2011-03-23 18:15 ` Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-03-23 18:15 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-rdma, linux-kernel

On Wed, Mar 23, 2011 at 10:47 AM, Roland Dreier <roland@kernel.org> wrote:
> drivers/infiniband/core/addr.c           |    2 +-
>  drivers/infiniband/core/agent.c          |    3 +-
>  drivers/infiniband/hw/mthca/mthca_main.c |    3 +
>  drivers/infiniband/hw/nes/nes.c          |    2 +-
>  drivers/infiniband/ulp/srp/ib_srp.c      |  725 ++++++++++++++++++++----------
>  drivers/infiniband/ulp/srp/ib_srp.h      |   38 ++-
>  6 files changed, 521 insertions(+), 252 deletions(-)

Somehow I missed a hunk of

 IB: Increase DMA max_segment_size on Mellanox hardware

diffstat now should look like

 drivers/infiniband/core/addr.c           |    2 +-
 drivers/infiniband/core/agent.c          |    3 +-
 drivers/infiniband/hw/mthca/mthca_main.c |    3 +
 drivers/infiniband/hw/nes/nes.c          |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c      |  725 ++++++++++++++++++++----------
 drivers/infiniband/ulp/srp/ib_srp.h      |   38 ++-
 drivers/net/mlx4/main.c                  |    3 +
 7 files changed, 524 insertions(+), 252 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-03-23 17:47 Roland Dreier
  2011-03-23 18:15 ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2011-03-23 17:47 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the second batch of 2.6.39 changes:
 - Dave Dillow's SRP initiator changes
 - Fix to uninitialized return value introduced by net tree merge
 - A couple of other minor cleanups

David Dillow (7):
      IB/srp: always avoid non-zero offsets into an FMR
      IB/srp: move IB CM setup completion into its own function
      IB/srp: allow sg_tablesize to be set for each target
      IB/srp: rework mapping engine to use multiple FMR entries
      IB/srp: add support for indirect tables that don't fit in SRP_CMD
      IB/srp: try to use larger FMR sizes to cover our mappings
      IB: Increase DMA max_segment_size on Mellanox hardware

Michael Heinz (1):
      IB/mad: Improve an error message so error code is included

Roland Dreier (3):
      RDMA/nes: Don't print success message at level KERN_ERR
      Merge branch 'external-indirect' of git://git.kernel.org/.../dad/srp-initiator into srp
      Merge branches 'misc', 'nes' and 'srp' into for-next

Sean Hefty (1):
      RDMA/addr: Fix return of uninitialized ret value

 drivers/infiniband/core/addr.c           |    2 +-
 drivers/infiniband/core/agent.c          |    3 +-
 drivers/infiniband/hw/mthca/mthca_main.c |    3 +
 drivers/infiniband/hw/nes/nes.c          |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c      |  725 ++++++++++++++++++++----------
 drivers/infiniband/ulp/srp/ib_srp.h      |   38 ++-
 6 files changed, 521 insertions(+), 252 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-03-15 18:01 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-03-15 18:01 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first batch of 2.6.39 changes:
 - Fixes and improvements for the iw_cxgb4 low-level driver
 - Fixes to the ib_qib low-level driver
 - Fixes for crashes in the RDMA CM (also tagged for stable)

Mitko Haralanov (3):
      IB/qib: Return correct MAD when setting link width to 255
      IB/qib: Set default LE2 value for active cables to 0
      IB/qib: Fix M_Key field in SubnGet and SubnGetResp MADs

Nicolas Kaiser (1):
      IB/ipath: Don't reset disabled devices

Roland Dreier (1):
      Merge branches 'cma', 'cxgb4', 'ipath' and 'qib' into for-next

Sean Hefty (4):
      RDMA/cma: Fix crash in request handlers
      IB/cm: Bump reference count on cm_id before invoking callback
      IB/cm: Cancel pending LAP message when exiting IB_CM_ESTABLISH state
      RDMA/cma: Replace global lock in rdma_destroy_id() with id-specific one

Steve Wise (7):
      RDMA/cxgb4: Turn on delayed ACK
      RDMA/cxgb4: Remove db_drop_task
      RDMA/cxgb4: Do CIDX_INC updates every 1/16 CQ depth CQE reaps
      RDMA/cxgb4: Enable on-chip SQ support by default
      RDMA/cxgb4: Use ULP_MODE_TCPDDP
      RDMA/cxgb4: Dispatch FATAL event on EEH errors
      RDMA/cxgb4: Debugfs dump_qp() updates

 drivers/infiniband/core/cm.c              |   20 +++++++++-
 drivers/infiniband/core/cma.c             |   58 +++++++++++++++-------------
 drivers/infiniband/hw/cxgb4/cm.c          |    6 ++-
 drivers/infiniband/hw/cxgb4/device.c      |   24 +++++++++---
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h    |    1 -
 drivers/infiniband/hw/cxgb4/qp.c          |    4 +-
 drivers/infiniband/hw/cxgb4/t4.h          |    8 +++-
 drivers/infiniband/hw/ipath/ipath_sysfs.c |    1 +
 drivers/infiniband/hw/qib/qib_iba7322.c   |   13 +++++-
 drivers/infiniband/hw/qib/qib_mad.c       |   12 +++--
 drivers/infiniband/hw/qib/qib_qsfp.h      |    2 +
 drivers/net/cxgb4/t4_msg.h                |    1 +
 12 files changed, 102 insertions(+), 48 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-02-17 22:26 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-02-17 22:26 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few small things:
 - Don't send events for nonexistent nes devices
 - Fix a couple of double events in qib

Maciej Sosnowski (1):
      RDMA/nes: Don't generate async events for unregistered devices

Mike Marciniszyn (2):
      IB/qib: Fix double add_timer()
      IB/qib: Prevent double completions after a timeout or RNR error

Roland Dreier (1):
      Merge branches 'nes' and 'qib' into for-next

 drivers/infiniband/hw/nes/nes_hw.c |   32 ++++++++++++++++++++------------
 drivers/infiniband/hw/qib/qib_rc.c |    5 ++++-
 2 files changed, 24 insertions(+), 13 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-02-03 18:05 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-02-03 18:05 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few small things:
 - Low-level driver fixes to qib, cxgb4 and amso1100
 - Add PCI IDs for new Mellanox devices to mlx4
 - Add a dropped hunk of Tejun's workqueue conversion
 - Fix route query for iWARP connections

Mitko Haralanov (1):
      IB/qib: Hold link for TX SERDES settings

Ralf Thielow (1):
      RDMA/amso1100: Fix compile warnings

Roland Dreier (1):
      Merge branches 'amso1100', 'cma', 'cxgb4', 'misc', 'mlx4' and 'qib' into for-next

Steve Wise (3):
      RDMA/cxgb4: Limit MAXBURST EQ context field to 256B
      RDMA/cxgb4: Set the correct device physical function for iWARP connections
      RDMA/ucma: Copy iWARP route information on queries

Tejun Heo (1):
      RDMA: Update missed conversion of flush_scheduled_work()

Yevgeny Petrilin (1):
      mlx4_core: Add ConnectX-3 device IDs

 drivers/infiniband/core/sa_query.c      |    2 +-
 drivers/infiniband/core/ucma.c          |   22 ++++++++++++++++++++--
 drivers/infiniband/hw/amso1100/c2_vq.c  |    6 +++---
 drivers/infiniband/hw/cxgb4/cm.c        |    2 +-
 drivers/infiniband/hw/cxgb4/qp.c        |    4 ++--
 drivers/infiniband/hw/qib/qib_iba7322.c |   30 +++++++++++-------------------
 drivers/net/mlx4/main.c                 |   15 +++++++++++++++
 7 files changed, 53 insertions(+), 28 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2011-01-17 21:55 Roland Dreier
@ 2011-01-25 16:23 ` Tziporet Koren
  0 siblings, 0 replies; 223+ messages in thread
From: Tziporet Koren @ 2011-01-25 16:23 UTC (permalink / raw)
  To: Roland Dreier; +Cc: torvalds, akpm, linux-kernel, linux-rdma

   On 1/17/2011 11:55 PM, Roland Dreier wrote:
> Linus, please pull from
>
>      master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus
>
> This tree is also available from kernel.org mirrors at:
>
>      git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus
>
> This will get the last batch of InfiniBand/RDMA patches for the merge
> window.  The biggest thing here is Tejun's conversion of the RDMA
> stack away from flush_scheduled_work(); the remaining stuff is mostly
> driver fixes, with an SRP compile warning fix and a vzalloc()
> conversion patch thrown in.
Roland,

What about the new mlx4 device IDs?
We wish to have them in for CX3 so that the new kernel will support it

Thanks,
Tziporet

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

* [GIT PULL] please pull infiniband.git
@ 2011-01-17 21:55 Roland Dreier
  2011-01-25 16:23 ` Tziporet Koren
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2011-01-17 21:55 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the last batch of InfiniBand/RDMA patches for the merge
window.  The biggest thing here is Tejun's conversion of the RDMA
stack away from flush_scheduled_work(); the remaining stuff is mostly
driver fixes, with an SRP compile warning fix and a vzalloc()
conversion patch thrown in.

Aleksey Senin (1):
      IB/mlx4: Handle protocol field in multicast table

Bart Van Assche (1):
      IB/srp: Test only once whether iu allocation succeeded

Joe Perches (1):
      RDMA: Use vzalloc() to replace vmalloc()+memset(0)

John L. Burr (1):
      IB/mthca: Fix driver when sizeof (phys_addr_t) > sizeof (long)

Maciej Sosnowski (4):
      RDMA/nes: Fix bonding on iw_nes
      RDMA/nes: Generate IB_EVENT_PORT_ERR/PORT_ACTIVE events
      RDMA/nes: Fix SFP+ link down detection issue with switch port disable
      RDMA/nes: Fix incorrect SFP+ link status detection on driver init

Roland Dreier (2):
      mlx4_{core, ib, en}: Fix driver when sizeof (phys_addr_t) > sizeof (long)
      Merge branches 'misc', 'mlx4', 'mthca', 'nes' and 'srp' into for-next

Tejun Heo (1):
      RDMA: Update workqueue usage

 drivers/infiniband/core/cache.c                |    4 +-
 drivers/infiniband/core/device.c               |   11 ++-
 drivers/infiniband/core/sa_query.c             |    2 +-
 drivers/infiniband/core/umem.c                 |    2 +-
 drivers/infiniband/hw/amso1100/c2_rnic.c       |    5 +-
 drivers/infiniband/hw/ehca/ipz_pt_fn.c         |    5 +-
 drivers/infiniband/hw/ipath/ipath_driver.c     |    5 +-
 drivers/infiniband/hw/ipath/ipath_file_ops.c   |   11 +--
 drivers/infiniband/hw/ipath/ipath_init_chip.c  |    5 +-
 drivers/infiniband/hw/ipath/ipath_user_pages.c |    2 +-
 drivers/infiniband/hw/mlx4/main.c              |   12 ++-
 drivers/infiniband/hw/mthca/mthca_catas.c      |    5 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c        |    2 +-
 drivers/infiniband/hw/mthca/mthca_eq.c         |    2 +-
 drivers/infiniband/hw/mthca/mthca_main.c       |    2 +-
 drivers/infiniband/hw/mthca/mthca_mr.c         |    2 +-
 drivers/infiniband/hw/nes/nes.c                |   35 ++++++++-
 drivers/infiniband/hw/nes/nes.h                |    4 +
 drivers/infiniband/hw/nes/nes_cm.c             |    8 ++-
 drivers/infiniband/hw/nes/nes_hw.c             |   95 ++++++++++++++++++++++++
 drivers/infiniband/hw/nes/nes_hw.h             |   10 +++
 drivers/infiniband/hw/nes/nes_nic.c            |   78 ++++++++++++++++---
 drivers/infiniband/hw/nes/nes_verbs.c          |   37 +++++++++-
 drivers/infiniband/hw/qib/qib_iba7220.c        |    7 +-
 drivers/infiniband/hw/qib/qib_iba7322.c        |   14 ++--
 drivers/infiniband/hw/qib/qib_init.c           |   33 ++-------
 drivers/infiniband/hw/qib/qib_qsfp.c           |    9 +-
 drivers/infiniband/hw/qib/qib_verbs.h          |    3 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |   10 +--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    3 +-
 drivers/infiniband/ulp/srp/ib_srp.c            |   19 ++---
 drivers/net/mlx4/catas.c                       |    6 +-
 drivers/net/mlx4/en_main.c                     |    3 +-
 drivers/net/mlx4/main.c                        |    2 +-
 drivers/net/mlx4/mcg.c                         |   23 +++---
 include/linux/mlx4/device.h                    |   10 ++-
 include/linux/mlx4/driver.h                    |    6 +-
 include/rdma/ib_verbs.h                        |    3 +
 38 files changed, 351 insertions(+), 144 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2011-01-11 18:38 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2011-01-11 18:38 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the main batch of InfiniBand/RDMA patches for the merge
window.  There are three main things here:

 - SRP initiator performance improvements from Bart Van Assche and
   Dave Dillow
 - Conversion of IPoIB from LRO to GRO from Or Gerlitz
 - Lots of fixes to hardware drivers, including mostly clearing the
   backlog of qib patches

Ali Ayoub (1):
      mlx4_core: Avoid vunmap() of invalid pointer if allocation fails

Bart Van Assche (6):
      IB/srp: consolidate state change code
      IB/srp: allow lockless work posting
      IB/srp: don't move active requests to their own list
      IB/srp: reduce local coverage for command submission and EH
      IB/srp: reduce lock coverage of command completion
      IB/srp: stop sharing the host lock with SCSI

Dan Carpenter (2):
      IB/mlx4: Handle -ENOMEM in forward_trap()
      IB/mthca: Handle -ENOMEM in forward_trap()

David Dillow (2):
      IB/srp: allow task management without a previous request
      IB/srp: consolidate hot-path variables into cache lines

Joe Perches (2):
      IB/ipath: Use printf extension %pR for struct resource
      RDMA/nes: Fix string continuation line

Mike Marciniszyn (23):
      IB/qib: Remove IB latency turnoff
      IB/qib: Add receive header queue size module parameters
      IB/qib: Add support for the new QME7362 card
      IB/qib: Generate completion callback on errors
      IB/qib: Set port physical state even if other fields are invalid
      IB/qib: UD send with immediate receive completion has wrong size
      IB/qib: Handle transitions from ACTIVE_DEFERRED to ACTIVE better
      IB/qib: Fix multi-Florida HCA host panic on reboot
      IB/qib: Fix context allocation with multiple HCAs
      IB/qib: Clear WAIT_SEND flags when setting QP to error state
      IB/qib: New SERDES init routine and improvements to SI quality
      IB/qib: Reset packet list after freeing
      IB/qib: Add a few new SERDES tunings
      IB/qib: Avoid duplicate writes to the rcv head register
      IB/qib: Fix interrupt mitigation
      IB/qib: Change receive queue/QPN selection
      IB/qib: Add fix missing from earlier patch
      IB/qib: Change QPN increment
      IB/qib: RDMA lkey/rkey validation is inefficient for large MRs
      IB/qib: Issue pre-emptive NAKs on eager buffer overflow
      IB/qib: Unnecessary delayed completions on RC connection
      IB/qib: Improve SERDES tunning on QMH boards
      IB/qib: Fix refcount leak in lkey/rkey validation

Or Gerlitz (2):
      IPoIB: Remove LRO support
      IPoIB: Add GRO support

Roland Dreier (2):
      mlx4_core: Remove warning message about firmware bug
      Merge branches 'cxgb4', 'ipath', 'ipoib', 'mlx4', 'mthca', 'nes', 'qib' and 'srp' into for-next

Stephen Hemminger (1):
      RDMA/cxgb3,cxgb4: Remove dead code

Steve Wise (1):
      RDMA/cxgb4: Don't re-init wait object in init/fini paths

Vladimir Sokolovsky (1):
      IB/mlx4: Don't call dma_free_coherent() with irqs disabled

 drivers/infiniband/hw/cxgb3/cxio_hal.c       |    2 +
 drivers/infiniband/hw/cxgb3/iwch_provider.h  |    2 -
 drivers/infiniband/hw/cxgb3/iwch_qp.c        |   56 ----
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h       |    1 -
 drivers/infiniband/hw/cxgb4/qp.c             |   32 --
 drivers/infiniband/hw/ipath/ipath_driver.c   |    5 +-
 drivers/infiniband/hw/mlx4/cq.c              |    9 +-
 drivers/infiniband/hw/mlx4/mad.c             |    2 +
 drivers/infiniband/hw/mthca/mthca_mad.c      |    2 +
 drivers/infiniband/hw/nes/nes_nic.c          |    4 +-
 drivers/infiniband/hw/qib/qib.h              |    2 +-
 drivers/infiniband/hw/qib/qib_cq.c           |    3 +-
 drivers/infiniband/hw/qib/qib_driver.c       |  155 ++++++++++-
 drivers/infiniband/hw/qib/qib_file_ops.c     |   10 +-
 drivers/infiniband/hw/qib/qib_iba6120.c      |    2 +-
 drivers/infiniband/hw/qib/qib_iba7220.c      |    4 +-
 drivers/infiniband/hw/qib/qib_iba7322.c      |  373 ++++++++++++++++++++++---
 drivers/infiniband/hw/qib/qib_init.c         |    6 +-
 drivers/infiniband/hw/qib/qib_intr.c         |    3 +-
 drivers/infiniband/hw/qib/qib_keys.c         |   80 ++++--
 drivers/infiniband/hw/qib/qib_mad.c          |   45 ++--
 drivers/infiniband/hw/qib/qib_mr.c           |    8 +-
 drivers/infiniband/hw/qib/qib_qp.c           |   32 +--
 drivers/infiniband/hw/qib/qib_rc.c           |   24 ++
 drivers/infiniband/hw/qib/qib_ud.c           |   57 ++--
 drivers/infiniband/hw/qib/qib_user_sdma.c    |    1 +
 drivers/infiniband/hw/qib/qib_verbs.h        |   11 +-
 drivers/infiniband/ulp/ipoib/Kconfig         |    1 -
 drivers/infiniband/ulp/ipoib/ipoib.h         |   12 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c      |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c |   51 ----
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |    8 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |   62 +----
 drivers/infiniband/ulp/srp/ib_srp.c          |  392 ++++++++++++--------------
 drivers/infiniband/ulp/srp/ib_srp.h          |   46 ++--
 drivers/net/mlx4/alloc.c                     |    3 +-
 drivers/net/mlx4/fw.c                        |    4 +-
 37 files changed, 889 insertions(+), 622 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2010-12-13 21:53 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-12-13 21:53 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Just a one thing here: a fix for a user-triggerable integer overflow
as a well as a leak of a few bytes of kernel memory.  The severity is
not too high here as actually hitting this requires a system with real
RDMA hardware, and the user must be granted direct access to that hardware.

Dan Carpenter (1):
      IB/uverbs: Handle large number of entries in poll CQ

 drivers/infiniband/core/uverbs_cmd.c |  101 +++++++++++++++++++---------------
 1 files changed, 57 insertions(+), 44 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2010-12-02 18:57 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-12-02 18:57 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Just a few small things here:

 - Fix a minor leak of a few bytes of kernel stack
 - MAINTAINERS update
 - Fix a few small issues introduced with the merge of IBoE support in 2.6.37-rc1

Chien Tung (1):
      MAINTAINERS: Update NetEffect entry

Eli Cohen (4):
      IB/mlx4: Fix memory ordering of VLAN insertion control bits
      mlx4_core: Workaround firmware bug in query dev cap
      IB/mlx4: Fix IBoE reported link rate
      IB/mlx4: Fix IBoE link state

Or Gerlitz (1):
      IB/pack: Remove some unused code added by the IBoE patches

Roland Dreier (1):
      Merge branches 'misc', 'mlx4' and 'nes' into for-next

Vasiliy Kulikov (1):
      IB: Fix information leak in marshalling code

 MAINTAINERS                               |    3 +-
 drivers/infiniband/core/ud_header.c       |   30 -----------------------------
 drivers/infiniband/core/uverbs_marshall.c |    4 +++
 drivers/infiniband/hw/mlx4/main.c         |    4 +-
 drivers/infiniband/hw/mlx4/qp.c           |   10 ++++----
 drivers/net/mlx4/fw.c                     |    4 +++
 6 files changed, 16 insertions(+), 39 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2010-10-26 20:52 Roland Dreier
@ 2010-10-26 23:17 ` Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-10-26 23:17 UTC (permalink / raw)
  To: torvalds; +Cc: akpm, linux-rdma, linux-kernel

Hi Linus,

A) I forgot to push out my for-linus branch, so if you tried earlier, it
wasn't there, but it is now:

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus
    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

B) It was pointed out to me that I missed one patch hunk, so the
diffstat now looks like the below.  One difference is that there now is
a qib_uc.c line and the summary goes from

 74 files changed, 2668 insertions(+), 725 deletions(-)

to

 75 files changed, 2672 insertions(+), 727 deletions(-)

Thanks!
  Roland

 MAINTAINERS                                 |   12 +-
 drivers/infiniband/core/agent.c             |   29 +-
 drivers/infiniband/core/cma.c               |  313 ++++++++++++++-
 drivers/infiniband/core/iwcm.c              |    4 +
 drivers/infiniband/core/mad.c               |   27 ++-
 drivers/infiniband/core/multicast.c         |   23 +-
 drivers/infiniband/core/sa_query.c          |   30 +-
 drivers/infiniband/core/sysfs.c             |   15 +
 drivers/infiniband/core/ucma.c              |   92 ++++-
 drivers/infiniband/core/ud_header.c         |  138 ++++++--
 drivers/infiniband/core/user_mad.c          |    2 +-
 drivers/infiniband/core/uverbs_cmd.c        |    2 +
 drivers/infiniband/core/verbs.c             |   16 +
 drivers/infiniband/hw/amso1100/Kbuild       |    4 +-
 drivers/infiniband/hw/amso1100/c2_intr.c    |    4 +-
 drivers/infiniband/hw/cxgb3/Makefile        |    6 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c      |    1 +
 drivers/infiniband/hw/cxgb3/cxio_wr.h       |   16 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c       |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_ev.c       |   17 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c |   24 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c       |   25 +-
 drivers/infiniband/hw/cxgb3/iwch_user.h     |    8 +
 drivers/infiniband/hw/cxgb4/Makefile        |    2 +-
 drivers/infiniband/hw/cxgb4/cm.c            |  178 ++++-----
 drivers/infiniband/hw/cxgb4/cq.c            |   28 +-
 drivers/infiniband/hw/cxgb4/device.c        |  191 ++++++----
 drivers/infiniband/hw/cxgb4/ev.c            |    2 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h      |   68 +++-
 drivers/infiniband/hw/cxgb4/mem.c           |   11 +-
 drivers/infiniband/hw/cxgb4/provider.c      |   44 ++-
 drivers/infiniband/hw/cxgb4/qp.c            |  283 ++++++++------
 drivers/infiniband/hw/cxgb4/resource.c      |   62 +++
 drivers/infiniband/hw/cxgb4/t4.h            |   44 ++-
 drivers/infiniband/hw/cxgb4/user.h          |    7 +
 drivers/infiniband/hw/ehca/ehca_mrmw.c      |    6 +-
 drivers/infiniband/hw/ipath/Makefile        |    2 +-
 drivers/infiniband/hw/mlx4/ah.c             |  163 +++++++--
 drivers/infiniband/hw/mlx4/mad.c            |   32 +-
 drivers/infiniband/hw/mlx4/main.c           |  553 +++++++++++++++++++++++++--
 drivers/infiniband/hw/mlx4/mlx4_ib.h        |   32 ++-
 drivers/infiniband/hw/mlx4/mr.c             |    2 +-
 drivers/infiniband/hw/mlx4/qp.c             |  195 ++++++++--
 drivers/infiniband/hw/mthca/mthca_qp.c      |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c          |    3 +-
 drivers/infiniband/hw/nes/nes_nic.c         |    1 +
 drivers/infiniband/hw/nes/nes_verbs.c       |   16 +-
 drivers/infiniband/hw/qib/qib.h             |    2 +-
 drivers/infiniband/hw/qib/qib_file_ops.c    |    4 +-
 drivers/infiniband/hw/qib/qib_init.c        |    1 +
 drivers/infiniband/hw/qib/qib_pcie.c        |    8 +-
 drivers/infiniband/hw/qib/qib_rc.c          |    5 +-
 drivers/infiniband/hw/qib/qib_uc.c          |    6 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c     |   14 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c   |    3 +
 drivers/infiniband/ulp/srp/ib_srp.c         |  236 ++++++++----
 drivers/infiniband/ulp/srp/ib_srp.h         |   21 +-
 drivers/net/mlx4/en_main.c                  |   15 +-
 drivers/net/mlx4/en_netdev.c                |   10 +
 drivers/net/mlx4/en_port.c                  |    4 +-
 drivers/net/mlx4/en_port.h                  |    3 +-
 drivers/net/mlx4/fw.c                       |    3 +-
 drivers/net/mlx4/intf.c                     |   21 +
 drivers/net/mlx4/main.c                     |    4 +-
 drivers/net/mlx4/mlx4_en.h                  |    1 +
 drivers/net/mlx4/port.c                     |   19 +
 include/linux/mlx4/cmd.h                    |    2 +
 include/linux/mlx4/device.h                 |   35 ++-
 include/linux/mlx4/driver.h                 |    9 +
 include/linux/mlx4/qp.h                     |    9 +-
 include/rdma/ib_addr.h                      |  134 +++++++-
 include/rdma/ib_pack.h                      |   39 ++-
 include/rdma/ib_user_verbs.h                |    3 +-
 include/rdma/ib_verbs.h                     |   11 +
 include/scsi/srp.h                          |   38 ++
 75 files changed, 2672 insertions(+), 727 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2010-10-26 20:52 Roland Dreier
  2010-10-26 23:17 ` Roland Dreier
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2010-10-26 20:52 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

The big new feature here is support for InfiniBand-over-Ethernet / IBoE
(aka "RDMA over Converged Ethernet / RoCE").  We also have a new SRP
initiator submaintainer (thanks Dave!), and various fixes all over.

Animesh K Trivedi (1):
      RDMA/iwcm: Fix hang in uninterruptible wait on cm_id destroy

Bart Van Assche (3):
      IB/srp: Preparation for transmit ring response allocation
      IB/srp: Reduce number of BUSY conditions
      IB/srp: Use list_first_entry()

Chien Tung (1):
      RDMA/nes: Report correct port state if interface is down

Christoph Lameter (1):
      IPoIB: Set pkt_type correctly for multicast packets (fix IGMP breakage)

Dan Carpenter (1):
      RDMA/nes: Remove unneeded variable

David Dillow (3):
      IB/srp: Implement SRP_CRED_REQ and SRP_AER_REQ
      IB/srp: Eliminate two forward declarations
      IB/srp: Sync buffer before posting send

Eli Cohen (16):
      IB/core: Add link layer property to ports
      mlx4_core: Allow log_mtts_per_seg up to 7
      IB/mlx4: Limit size of fast registration WRs
      IPoIB: Skip IBoE ports
      IB/mad: IBoE supports only QP1 (no QP0)
      RDMA/cm: Add RDMA CM support for IBoE devices
      IB/pack: IBoE UD packet packing support
      IPoIB: Set dev_id field of net_device
      IB/uverbs: Return link layer type to userspace for query port operation
      mlx4_core: Allow protocol drivers to find corresponding interfaces
      mlx4_core: Update data structures and constants for IBoE
      mlx4_en: Change multicast promiscuous mode to support IBoE
      IB/mlx4: Add support for IBoE
      IB/core: Add VLAN support for IBoE
      IB/mlx4: Add VLAN support for IBoE
      IB/core: Add link layer type information to sysfs

Jack Morgenstein (1):
      IB/mlx4: Signal node desc changes to SM by using FW to generate trap 144

Jason Gunthorpe (3):
      IB/qib: Process RDMA WRITE ONLY with IMMEDIATE properly
      IB/qib: Fix extra log level in qib_early_err()
      IB/qib: clean up properly if pci_set_consistent_dma_mask() fails

Joe Perches (4):
      RDMA/amso1100: Remove KERN_<level> from pr_<level> use
      IB/qib: Remove unnecessary casts of private_data
      RDMA/cxgb3: Remove unnecessary KERN_<level> use
      RDMA/cxgb4: Remove unnecessary KERN_<level> use

Maciej Sosnowski (1):
      RDMA/nes: Turn carrier off on ifdown

Ralph Campbell (2):
      IB/qib: Fix uninitialized pointer if CONFIG_PCI_MSI not set
      IB/qib: Allow driver to load if PCIe AER fails

Roland Dreier (5):
      RDMA/cxgb4: Fix warnings about casts to/from pointers of different sizes
      MAINTAINERS: Fix broken link to http://www.openib.org/
      RDMA/nes: Fix cast-to-pointer warnings on 32-bit
      MAINTAINERS: Hand off SCSI RDMA Protocol (SRP) initiator to Dave Dillow
      Merge branches 'amso1100', 'cma', 'cxgb3', 'cxgb4', 'ehca', 'iboe', 'ipoib', 'misc', 'mlx4', 'nes', 'qib' and 'srp' into for-next

Sonny Rao (1):
      IB/ehca: Fix driver on relocatable kernel

Steve Wise (19):
      RDMA/cxgb4: Don't use null ep ptr
      RDMA/cxgb4: Zero out ISGL padding
      RDMA/cxgb4: Ignore positive return values from cxgb4_*_send() functions
      RDMA/cxgb4: Ignore TERMINATE CQEs
      RDMA/cxgb4: Handle CPL_RDMA_TERMINATE messages
      RDMA/cxgb4: Log HW lack-of-resource errors
      RDMA/cxgb4: debugfs files for dumping active stags
      RDMA/cxgb4: Centralize the wait logic
      RDMA/cxgb4: Support on-chip SQs
      RDMA/cxgb4: Use a mutex for QP and EP state transitions
      RDMA/cxgb4: Set the default TCP send window to 128KB
      RDMA/cxgb4: Don't set completion flag for read requests
      RDMA/cxgb4: Fastreg NSMR fixes
      RDMA/cxgb4: Add default_llseek to debugfs files
      RDMA/cxgb4: Use simple_read_from_buffer() for debugfs handlers
      RDMA/cxgb4: Export T4 TCP MIB
      RDMA/cxgb4: Use cxgb4 service for packet gl to skb
      RDMA/cxgb3: When a user QP is marked in error, also mark the CQs in error
      RDMA/ucma: Allow tuning the max listen backlog

Thomas Gleixner (1):
      IB/umad: Make user_mad semaphore a real one

matt mooney (1):
      IB: Replace EXTRA_CFLAGS with ccflags-y

 MAINTAINERS                                 |   12 +-
 drivers/infiniband/core/agent.c             |   29 +-
 drivers/infiniband/core/cma.c               |  313 ++++++++++++++-
 drivers/infiniband/core/iwcm.c              |    4 +
 drivers/infiniband/core/mad.c               |   27 ++-
 drivers/infiniband/core/multicast.c         |   23 +-
 drivers/infiniband/core/sa_query.c          |   30 +-
 drivers/infiniband/core/sysfs.c             |   15 +
 drivers/infiniband/core/ucma.c              |   92 ++++-
 drivers/infiniband/core/ud_header.c         |  138 ++++++--
 drivers/infiniband/core/user_mad.c          |    2 +-
 drivers/infiniband/core/uverbs_cmd.c        |    2 +
 drivers/infiniband/core/verbs.c             |   16 +
 drivers/infiniband/hw/amso1100/Kbuild       |    4 +-
 drivers/infiniband/hw/amso1100/c2_intr.c    |    4 +-
 drivers/infiniband/hw/cxgb3/Makefile        |    6 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c      |    1 +
 drivers/infiniband/hw/cxgb3/cxio_wr.h       |   16 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c       |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_ev.c       |   17 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c |   24 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c       |   25 +-
 drivers/infiniband/hw/cxgb3/iwch_user.h     |    8 +
 drivers/infiniband/hw/cxgb4/Makefile        |    2 +-
 drivers/infiniband/hw/cxgb4/cm.c            |  178 ++++-----
 drivers/infiniband/hw/cxgb4/cq.c            |   28 +-
 drivers/infiniband/hw/cxgb4/device.c        |  191 ++++++----
 drivers/infiniband/hw/cxgb4/ev.c            |    2 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h      |   68 +++-
 drivers/infiniband/hw/cxgb4/mem.c           |   11 +-
 drivers/infiniband/hw/cxgb4/provider.c      |   44 ++-
 drivers/infiniband/hw/cxgb4/qp.c            |  283 ++++++++------
 drivers/infiniband/hw/cxgb4/resource.c      |   62 +++
 drivers/infiniband/hw/cxgb4/t4.h            |   44 ++-
 drivers/infiniband/hw/cxgb4/user.h          |    7 +
 drivers/infiniband/hw/ehca/ehca_mrmw.c      |    6 +-
 drivers/infiniband/hw/ipath/Makefile        |    2 +-
 drivers/infiniband/hw/mlx4/ah.c             |  163 +++++++--
 drivers/infiniband/hw/mlx4/mad.c            |   32 +-
 drivers/infiniband/hw/mlx4/main.c           |  553 +++++++++++++++++++++++++--
 drivers/infiniband/hw/mlx4/mlx4_ib.h        |   32 ++-
 drivers/infiniband/hw/mlx4/mr.c             |    2 +-
 drivers/infiniband/hw/mlx4/qp.c             |  195 ++++++++--
 drivers/infiniband/hw/mthca/mthca_qp.c      |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c          |    3 +-
 drivers/infiniband/hw/nes/nes_nic.c         |    1 +
 drivers/infiniband/hw/nes/nes_verbs.c       |   16 +-
 drivers/infiniband/hw/qib/qib.h             |    2 +-
 drivers/infiniband/hw/qib/qib_file_ops.c    |    4 +-
 drivers/infiniband/hw/qib/qib_init.c        |    1 +
 drivers/infiniband/hw/qib/qib_pcie.c        |    8 +-
 drivers/infiniband/hw/qib/qib_rc.c          |    5 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c     |   14 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c   |    3 +
 drivers/infiniband/ulp/srp/ib_srp.c         |  236 ++++++++----
 drivers/infiniband/ulp/srp/ib_srp.h         |   21 +-
 drivers/net/mlx4/en_main.c                  |   15 +-
 drivers/net/mlx4/en_netdev.c                |   10 +
 drivers/net/mlx4/en_port.c                  |    4 +-
 drivers/net/mlx4/en_port.h                  |    3 +-
 drivers/net/mlx4/fw.c                       |    3 +-
 drivers/net/mlx4/intf.c                     |   21 +
 drivers/net/mlx4/main.c                     |    4 +-
 drivers/net/mlx4/mlx4_en.h                  |    1 +
 drivers/net/mlx4/port.c                     |   19 +
 include/linux/mlx4/cmd.h                    |    2 +
 include/linux/mlx4/device.h                 |   35 ++-
 include/linux/mlx4/driver.h                 |    9 +
 include/linux/mlx4/qp.h                     |    9 +-
 include/rdma/ib_addr.h                      |  134 +++++++-
 include/rdma/ib_pack.h                      |   39 ++-
 include/rdma/ib_user_verbs.h                |    3 +-
 include/rdma/ib_verbs.h                     |   11 +
 include/scsi/srp.h                          |   38 ++
 74 files changed, 2668 insertions(+), 725 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2010-09-27 16:31 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-09-27 16:31 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one cxgb3 driver fix:

Steve Wise (1):
      RDMA/cxgb3: Turn off RX coalescing for iWARP connections

 drivers/infiniband/hw/cxgb3/iwch_cm.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2010-09-08 21:45 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-09-08 21:45 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few small driver fixes.

Chien Tung (1):
      RDMA/nes: Write correct register write to set TX pause param

Faisal Latif (3):
      RDMA/nes: Fix double CLOSE event indication crash
      RDMA/nes: Change state to closing after FIN
      RDMA/nes: Fix hang with modified FIN handling on A0 cards

Roland Dreier (1):
      Merge branches 'cxgb3' and 'nes' into for-linus

Steve Wise (1):
      RDMA/cxgb3: Don't exceed the max HW CQ depth

 drivers/infiniband/hw/cxgb3/cxio_hal.h |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c     |   18 ++++++++++--------
 drivers/infiniband/hw/nes/nes_hw.c     |   14 +++++++++++++-
 drivers/infiniband/hw/nes/nes_hw.h     |    1 +
 drivers/infiniband/hw/nes/nes_nic.c    |    4 ++--
 5 files changed, 27 insertions(+), 12 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2010-08-09 22:44 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-08-09 22:44 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one cxgb4 patch that I was holding until prerequisites
merged through the net tree.

Steve Wise (1):
      RDMA/cxgb4: Obtain RDMA QID ranges from LLD/FW

 drivers/infiniband/hw/cxgb4/device.c   |    9 +++++++--
 drivers/infiniband/hw/cxgb4/resource.c |    7 ++++---
 drivers/infiniband/hw/cxgb4/t4.h       |    2 --
 3 files changed, 11 insertions(+), 7 deletions(-)

-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] Please pull infiniband.git
@ 2010-08-05 21:37 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-08-05 21:37 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the 2.6.36 merge window pile, which actually does not
include anything big this time around.

Aleksey Senin (1):
      IB: Rename RAW_ETY to RAW_ETHERTYPE

Alexander Schmidt (3):
      IB/ehca: Fix bitmask handling for lock_hcalls
      IB/ehca: Catch failing ioremap()
      IB/ehca: Init irq tasklet before irq can happen

Arnd Bergmann (1):
      IB/qib: Use generic_file_llseek

Bart Van Assche (3):
      IB/srp: Use print_hex_dump()
      IB/srp: Make receive buffer handling more robust
      IB/srp: Export req_lim via sysfs

Ben Hutchings (1):
      IB/ipath: Fix probe failure path

Chien Tung (1):
      RDMA/nes: Store and print eeprom version

Dan Carpenter (2):
      RDMA/cxgb4: Remove unneeded assignment
      RDMA/cxgb3: Clean up signed check of unsigned variable

Dave Olson (1):
      IB/qib: Allow PSM to select from multiple port assignment algorithms

David Miller (1):
      IB/qib: Add missing <linux/slab.h> include

David Rientjes (1):
      RDMA/cxgb4: Remove dependency on __GFP_NOFAIL

Faisal Latif (1):
      RDMA/nes: Fix hangs on ifdown

Ira Weiny (1):
      IB/qib: Allow writes to the diag_counters to be able to clear them

Julia Lawall (1):
      IB/ehca: Drop unnecessary NULL test

Miroslaw Walukiewicz (1):
      RDMA/nes: Read firmware version from correct place

Or Gerlitz (3):
      IB/iser: Make needlessly global iser_alloc_rx_descriptors() static
      RDMA/cxgb3: Make needlessly global iwch_l2t_send() static
      RDMA/nes: Fix two sparse warnings

Peter Huewe (1):
      RDMA/nes: Convert pci_table entries to PCI_VDEVICE

Ralph Campbell (5):
      IB/qib: Avoid variable-length array
      IB/qib: Turn off IB latency mode
      IB/qib: Set cfgctxts to number of CPUs by default
      IB/qib: Limit the number of packets processed per interrupt
      IB/qib: Fix race between qib_error_qp() and receive packet processing

Roland Dreier (8):
      IB/umad: Remove unused-but-set variable 'already_dead'
      RDMA/nes: Rewrite expression to avoid undefined semantics
      RDMA/cxgb4: Remove unneeded NULL check
      RDMA/nes: Get rid of "set but not used" variables
      RDMA/nes: Fix showing wqm_quanta
      RDMA/nes: Fix misindented code
      RDMA/nes: Fix confusing if statement indentation
      Merge branches 'cxgb3', 'cxgb4', 'ehca', 'ipath', 'misc', 'nes', 'qib' and 'srp' into for-next

Sean Hefty (1):
      IB/cm: Check LAP state before sending an MRA

Steve Wise (6):
      RDMA/cxgb4: Add module option to tweak delayed ack
      RDMA/cxgb4: Support variable sized work requests
      RDMA/cxgb4: Fix race in fini path
      RDMA/cxgb4: Use correct control txq
      RDMA/cxgb4: Set/reset the EP timer inside EP lock
      RDMA/cxgb4: Add timeouts when waiting for FW responses

 drivers/infiniband/core/cm.c                 |   10 +-
 drivers/infiniband/core/user_mad.c           |    2 -
 drivers/infiniband/core/verbs.c              |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c        |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c        |    4 +-
 drivers/infiniband/hw/cxgb4/cm.c             |   91 ++++++-----
 drivers/infiniband/hw/cxgb4/cq.c             |    4 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h       |    1 +
 drivers/infiniband/hw/cxgb4/mem.c            |    2 +-
 drivers/infiniband/hw/cxgb4/qp.c             |  240 +++++++++++++------------
 drivers/infiniband/hw/cxgb4/t4.h             |   32 ++--
 drivers/infiniband/hw/cxgb4/t4fw_ri_api.h    |   10 +
 drivers/infiniband/hw/ehca/ehca_eq.c         |    8 +-
 drivers/infiniband/hw/ehca/ehca_main.c       |    3 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c       |    5 -
 drivers/infiniband/hw/ehca/ehca_qp.c         |    2 +-
 drivers/infiniband/hw/ehca/hcp_if.c          |   32 +++-
 drivers/infiniband/hw/ehca/hcp_phyp.c        |   11 +-
 drivers/infiniband/hw/ehca/hcp_phyp.h        |    2 +-
 drivers/infiniband/hw/ipath/ipath_driver.c   |   13 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c      |    2 +-
 drivers/infiniband/hw/nes/nes.c              |   37 ++---
 drivers/infiniband/hw/nes/nes.h              |    2 +
 drivers/infiniband/hw/nes/nes_cm.c           |   10 +-
 drivers/infiniband/hw/nes/nes_hw.c           |   23 ++-
 drivers/infiniband/hw/nes/nes_hw.h           |    3 +-
 drivers/infiniband/hw/nes/nes_nic.c          |   15 +-
 drivers/infiniband/hw/nes/nes_utils.c        |    5 +
 drivers/infiniband/hw/nes/nes_verbs.c        |   21 ++-
 drivers/infiniband/hw/qib/qib.h              |    4 +
 drivers/infiniband/hw/qib/qib_common.h       |   16 ++-
 drivers/infiniband/hw/qib/qib_driver.c       |    2 +-
 drivers/infiniband/hw/qib/qib_file_ops.c     |  203 +++++++++++-----------
 drivers/infiniband/hw/qib/qib_fs.c           |   18 +-
 drivers/infiniband/hw/qib/qib_iba7322.c      |    4 +-
 drivers/infiniband/hw/qib/qib_init.c         |    2 +-
 drivers/infiniband/hw/qib/qib_qp.c           |    2 +-
 drivers/infiniband/hw/qib/qib_rc.c           |   47 ++----
 drivers/infiniband/hw/qib/qib_sdma.c         |    2 +
 drivers/infiniband/hw/qib/qib_sysfs.c        |   21 ++-
 drivers/infiniband/hw/qib/qib_tx.c           |    2 +-
 drivers/infiniband/hw/qib/qib_uc.c           |    6 -
 drivers/infiniband/hw/qib/qib_ud.c           |   17 +--
 drivers/infiniband/hw/qib/qib_verbs.c        |    7 +-
 drivers/infiniband/ulp/iser/iser_initiator.c |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c          |  118 +++++++------
 include/rdma/ib_verbs.h                      |    2 +-
 47 files changed, 576 insertions(+), 495 deletions(-)

-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-07-08 16:12 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-07-08 16:12 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one security fix for IPoIB, and a bunch of relatively
small fixes to drivers new in 2.6.35 (so perhaps not regression fixes,
but not able to regress anything either ... and you don't care about
RDMA anyway ;)

Dave Olson (1):
      IB/qib: Don't mark VL15 bufs as WC to avoid a rare 7322 chip problem

FUJITA Tomonori (1):
      RDMA/cxgb4: Use the DMA state API instead of the pci equivalents

Or Gerlitz (1):
      IPoIB: Fix world-writable child interface control sysfs attributes

Ralph Campbell (6):
      IB/qib: Mask hardware error during link reset
      IB/qib: Clear eager buffer memory for each new process
      IB/qib: Clear 6120 hardware error register
      IB/qib: Update 7322 serdes tables
      IB/qib: Completion queue callback needs to be single threaded
      IB/qib: Clean up properly if qib_init() fails

Roland Dreier (1):
      Merge branches 'cxgb4', 'ipoib' and 'qib' into for-next

Steve Wise (3):
      RDMA/cxgb4: Don't call abort_connection() for active connect failures
      RDMA/cxgb4: Avoid false GTS CIDX_INC overflows
      RDMA/cxgb4: Derive smac_idx from port viid

 drivers/infiniband/hw/cxgb4/cm.c          |   12 ++++---
 drivers/infiniband/hw/cxgb4/cq.c          |   31 ++++++++++++++-----
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h    |    2 +-
 drivers/infiniband/hw/cxgb4/mem.c         |    4 +-
 drivers/infiniband/hw/cxgb4/qp.c          |   12 +++---
 drivers/infiniband/hw/cxgb4/t4.h          |    6 ++--
 drivers/infiniband/hw/qib/qib.h           |    1 +
 drivers/infiniband/hw/qib/qib_7322_regs.h |   48 ++++++++++++++--------------
 drivers/infiniband/hw/qib/qib_diag.c      |   19 +++++++++--
 drivers/infiniband/hw/qib/qib_iba6120.c   |    3 +-
 drivers/infiniband/hw/qib/qib_iba7322.c   |   43 +++++++++++++++++++++----
 drivers/infiniband/hw/qib/qib_init.c      |   21 ++++++++++++-
 drivers/infiniband/hw/qib/qib_pcie.c      |    2 +
 drivers/infiniband/hw/qib/qib_tx.c        |    6 +++-
 drivers/infiniband/ulp/ipoib/ipoib_main.c |    4 +-
 15 files changed, 148 insertions(+), 66 deletions(-)

-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-05-27 22:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-05-27 22:18 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This is pretty much settled down to fixes -- one semantic patch
cleanup from Julia Lawall and then some fixes to the new qib driver.

The following changes since commit ec96e2fe954c23a54bfdf2673437a39e193a1822:

  Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm (2010-05-25 12:06:33 -0700)

are available in the git repository at:

  master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Julia Lawall (1):
      IB/ucm: Use memdup_user()

Ralph Campbell (3):
      IB/qib: Fix undefined symbol error when CONFIG_PCI_MSI=n
      IB/qib: Use a single txselect module parameter for serdes tuning
      IB/qib: Remove DCA support until feature is finished

Roland Dreier (2):
      IB/qib: Don't rely on (undefined) order of function parameter evaluation
      Merge branches 'misc' and 'qib' into for-next

 drivers/infiniband/core/ucm.c           |   11 +-
 drivers/infiniband/hw/qib/qib_fs.c      |   25 +-
 drivers/infiniband/hw/qib/qib_iba6120.c |   12 -
 drivers/infiniband/hw/qib/qib_iba7322.c |  771 +++++++------------------------
 drivers/infiniband/hw/qib/qib_init.c    |    6 +
 5 files changed, 203 insertions(+), 622 deletions(-)

-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-05-25 16:58 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-05-25 16:58 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

The biggest thing here is the rather huge new qib driver for QLogic
PCIe adapters.  This is pretty much self-contained (just one small
change to the core to allow low-level drivers to create per-port files
in sysfs).  There are also some fixes to the new iw_cxgb4 driver, as
well as a few other miscellaneous fixes.

Chien Tung (1):
      RDMA/nes: Fix incorrect unlock in nes_process_mac_intr()

Faisal Latif (2):
      RDMA/nes: Have ethtool read hardware registers for rx/tx stats
      RDMA/nes: Async event for closed QP causes crash

Ralph Campbell (3):
      IB/core: Allow device-specific per-port sysfs files
      IB/qib: Add new qib driver for QLogic PCIe InfiniBand adapters
      IB/ipath: Remove support for QLogic PCIe QLE devices

Roland Dreier (3):
      mlx4_core: Clean up mlx4_alloc_icm() a bit
      IB/mad: Make needlessly global mad_sendq_size/mad_recvq_size static
      Merge branches 'cxgb4', 'misc', 'mlx4', 'nes' and 'qib' into for-next

Sebastien Dugue (1):
      mlx4_core: Fix possible chunk sg list overflow in mlx4_alloc_icm()

Steve Wise (11):
      RDMA/cxgb4: Detach from the LLD after unregistering RDMA device
      RDMA/cxgb4: Register RDMA provider based on LLD state_change events
      RDMA/cxgb4: CQ size must be IQ size - 2
      RDMA/cxgb4: Optimize CQ overflow detection
      RDMA/cxgb4: Fix overflow bug in CQ arm
      RDMA/cxgb4: Return proper errors in fastreg mr/pbl allocation
      RDMA/cxgb4: Don't limit fastreg page list depth
      RDMA/cxgb4: Update some HW limits
      RDMA/cxgb4: Set fence flag for inv-local-stag work requests
      RDMA/cxgb4: Support IB_WR_READ_WITH_INV opcode
      RDMA/cxgb4: Only insert sq qid in lookup table

 drivers/infiniband/Kconfig                         |    1 +
 drivers/infiniband/Makefile                        |    1 +
 drivers/infiniband/core/core_priv.h                |    4 +-
 drivers/infiniband/core/device.c                   |    6 +-
 drivers/infiniband/core/mad.c                      |    4 +-
 drivers/infiniband/core/sysfs.c                    |   21 +-
 drivers/infiniband/hw/amso1100/c2_provider.c       |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c        |    2 +-
 drivers/infiniband/hw/cxgb4/cq.c                   |    6 +-
 drivers/infiniband/hw/cxgb4/device.c               |   50 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h             |    1 +
 drivers/infiniband/hw/cxgb4/mem.c                  |   11 +-
 drivers/infiniband/hw/cxgb4/provider.c             |    4 +-
 drivers/infiniband/hw/cxgb4/qp.c                   |   33 +-
 drivers/infiniband/hw/cxgb4/t4.h                   |   76 +-
 drivers/infiniband/hw/ehca/ehca_main.c             |    2 +-
 drivers/infiniband/hw/ipath/Kconfig                |    8 +-
 drivers/infiniband/hw/ipath/Makefile               |    6 +-
 drivers/infiniband/hw/ipath/ipath_driver.c         |   28 +-
 drivers/infiniband/hw/ipath/ipath_iba6120.c        | 1862 -----
 drivers/infiniband/hw/ipath/ipath_iba7220.c        | 2631 -------
 drivers/infiniband/hw/ipath/ipath_kernel.h         |    2 -
 drivers/infiniband/hw/ipath/ipath_verbs.c          |    2 +-
 drivers/infiniband/hw/mlx4/main.c                  |    2 +-
 drivers/infiniband/hw/mthca/mthca_provider.c       |    2 +-
 drivers/infiniband/hw/nes/nes_hw.c                 |   12 +-
 drivers/infiniband/hw/nes/nes_nic.c                |   72 +-
 drivers/infiniband/hw/nes/nes_verbs.c              |    2 +-
 drivers/infiniband/hw/qib/Kconfig                  |    7 +
 drivers/infiniband/hw/qib/Makefile                 |   15 +
 drivers/infiniband/hw/qib/qib.h                    | 1439 ++++
 drivers/infiniband/hw/qib/qib_6120_regs.h          |  977 +++
 drivers/infiniband/hw/qib/qib_7220.h               |  156 +
 drivers/infiniband/hw/qib/qib_7220_regs.h          | 1496 ++++
 drivers/infiniband/hw/qib/qib_7322_regs.h          | 3163 ++++++++
 drivers/infiniband/hw/qib/qib_common.h             |  758 ++
 drivers/infiniband/hw/qib/qib_cq.c                 |  484 ++
 drivers/infiniband/hw/qib/qib_diag.c               |  894 +++
 drivers/infiniband/hw/qib/qib_dma.c                |  182 +
 drivers/infiniband/hw/qib/qib_driver.c             |  665 ++
 drivers/infiniband/hw/qib/qib_eeprom.c             |  451 ++
 drivers/infiniband/hw/qib/qib_file_ops.c           | 2317 ++++++
 drivers/infiniband/hw/qib/qib_fs.c                 |  613 ++
 drivers/infiniband/hw/qib/qib_iba6120.c            | 3588 +++++++++
 drivers/infiniband/hw/qib/qib_iba7220.c            | 4618 +++++++++++
 drivers/infiniband/hw/qib/qib_iba7322.c            | 8058 ++++++++++++++++++++
 drivers/infiniband/hw/qib/qib_init.c               | 1580 ++++
 drivers/infiniband/hw/qib/qib_intr.c               |  236 +
 drivers/infiniband/hw/qib/qib_keys.c               |  328 +
 drivers/infiniband/hw/qib/qib_mad.c                | 2173 ++++++
 drivers/infiniband/hw/qib/qib_mad.h                |  373 +
 drivers/infiniband/hw/qib/qib_mmap.c               |  174 +
 drivers/infiniband/hw/qib/qib_mr.c                 |  503 ++
 drivers/infiniband/hw/qib/qib_pcie.c               |  738 ++
 .../hw/{ipath/ipath_7220.h => qib/qib_pio_copy.c}  |   53 +-
 drivers/infiniband/hw/qib/qib_qp.c                 | 1255 +++
 drivers/infiniband/hw/qib/qib_qsfp.c               |  564 ++
 drivers/infiniband/hw/qib/qib_qsfp.h               |  184 +
 drivers/infiniband/hw/qib/qib_rc.c                 | 2288 ++++++
 drivers/infiniband/hw/qib/qib_ruc.c                |  817 ++
 .../hw/{ipath/ipath_sd7220.c => qib/qib_sd7220.c}  |  859 +--
 .../ipath_sd7220_img.c => qib/qib_sd7220_img.c}    |   19 +-
 drivers/infiniband/hw/qib/qib_sdma.c               |  973 +++
 drivers/infiniband/hw/qib/qib_srq.c                |  375 +
 drivers/infiniband/hw/qib/qib_sysfs.c              |  691 ++
 drivers/infiniband/hw/qib/qib_twsi.c               |  498 ++
 drivers/infiniband/hw/qib/qib_tx.c                 |  557 ++
 drivers/infiniband/hw/qib/qib_uc.c                 |  555 ++
 drivers/infiniband/hw/qib/qib_ud.c                 |  607 ++
 drivers/infiniband/hw/qib/qib_user_pages.c         |  157 +
 drivers/infiniband/hw/qib/qib_user_sdma.c          |  897 +++
 .../hw/{ipath/ipath_7220.h => qib/qib_user_sdma.h} |   43 +-
 drivers/infiniband/hw/qib/qib_verbs.c              | 2248 ++++++
 drivers/infiniband/hw/qib/qib_verbs.h              | 1100 +++
 drivers/infiniband/hw/qib/qib_verbs_mcast.c        |  368 +
 .../hw/{ipath/ipath_7220.h => qib/qib_wc_ppc64.c}  |   49 +-
 drivers/infiniband/hw/qib/qib_wc_x86_64.c          |  171 +
 drivers/net/mlx4/icm.c                             |   36 +-
 include/rdma/ib_verbs.h                            |    4 +-
 79 files changed, 51016 insertions(+), 5191 deletions(-)
 delete mode 100644 drivers/infiniband/hw/ipath/ipath_iba6120.c
 delete mode 100644 drivers/infiniband/hw/ipath/ipath_iba7220.c
 create mode 100644 drivers/infiniband/hw/qib/Kconfig
 create mode 100644 drivers/infiniband/hw/qib/Makefile
 create mode 100644 drivers/infiniband/hw/qib/qib.h
 create mode 100644 drivers/infiniband/hw/qib/qib_6120_regs.h
 create mode 100644 drivers/infiniband/hw/qib/qib_7220.h
 create mode 100644 drivers/infiniband/hw/qib/qib_7220_regs.h
 create mode 100644 drivers/infiniband/hw/qib/qib_7322_regs.h
 create mode 100644 drivers/infiniband/hw/qib/qib_common.h
 create mode 100644 drivers/infiniband/hw/qib/qib_cq.c
 create mode 100644 drivers/infiniband/hw/qib/qib_diag.c
 create mode 100644 drivers/infiniband/hw/qib/qib_dma.c
 create mode 100644 drivers/infiniband/hw/qib/qib_driver.c
 create mode 100644 drivers/infiniband/hw/qib/qib_eeprom.c
 create mode 100644 drivers/infiniband/hw/qib/qib_file_ops.c
 create mode 100644 drivers/infiniband/hw/qib/qib_fs.c
 create mode 100644 drivers/infiniband/hw/qib/qib_iba6120.c
 create mode 100644 drivers/infiniband/hw/qib/qib_iba7220.c
 create mode 100644 drivers/infiniband/hw/qib/qib_iba7322.c
 create mode 100644 drivers/infiniband/hw/qib/qib_init.c
 create mode 100644 drivers/infiniband/hw/qib/qib_intr.c
 create mode 100644 drivers/infiniband/hw/qib/qib_keys.c
 create mode 100644 drivers/infiniband/hw/qib/qib_mad.c
 create mode 100644 drivers/infiniband/hw/qib/qib_mad.h
 create mode 100644 drivers/infiniband/hw/qib/qib_mmap.c
 create mode 100644 drivers/infiniband/hw/qib/qib_mr.c
 create mode 100644 drivers/infiniband/hw/qib/qib_pcie.c
 copy drivers/infiniband/hw/{ipath/ipath_7220.h => qib/qib_pio_copy.c} (57%)
 create mode 100644 drivers/infiniband/hw/qib/qib_qp.c
 create mode 100644 drivers/infiniband/hw/qib/qib_qsfp.c
 create mode 100644 drivers/infiniband/hw/qib/qib_qsfp.h
 create mode 100644 drivers/infiniband/hw/qib/qib_rc.c
 create mode 100644 drivers/infiniband/hw/qib/qib_ruc.c
 rename drivers/infiniband/hw/{ipath/ipath_sd7220.c => qib/qib_sd7220.c} (57%)
 rename drivers/infiniband/hw/{ipath/ipath_sd7220_img.c => qib/qib_sd7220_img.c} (99%)
 create mode 100644 drivers/infiniband/hw/qib/qib_sdma.c
 create mode 100644 drivers/infiniband/hw/qib/qib_srq.c
 create mode 100644 drivers/infiniband/hw/qib/qib_sysfs.c
 create mode 100644 drivers/infiniband/hw/qib/qib_twsi.c
 create mode 100644 drivers/infiniband/hw/qib/qib_tx.c
 create mode 100644 drivers/infiniband/hw/qib/qib_uc.c
 create mode 100644 drivers/infiniband/hw/qib/qib_ud.c
 create mode 100644 drivers/infiniband/hw/qib/qib_user_pages.c
 create mode 100644 drivers/infiniband/hw/qib/qib_user_sdma.c
 copy drivers/infiniband/hw/{ipath/ipath_7220.h => qib/qib_user_sdma.h} (57%)
 create mode 100644 drivers/infiniband/hw/qib/qib_verbs.c
 create mode 100644 drivers/infiniband/hw/qib/qib_verbs.h
 create mode 100644 drivers/infiniband/hw/qib/qib_verbs_mcast.c
 rename drivers/infiniband/hw/{ipath/ipath_7220.h => qib/qib_wc_ppc64.c} (57%)
 create mode 100644 drivers/infiniband/hw/qib/qib_wc_x86_64.c

-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-05-18  3:37 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-05-18  3:37 UTC (permalink / raw)
  To: torvalds, linux-kernel, akpm; +Cc: linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first batch InfinBand/RDMA changes for the 2.6.35
merge window:

Chien Tung (1):
      RDMA/nes: Make nesadapter->phy_lock usage consistent

Dan Carpenter (1):
      IB/iser: Fix error flow in iser_create_ib_conn_res()

FUJITA Tomonori (3):
      RDMA/cxgb3: Use the dma state API instead of pci equivalents
      RDMA/amso1100: Use the dma state API instead of pci equivalents
      IB/mthca: Use the dma state API instead of pci equivalents

Julia Lawall (1):
      IB/core: Use kmemdup() instead of kmalloc()+memcpy()

Or Gerlitz (4):
      IPoIB: Allow disabling/enabling TSO on the fly through ethtool
      IB/iser: Add asynchronous event handler
      IB/iser: Remove buggy back-pointer setting
      IB/iser: Enhance disconnection logic for multi-pathing

Roland Dreier (5):
      IB: Explicitly rule out llseek to avoid BKL in default_llseek()
      RDMA/nes: Make unnecessarily global functions static
      RDMA/cxgb3: Shrink .text with compile-time init of handlers arrays
      MAINTAINERS: Add cxgb4 and iw_cxgb4 entries
      Merge branches 'amso1100', 'bkl', 'cma', 'cxgb3', 'cxgb4', 'ipoib', 'iser', 'masked-atomics', 'misc', 'mthca' and 'nes' into for-next

Steve Wise (2):
      RDMA/cxgb3: Don't free skbs on NET_XMIT_* indications from LLD
      RDMA/cxgb4: Add driver for Chelsio T4 RNIC

Tetsuo Handa (1):
      RDMA/cma: Randomize local port allocation

Vladimir Sokolovsky (2):
      IB/core: Add support for masked atomic operations
      IB/mlx4: Add support for masked atomic operations

 MAINTAINERS                                   |   14 +
 drivers/infiniband/Kconfig                    |    1 +
 drivers/infiniband/Makefile                   |    1 +
 drivers/infiniband/core/cma.c                 |   74 +-
 drivers/infiniband/core/mad.c                 |    4 +-
 drivers/infiniband/core/ucm.c                 |    3 +-
 drivers/infiniband/core/ucma.c                |    4 +-
 drivers/infiniband/core/user_mad.c            |   12 +-
 drivers/infiniband/core/uverbs_main.c         |   11 +-
 drivers/infiniband/hw/amso1100/c2.h           |    2 +-
 drivers/infiniband/hw/amso1100/c2_alloc.c     |    4 +-
 drivers/infiniband/hw/amso1100/c2_cq.c        |    4 +-
 drivers/infiniband/hw/amso1100/c2_mq.h        |    2 +-
 drivers/infiniband/hw/amso1100/c2_provider.h  |    2 +-
 drivers/infiniband/hw/amso1100/c2_rnic.c      |   12 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c        |   12 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.h        |    2 +-
 drivers/infiniband/hw/cxgb3/cxio_wr.h         |    4 +-
 drivers/infiniband/hw/cxgb3/iwch.c            |    2 -
 drivers/infiniband/hw/cxgb3/iwch_cm.c         |  133 +-
 drivers/infiniband/hw/cxgb4/Kconfig           |   18 +
 drivers/infiniband/hw/cxgb4/Makefile          |    5 +
 drivers/infiniband/hw/cxgb4/cm.c              | 2374 +++++++++++++++++++++++++
 drivers/infiniband/hw/cxgb4/cq.c              |  882 +++++++++
 drivers/infiniband/hw/cxgb4/device.c          |  520 ++++++
 drivers/infiniband/hw/cxgb4/ev.c              |  193 ++
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h        |  745 ++++++++
 drivers/infiniband/hw/cxgb4/mem.c             |  811 +++++++++
 drivers/infiniband/hw/cxgb4/provider.c        |  518 ++++++
 drivers/infiniband/hw/cxgb4/qp.c              | 1577 ++++++++++++++++
 drivers/infiniband/hw/cxgb4/resource.c        |  417 +++++
 drivers/infiniband/hw/cxgb4/t4.h              |  550 ++++++
 drivers/infiniband/hw/cxgb4/t4fw_ri_api.h     |  829 +++++++++
 drivers/infiniband/hw/cxgb4/user.h            |   66 +
 drivers/infiniband/hw/mlx4/cq.c               |    8 +
 drivers/infiniband/hw/mlx4/main.c             |    1 +
 drivers/infiniband/hw/mlx4/qp.c               |   50 +-
 drivers/infiniband/hw/mthca/mthca_allocator.c |    8 +-
 drivers/infiniband/hw/mthca/mthca_eq.c        |    6 +-
 drivers/infiniband/hw/mthca/mthca_provider.h  |    2 +-
 drivers/infiniband/hw/nes/nes_hw.c            |   12 +-
 drivers/infiniband/hw/nes/nes_nic.c           |   16 +-
 drivers/infiniband/hw/nes/nes_utils.c         |   10 -
 drivers/infiniband/hw/nes/nes_verbs.c         |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c  |   20 +
 drivers/infiniband/ulp/iser/iscsi_iser.c      |    9 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h      |    4 +-
 drivers/infiniband/ulp/iser/iser_verbs.c      |  115 +-
 include/linux/mlx4/device.h                   |    4 +-
 include/linux/mlx4/qp.h                       |    7 +
 include/rdma/ib_verbs.h                       |    7 +
 51 files changed, 9838 insertions(+), 251 deletions(-)
 create mode 100644 drivers/infiniband/hw/cxgb4/Kconfig
 create mode 100644 drivers/infiniband/hw/cxgb4/Makefile
 create mode 100644 drivers/infiniband/hw/cxgb4/cm.c
 create mode 100644 drivers/infiniband/hw/cxgb4/cq.c
 create mode 100644 drivers/infiniband/hw/cxgb4/device.c
 create mode 100644 drivers/infiniband/hw/cxgb4/ev.c
 create mode 100644 drivers/infiniband/hw/cxgb4/iw_cxgb4.h
 create mode 100644 drivers/infiniband/hw/cxgb4/mem.c
 create mode 100644 drivers/infiniband/hw/cxgb4/provider.c
 create mode 100644 drivers/infiniband/hw/cxgb4/qp.c
 create mode 100644 drivers/infiniband/hw/cxgb4/resource.c
 create mode 100644 drivers/infiniband/hw/cxgb4/t4.h
 create mode 100644 drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
 create mode 100644 drivers/infiniband/hw/cxgb4/user.h
-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-04-09 16:13 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-04-09 16:13 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few small fixes that have trickled in:

Chien Tung (1):
      RDMA/nes: Correct cap.max_inline_data assignment in nes_query_qp()

Dan Carpenter (1):
      IB/mlx4: Check correct variable for allocation failure

Jani Nikula (1):
      IB/cm: Fix device_create() return value check

Roland Dreier (1):
      Merge branches 'cma', 'misc', 'mlx4' and 'nes' into for-linus

shefty (1):
      RDMA/cm: Set num_paths when manually assigning path records

 drivers/infiniband/core/cm.c          |    2 +-
 drivers/infiniband/core/cma.c         |    1 +
 drivers/infiniband/hw/mlx4/mr.c       |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c |    9 ++++-----
 4 files changed, 7 insertions(+), 7 deletions(-)

-- 
Roland Dreier <rolandd@cisco.com> || For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-03-12 18:56 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-03-12 18:56 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few small fixes:

Chien Tung (2):
      RDMA/nes: Clear stall bit before destroying NIC QP
      RDMA/nes: Fix CX4 link problem in back-to-back configuration

Eli Cohen (1):
      IPoIB: Fix TX queue lockup with mixed UD/CM traffic

Faisal Latif (1):
      RDMA/nes: Set assume_aligned_header bit

Or Gerlitz (1):
      IPoIB: Include return code in trace message for ib_post_send() failures

Roland Dreier (1):
      Merge branches 'cxgb3', 'ipoib', 'misc' and 'nes' into for-next

Steve Wise (2):
      IB/mad: Ignore iWARP devices on device removal
      RDMA/cxgb3: Wait at least one schedule cycle during device removal

 drivers/infiniband/core/mad.c           |    3 +++
 drivers/infiniband/hw/cxgb3/iwch.c      |    2 ++
 drivers/infiniband/hw/nes/nes_hw.c      |    8 ++++++++
 drivers/infiniband/hw/nes/nes_hw.h      |    1 +
 drivers/infiniband/hw/nes/nes_nic.c     |   30 ++++++++++++++++++++++++++++--
 drivers/infiniband/hw/nes/nes_verbs.c   |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |   10 +++++++---
 drivers/infiniband/ulp/ipoib/ipoib_ib.c |    9 +++++----
 8 files changed, 55 insertions(+), 9 deletions(-)

-- 
Roland Dreier  <rolandd@cisco.com>
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* Re: [GIT PULL] please pull infiniband.git
  2010-03-02  7:56 Roland Dreier
@ 2010-03-02 11:52 ` Tziporet Koren
  0 siblings, 0 replies; 223+ messages in thread
From: Tziporet Koren @ 2010-03-02 11:52 UTC (permalink / raw)
  To: Roland Dreier; +Cc: torvalds, akpm, linux-kernel, linux-rdma

On 3/2/2010 9:56 AM, Roland Dreier wrote:
> Linus, please pull from
>
>      master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus
>
> This tree is also available from kernel.org mirrors at:
>
>      git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus
>
> This will get my current pile for the 2.6.34 merge window:
>    
What about the pending patches for:
- XRC
- IBoE
- SRIOV support for mlx4


Thanks
Tziporet





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

* [GIT PULL] please pull infiniband.git
@ 2010-03-02  7:56 Roland Dreier
  2010-03-02 11:52 ` Tziporet Koren
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2010-03-02  7:56 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get my current pile for the 2.6.34 merge window:

Alexander Chiang (18):
      IB/uverbs: Convert *cdev to cdev in struct ib_uverbs_device
      IB/uverbs: Remove dev_table
      IB/uverbs: Use stack variable 'devnum' in ib_uverbs_add_one
      IB/uverbs: use stack variable 'base' in ib_uverbs_add_one
      IB/uverbs: Increase maximum devices supported
      IB/uverbs: Pack struct ib_uverbs_event_file tighter
      IB/uverbs: Whitespace cleanup
      IB/umad: Convert *cdev to cdev in struct ib_umad_port
      IB/umad: Remove port_table[]
      IB/umad: Use stack variable 'devnum' in ib_umad_init_port
      IB/umad: Use stack variable 'base' in ib_umad_init_port
      IB/umad: Increase maximum devices supported
      IB/umad: Clean whitespace
      IB/ucm: Use stack variable 'devnum' in ib_ucm_add_one
      IB/ucm: Use stack variable 'base' in ib_ucm_add_one
      IB/ucm: Increase maximum devices supported
      IB/ucm: Clean whitespace errors
      IB/core: Pack struct ib_device a little tighter

Alexander Schmidt (3):
      IB/ehca: Do not turn off irqs in tasklet context
      IB/ehca: Allow access for ib_query_qp()
      IB/ehca: Require in_wc in process_mad()

Bart Van Assche (1):
      IB/srp: Split send and recieve CQs to reduce number of interrupts

Chien Tung (1):
      RDMA/nes: Add support for KR device id 0x0110

Eli Cohen (2):
      IB/mlx4: Simplify retrieval of ib_device
      IB/core: Fix and clean up ib_ud_header_init()

Faisal Latif (3):
      RDMA/nes: Use atomic counters for CM listener create and destroy
      RDMA/nes: Fix crash when listener destroyed during loopback setup
      RDMA/nes: Multiple disconnects cause crash during AE handling

Jiri Slaby (1):
      RDMA: Use rlimit helpers

Or Gerlitz (11):
      IPoIB: Remove TX moderation settings from ethtool support
      RDMA/nes: Change WQ overflow return code
      IB/iser: Revert commit bba7ebb "avoid recv buffer exhaustion"
      IB/iser: New receive buffer posting logic
      IB/iser: Remove atomic counter for posted receive buffers
      IB/iser: Use different CQ for send completions
      IB/iser: Simplify send flow/descriptors
      IB/iser: Use atomic allocations
      IB/iser: Remove unnecessary connection checks
      IB/iser: Use libiscsi passthrough mode
      IB/iser: Remove redundant locking from iser scsi command response flow

Roland Dreier (11):
      IB/uverbs: Use anon_inodes instead of private infinibandeventfs
      IB/srp: Clean up error path in srp_create_target_ib()
      Merge branch 'cma' into for-next
      Merge branch 'cxgb3' into for-next
      Merge branch 'ehca' into for-next
      Merge branch 'ipoib' into for-next
      Merge branch 'iser' into for-next
      Merge branch 'mlx4' into for-next
      Merge branch 'nes' into for-next
      Merge branch 'srp' into for-next
      Merge branch 'misc' into for-next

Sean Hefty (1):
      RDMA/cm: Remove unused definition of RDMA_PS_SCTP

Steve Wise (5):
      RDMA/cxgb3: Remove BUG_ON() on CQ rearm failure
      RDMA/cxgb3: Doorbell overflow avoidance and recovery
      RDMA/cxgb3: Increase the max CQ depth
      RDMA/cxgb3: Don't allocate the SW queue for user mode CQs
      RDMA/cxgb3: Mark RDMA device with CXIO_ERROR_FATAL when removing

 drivers/infiniband/Kconfig                     |    1 +
 drivers/infiniband/core/ucm.c                  |   63 +++-
 drivers/infiniband/core/ud_header.c            |   14 +-
 drivers/infiniband/core/umem.c                 |    2 +-
 drivers/infiniband/core/user_mad.c             |  173 +++++----
 drivers/infiniband/core/uverbs.h               |   11 +-
 drivers/infiniband/core/uverbs_main.c          |  234 +++++------
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |   15 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.h         |    4 +-
 drivers/infiniband/hw/cxgb3/cxio_wr.h          |   17 +-
 drivers/infiniband/hw/cxgb3/iwch.c             |   80 ++++-
 drivers/infiniband/hw/cxgb3/iwch.h             |    2 +
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |    9 +-
 drivers/infiniband/hw/ehca/ehca_irq.c          |    5 +-
 drivers/infiniband/hw/ehca/ehca_qp.c           |    4 +-
 drivers/infiniband/hw/ehca/ehca_sqp.c          |    2 +-
 drivers/infiniband/hw/ipath/ipath_user_pages.c |    3 +-
 drivers/infiniband/hw/mlx4/qp.c                |    4 +-
 drivers/infiniband/hw/mthca/mthca_qp.c         |    2 +-
 drivers/infiniband/hw/nes/nes.c                |    1 +
 drivers/infiniband/hw/nes/nes.h                |    9 +-
 drivers/infiniband/hw/nes/nes_cm.c             |   11 +-
 drivers/infiniband/hw/nes/nes_hw.c             |  488 ++++++++++++-----------
 drivers/infiniband/hw/nes/nes_hw.h             |    2 +-
 drivers/infiniband/hw/nes/nes_nic.c            |   61 +---
 drivers/infiniband/hw/nes/nes_verbs.c          |    6 +-
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c   |   10 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c       |   47 ++-
 drivers/infiniband/ulp/iser/iscsi_iser.h       |   97 +++---
 drivers/infiniband/ulp/iser/iser_initiator.c   |  506 ++++++++----------------
 drivers/infiniband/ulp/iser/iser_memory.c      |   64 +---
 drivers/infiniband/ulp/iser/iser_verbs.c       |  281 +++++++-------
 drivers/infiniband/ulp/srp/ib_srp.c            |   91 +++--
 drivers/infiniband/ulp/srp/ib_srp.h            |    6 +-
 drivers/net/cxgb3/adapter.h                    |    5 +
 drivers/net/cxgb3/cxgb3_main.c                 |   57 +++-
 drivers/net/cxgb3/cxgb3_offload.h              |    5 +-
 drivers/net/cxgb3/regs.h                       |   16 +
 drivers/net/cxgb3/sge.c                        |   10 +-
 drivers/net/cxgb3/t3_hw.c                      |    5 +-
 include/rdma/ib_pack.h                         |    1 +
 include/rdma/ib_verbs.h                        |    4 +-
 include/rdma/rdma_cm.h                         |    1 -
 44 files changed, 1221 insertions(+), 1210 deletions(-)
-- 
Roland Dreier  <rolandd@cisco.com>
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-02-10 20:03 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-02-10 20:03 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one partial revert needed to fix a regression due to a
behavior change introduced in 2.6.33-rc1 that breaks some existing apps:

Sean Hefty (1):
      RDMA/cm: Revert association of an RDMA device when binding to loopback

 drivers/infiniband/core/cma.c |    4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index cc9b594..875e34e 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -2115,9 +2115,7 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
 	if (ret)
 		goto err1;
 
-	if (cma_loopback_addr(addr)) {
-		ret = cma_bind_loopback(id_priv);
-	} else if (!cma_zero_addr(addr)) {
+	if (!cma_any_addr(addr)) {
 		ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
 		if (ret)
 			goto err1;

-- 
Roland Dreier  <rolandd@cisco.com>
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/index.html

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

* [GIT PULL] please pull infiniband.git
@ 2010-01-07 19:30 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2010-01-07 19:30 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few very small fixes that have trickled in over the
holidays.

Eli Cohen (1):
      mlx4_core: Fix cleanup in __mlx4_init_one() error path

Jack Morgenstein (1):
      IB/mlx4: Initialize SRQ scatter entries when creating an SRQ

Or Gerlitz (1):
      IB/mlx4: Fix queue overflow check in post_recv

Robert P. J. Day (1):
      IB/addr: Correct CONFIG_IPv6 to CONFIG_IPV6

Roland Dreier (1):
      Merge branches 'misc' and 'mlx4' into for-next

 drivers/infiniband/core/cma.c    |    2 +-
 drivers/infiniband/hw/mlx4/qp.c  |    2 +-
 drivers/infiniband/hw/mlx4/srq.c |    6 ++++++
 drivers/net/mlx4/main.c          |    2 +-
 4 files changed, 9 insertions(+), 3 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-12-16  7:41 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-12-16  7:41 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, linux-rdma

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get all my pending 2.6.33 merge window stuff.  Sorry for
being so late, but I'm just now out from under my flu-induced
backlog.  None of the stuff here is in any way controversial: it's
pretty much all small fixes scattered around, with no major changes
included (we're saving those for 2.6.34).

Akinobu Mita (1):
      IB/ipath: Use bitmap_weight()

Alexander Schmidt (1):
      IB/ehca: Rework destroy_eq()

Bart Van Assche (2):
      IB: Clarify the documentation of ib_post_send()
      IB: Fix typo in ipoib.txt

Chien Tung (7):
      RDMA/nes: Add support for IB_WR_*INV
      RDMA/nes: Correct fast memory registration implementation
      RDMA/nes: Add additional SFP+ PHY uC status check and PHY reset
      RDMA/nes: Implement IB_SIGNAL_ALL_WR as an iWARP extension
      RDMA/nes: Clean up struct nes_qp
      RDMA/nes: Add max_cqe check to nes_create_cq()
      RDMA/nes: Update copyright and branding string

David J. Wilder (1):
      IPoIB: Clear ipoib_neigh.dgid in ipoib_neigh_alloc()

Eli Cohen (2):
      IB/mlx4: Remove unneeded code
      IB/mlx4: Remove limitation on LSO header size

Eric Dumazet (1):
      RDMA/addr: Use appropriate locking with for_each_netdev()

Faisal Latif (11):
      RDMA/nes: Fix MAX_CM_BUFFER define
      RDMA/nes: Fix query of ORD values
      RDMA/nes: MPA request/response error checking
      RDMA/nes: Resource not freed for REJECTed connections
      RDMA/nes: Fix crash in nes_accept()
      RDMA/nes: Abnormal listener exit causes loopback node crash
      RDMA/nes: Fix Xansation test crash on cm_node ref_count
      RDMA/nes: Check for zero STag
      RDMA/nes: Free kmap() resources
      RDMA/nes: FIN during MPA startup causes timeout
      RDMA/nes: Fix stale ARP issue

Frank Zago (5):
      RDMA/nes: In nes_post_send() always set bad_wr on error
      RDMA/nes: In nes_post_recv() always set bad_wr on error
      RDMA/amso1100: Fix error paths in post_send and post_recv
      IB/ehca: Fix error paths in post_send and post_recv
      RDMA/cxgb3: Fix error paths in post_send and post_recv

Jason Gunthorpe (2):
      RDMA/cma: Correct detection of SA Created MGID
      RDMA/cma: Fix AF_INET6 support in multicast joining

Julia Lawall (1):
      RDMA/nes: Pass correct size to ioremap_nocache()

Or Gerlitz (1):
      IB/iser: Rewrite SG handling for RDMA logic

Roel Kluin (1):
      IB/uverbs: Fix return of PTR_ERR() of wrong pointer in ib_uverbs_get_context()

Roland Dreier (1):
      Merge branches 'amso1100', 'cma', 'cxgb3', 'ehca', 'ipath', 'ipoib', 'iser', 'misc', 'mlx4' and 'nes' into for-next

Sean Hefty (7):
      RDMA/ucma: Add option to manually set IB path
      RDMA/cma: Replace net_device pointer with index
      IB/addr: Verify source and destination address families match
      IB/addr: Store net_device type instead of translating to RDMA transport
      RDMA/cm: fix loopback address support
      IB/addr: Simplify resolving IPv4 addresses
      IB/addr: Fix IPv6 routing lookup

Steve Wise (1):
      RDMA/cxgb3: Remove BUG_ON() on CQ rearm failure

Yevgeny Petrilin (1):
      mlx4_core: Fix parsing of reserved EQ cap

 Documentation/infiniband/ipoib.txt         |   10 +-
 drivers/infiniband/core/addr.c             |  275 ++++------
 drivers/infiniband/core/cma.c              |  133 +++--
 drivers/infiniband/core/sa_query.c         |    6 +
 drivers/infiniband/core/ucma.c             |   57 ++-
 drivers/infiniband/core/uverbs_cmd.c       |    2 +-
 drivers/infiniband/hw/amso1100/c2_qp.c     |   14 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c      |   32 +-
 drivers/infiniband/hw/ehca/ehca_classes.h  |    1 +
 drivers/infiniband/hw/ehca/ehca_eq.c       |    9 +-
 drivers/infiniband/hw/ehca/ehca_main.c     |    2 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c     |   67 +--
 drivers/infiniband/hw/ipath/ipath_driver.c |   10 +-
 drivers/infiniband/hw/mlx4/main.c          |    2 +-
 drivers/infiniband/hw/mlx4/qp.c            |   25 +-
 drivers/infiniband/hw/nes/Kconfig          |    9 +-
 drivers/infiniband/hw/nes/nes.c            |    5 +-
 drivers/infiniband/hw/nes/nes.h            |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c         |  201 +++++--
 drivers/infiniband/hw/nes/nes_cm.h         |    7 +-
 drivers/infiniband/hw/nes/nes_context.h    |    2 +-
 drivers/infiniband/hw/nes/nes_hw.c         |   40 +-
 drivers/infiniband/hw/nes/nes_hw.h         |   29 +-
 drivers/infiniband/hw/nes/nes_nic.c        |    2 +-
 drivers/infiniband/hw/nes/nes_user.h       |    3 +-
 drivers/infiniband/hw/nes/nes_utils.c      |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c      |  817 ++++++++++++++--------------
 drivers/infiniband/hw/nes/nes_verbs.h      |   23 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c  |    1 +
 drivers/infiniband/ulp/iser/iser_memory.c  |  122 ++---
 drivers/net/mlx4/fw.c                      |    3 +-
 include/linux/mlx4/device.h                |    1 +
 include/rdma/ib_addr.h                     |   36 +-
 include/rdma/ib_sa.h                       |    6 +
 include/rdma/ib_user_sa.h                  |   16 +
 include/rdma/ib_verbs.h                    |    5 +
 include/rdma/rdma_user_cm.h                |    6 +-
 net/rds/ib.c                               |    4 +-
 net/rds/iw.c                               |    4 +-
 39 files changed, 1084 insertions(+), 907 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-10-28 18:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-10-28 18:07 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will just get one PCI device ID addition:

Eli Cohen (1):
      mlx4_core: Add a new supported 40 GigE device ID

 drivers/net/mlx4/main.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index 5dd7225..291a505 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -1282,6 +1282,7 @@ static struct pci_device_id mlx4_pci_table[] = {
 	{ PCI_VDEVICE(MELLANOX, 0x6372) }, /* MT25458 ConnectX EN 10GBASE-T 10GigE */
 	{ PCI_VDEVICE(MELLANOX, 0x675a) }, /* MT25458 ConnectX EN 10GBASE-T+Gen2 10GigE */
 	{ PCI_VDEVICE(MELLANOX, 0x6764) }, /* MT26468 ConnectX EN 10GigE PCIe gen2*/
+	{ PCI_VDEVICE(MELLANOX, 0x6746) }, /* MT26438 ConnectX EN 40GigE PCIe gen2 5GT/s */
 	{ PCI_VDEVICE(MELLANOX, 0x676e) }, /* MT26478 ConnectX2 40GigE PCIe gen2 */
 	{ 0, }
 };

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

* [GIT PULL] please pull infiniband.git
@ 2009-10-09 17:08 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-10-09 17:08 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get another small batch of small RDMA/InfiniBand fixes, and
one device ID addition:

Bart Van Assche (1):
      IB: Fix typo in udev rule documentation

David J. Wilder (1):
      RDMA/addr: Fix resolution of local IPv6 addresses

Roland Dreier (1):
      Merge branches 'cxgb3', 'misc' and 'mlx4' into for-next

Steve Wise (2):
      RDMA/iwcm: Don't call provider reject func with irqs disabled
      RDMA/cxgb3: Handle NULL inetdev pointer in iwch_query_port()

Yevgeny Petrilin (1):
      mlx4_core: Add 40GigE device ID

 Documentation/infiniband/user_mad.txt       |    4 ++--
 Documentation/infiniband/user_verbs.txt     |    2 +-
 drivers/infiniband/core/addr.c              |    2 +-
 drivers/infiniband/core/iwcm.c              |    2 ++
 drivers/infiniband/hw/cxgb3/iwch_provider.c |   11 +++++++----
 drivers/net/mlx4/main.c                     |    1 +
 6 files changed, 14 insertions(+), 8 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-09-24 19:45 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-09-24 19:45 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, linux-rdma, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the batch of RDMA/InfiniBand changes for the 2.6.32
merge window:

The following changes since commit 86d710146fb9975f04c505ec78caa43d227c1018:
  Linus Torvalds (1):
        Merge git://git.linux-nfs.org/projects/trondmy/nfs-2.6

are available in the git repository at:

  master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Eli Cohen (1):
      mlx4_core: Pass cache line size to device FW

Jack Morgenstein (1):
      IB/mthca: Fix access to freed memory in catastrophic event handling

Julia Lawall (1):
      RDMA/nes: Remove duplicate .ndo_set_mac_address field initialization

Moni Shoua (1):
      IPoIB: Don't turn on carrier for a non-active port

Roland Dreier (2):
      IB/mad: Fix lock-lock-timer deadlock in RMPP code
      Merge branches 'ipoib', 'mad', 'mlx4', 'mthca' and 'nes' into for-linus

 drivers/infiniband/core/mad_rmpp.c             |   17 +++++++++++++----
 drivers/infiniband/hw/mthca/mthca_catas.c      |   11 ++++++++---
 drivers/infiniband/hw/nes/nes_nic.c            |    1 -
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    7 +++++++
 drivers/net/mlx4/fw.c                          |    5 +++++
 5 files changed, 33 insertions(+), 8 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-09-11  4:23 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-09-11  4:23 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-rdma, general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the batch of RDMA/InfiniBand changes for the 2.6.32
merge window:

Alexander Schmidt (1):
      IB/ehca: Make port autodetect mode the default

Arputham Benjamin (2):
      mlx4_core: Distinguish multiple devices in /proc/interrupts
      IB/mthca: Distinguish multiple devices in /proc/interrupts

Chien Tung (1):
      RDMA/nes: Map MTU to IB_MTU_* and correctly report link state

Don Wood (10):
      RDMA/nes: Update refcnt during disconnect
      RDMA/nes: Allocate work item for disconnect event handling
      RDMA/nes: Change memory allocation for cqp request to GFP_ATOMIC
      RDMA/nes: Clean out CQ completions when QP is destroyed
      RDMA/nes: Add CQ error handling
      RDMA/nes: Implement Terminate Packet
      RDMA/nes: Use flush mechanism to set status for wqe in error
      RDMA/nes: Make poll_cq return correct number of wqes during flush
      RDMA/nes: Use the flush code to fill in cqe error
      RDMA/nes: Rework the disconn routine for terminate and flushing

Hal Rosenstock (1):
      IB/mad: Allow tuning of QP0 and QP1 sizes

Jack Morgenstein (3):
      IB/uverbs: Return ENOSYS for unimplemented commands (not EINVAL)
      IB/mlx4: Don't allow userspace open while recovering from catastrophic error
      IB/mthca: Don't allow userspace open while recovering from catastrophic error

Jason Gunthorpe (1):
      IPoIB: Check multicast address format

Joachim Fenkes (2):
      IB/ehca: Construct MAD redirect replies from request MAD
      IB/ehca: Fix CQE flags reporting

Marcin Slusarz (1):
      IB: Use printk_once() for driver versions

Roel Kluin (2):
      IB/ipath: strncpy() doesn't always NUL-terminate
      RDMA/amso1100: Check kmalloc() result in c2_register_device()

Roland Dreier (15):
      IPoIB: Remove unused <rdma/ib_cache.h> includes
      IPoIB: Drop priv->lock before calling ipoib_send()
      IB/mad: Check hop count field in directed route MAD to avoid array overflow
      IB: Use DEFINE_SPINLOCK() for static spinlocks
      mlx4_core: Use pci_request_regions()
      mlx4_core: Remove unnecessary includes of <linux/init.h>
      IB/mlx4: Annotate CQ locking
      mlx4_core: Allocate and map sufficient ICM memory for EQ context
      IB/mthca: Remove unnecessary include of <asm/page.h>
      IB/mthca: Remove unnecessary include of <linux/init.h>
      IB/mthca: Annotate CQ locking
      IB/mad: Fix possible lock-lock-timer deadlock
      MAINTAINERS: InfiniBand/RDMA mailing list transition to vger
      Merge branches 'cxgb3', 'ehca', 'ipath', 'ipoib', 'misc', 'mlx4', 'mthca' and 'nes' into for-linus
      Merge branch 'mad' into for-linus

Steve Wise (8):
      RDMA/cxgb3: iwch_unregister_device leaks memory
      RDMA/cxgb3: Set the appropriate IO channel in rdma_init work requests
      RDMA/cxgb3: Handle port events properly
      RDMA/cxgb3: Don't free endpoints early
      RDMA/cxgb3: Wake up any waiters on peer close/abort
      RDMA/cxgb3: Don't ignore insert_handle() failures
      RDMA/cxgb3: Clean up properly on FW mismatch failures
      RDMA/iwcm: Reject the connection when the cm_id is destroyed

Tobias Klauser (1):
      RDMA/amso1100: Use %pM conversion specifier

Yevgeny Petrilin (1):
      mlx4_core: Avoid double free_icms

Yossi Etigin (1):
      IB/core: Fix send multicast group leave retry

 MAINTAINERS                                    |   12 +-
 drivers/infiniband/core/iwcm.c                 |    1 +
 drivers/infiniband/core/mad.c                  |   35 +-
 drivers/infiniband/core/mad_priv.h             |    3 +
 drivers/infiniband/core/multicast.c            |   10 +-
 drivers/infiniband/core/sa_query.c             |    7 +-
 drivers/infiniband/core/smi.c                  |    8 +
 drivers/infiniband/core/uverbs_main.c          |   10 +-
 drivers/infiniband/hw/amso1100/c2.c            |    6 +-
 drivers/infiniband/hw/amso1100/c2_provider.c   |   24 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |    5 +-
 drivers/infiniband/hw/cxgb3/cxio_wr.h          |    6 +
 drivers/infiniband/hw/cxgb3/iwch.c             |   37 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |   68 ++-
 drivers/infiniband/hw/cxgb3/iwch_cm.h          |    9 +-
 drivers/infiniband/hw/cxgb3/iwch_mem.c         |   21 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |   52 ++-
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |    1 +
 drivers/infiniband/hw/ehca/ehca_main.c         |    8 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c         |    6 +-
 drivers/infiniband/hw/ehca/ehca_sqp.c          |   47 ++-
 drivers/infiniband/hw/ipath/ipath_file_ops.c   |    2 +-
 drivers/infiniband/hw/ipath/ipath_mad.c        |    2 +-
 drivers/infiniband/hw/mlx4/main.c              |   12 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h           |    1 +
 drivers/infiniband/hw/mlx4/qp.c                |   12 +-
 drivers/infiniband/hw/mthca/mthca_catas.c      |    1 +
 drivers/infiniband/hw/mthca/mthca_config_reg.h |    2 -
 drivers/infiniband/hw/mthca/mthca_dev.h        |    1 +
 drivers/infiniband/hw/mthca/mthca_eq.c         |   17 +-
 drivers/infiniband/hw/mthca/mthca_main.c       |    8 +-
 drivers/infiniband/hw/mthca/mthca_provider.c   |    3 +
 drivers/infiniband/hw/mthca/mthca_provider.h   |    1 +
 drivers/infiniband/hw/mthca/mthca_qp.c         |   12 +-
 drivers/infiniband/hw/mthca/mthca_reset.c      |    1 -
 drivers/infiniband/hw/nes/nes.h                |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c             |  128 ++--
 drivers/infiniband/hw/nes/nes_cm.h             |    2 -
 drivers/infiniband/hw/nes/nes_hw.c             |  767 +++++++++++++++++-------
 drivers/infiniband/hw/nes/nes_hw.h             |  103 ++++
 drivers/infiniband/hw/nes/nes_utils.c          |    5 +-
 drivers/infiniband/hw/nes/nes_verbs.c          |  204 +++++--
 drivers/infiniband/hw/nes/nes_verbs.h          |   16 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |    1 -
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |    1 -
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    7 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   21 +
 drivers/net/cxgb3/cxgb3_main.c                 |    6 +-
 drivers/net/cxgb3/cxgb3_offload.c              |    6 +-
 drivers/net/cxgb3/cxgb3_offload.h              |    8 +-
 drivers/net/mlx4/cq.c                          |    1 -
 drivers/net/mlx4/eq.c                          |   77 +--
 drivers/net/mlx4/icm.c                         |    1 -
 drivers/net/mlx4/main.c                        |   37 +-
 drivers/net/mlx4/mcg.c                         |    1 -
 drivers/net/mlx4/mlx4.h                        |    7 +-
 drivers/net/mlx4/mr.c                          |    1 -
 drivers/net/mlx4/pd.c                          |    1 -
 drivers/net/mlx4/profile.c                     |    2 -
 drivers/net/mlx4/qp.c                          |    2 -
 drivers/net/mlx4/reset.c                       |    1 -
 drivers/net/mlx4/srq.c                         |    2 -
 drivers/scsi/cxgb3i/cxgb3i_init.c              |   12 +-
 63 files changed, 1278 insertions(+), 595 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-07-14 18:48 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-07-14 18:48 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a new PCI ID for the mlx4 driver, which also requires
handling one new firmware status code.  The chance of regressions
should be near-nil, since existing devices won't hit any of the new
code (and the worst case seems to be printing an incorrect error
message anyway).

Yevgeny Petrilin (2):
      mlx4_core: Handle multi-physical function devices
      mlx4_core: Add new ConnectX EN PCI ID 0x6764

 drivers/net/mlx4/cmd.c  |    5 ++++-
 drivers/net/mlx4/main.c |    6 +++++-
 2 files changed, 9 insertions(+), 2 deletions(-)


diff --git a/drivers/net/mlx4/cmd.c b/drivers/net/mlx4/cmd.c
index 2845a05..65ec77d 100644
--- a/drivers/net/mlx4/cmd.c
+++ b/drivers/net/mlx4/cmd.c
@@ -80,7 +80,9 @@ enum {
 	/* Bad management packet (silently discarded): */
 	CMD_STAT_BAD_PKT	= 0x30,
 	/* More outstanding CQEs in CQ than new CQ size: */
-	CMD_STAT_BAD_SIZE	= 0x40
+	CMD_STAT_BAD_SIZE	= 0x40,
+	/* Multi Function device support required: */
+	CMD_STAT_MULTI_FUNC_REQ	= 0x50,
 };
 
 enum {
@@ -128,6 +130,7 @@ static int mlx4_status_to_errno(u8 status)
 		[CMD_STAT_LAM_NOT_PRE]	  = -EAGAIN,
 		[CMD_STAT_BAD_PKT]	  = -EINVAL,
 		[CMD_STAT_BAD_SIZE]	  = -ENOMEM,
+		[CMD_STAT_MULTI_FUNC_REQ] = -EACCES,
 	};
 
 	if (status >= ARRAY_SIZE(trans_table) ||
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index 018348c..dac621b 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -729,7 +729,10 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
 
 	err = mlx4_QUERY_FW(dev);
 	if (err) {
-		mlx4_err(dev, "QUERY_FW command failed, aborting.\n");
+		if (err == -EACCES)
+			mlx4_info(dev, "non-primary physical function, skipping.\n");
+		else
+			mlx4_err(dev, "QUERY_FW command failed, aborting.\n");
 		return err;
 	}
 
@@ -1285,6 +1288,7 @@ static struct pci_device_id mlx4_pci_table[] = {
 	{ PCI_VDEVICE(MELLANOX, 0x6750) }, /* MT25408 "Hermon" EN 10GigE PCIe gen2 */
 	{ PCI_VDEVICE(MELLANOX, 0x6372) }, /* MT25458 ConnectX EN 10GBASE-T 10GigE */
 	{ PCI_VDEVICE(MELLANOX, 0x675a) }, /* MT25458 ConnectX EN 10GBASE-T+Gen2 10GigE */
+	{ PCI_VDEVICE(MELLANOX, 0x6764) }, /* MT26468 ConnectX EN 10GigE PCIe gen2*/
 	{ 0, }
 };
 

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

* [GIT PULL] please pull infiniband.git
@ 2009-06-23 17:39 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-06-23 17:39 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This has a few more fixes for 2.6.31-rc1; however everything here
should be a fix appropriate for -rc2 as well, so if this misses the
end of the merge window then I think it should still be OK to pull.

Alexander Schmidt (1):
      IB/ehca: Bump version number

Faisal Latif (2):
      RDMA/nes: Fix max_qp_init_rd_atom returned from query device
      RDMA/nes: Fix FIN state handling under error conditions

Hannes Hering (1):
      IB/ehca: Tolerate dynamic memory operations before driver load

Peter Huewe (1):
      RDMA: Add __init/__exit macros to addr.c and cma.c

Roel Kluin (1):
      IB/ehca: Ensure that guid_entry index is not negative

Roland Dreier (3):
      IB/mthca: Replace dma_sync_single() use with proper functions
      mlx4_core: Fix dma_sync_single_for_cpu() with matching for_device() calls
      Merge branches 'ehca', 'misc', 'mlx4', 'mthca' and 'nes' into for-linus

 drivers/infiniband/core/addr.c         |    4 +-
 drivers/infiniband/core/cma.c          |    4 +-
 drivers/infiniband/hw/ehca/ehca_hca.c  |    2 +-
 drivers/infiniband/hw/ehca/ehca_main.c |   20 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c |  508 +++++++++++++++++++++++++++++++-
 drivers/infiniband/hw/ehca/ehca_mrmw.h |   13 +-
 drivers/infiniband/hw/mthca/mthca_mr.c |   13 +-
 drivers/infiniband/hw/nes/nes_cm.c     |    8 +-
 drivers/infiniband/hw/nes/nes_verbs.c  |    2 +-
 drivers/net/mlx4/mr.c                  |   14 +-
 10 files changed, 554 insertions(+), 34 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-06-14 20:47 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-06-14 20:47 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This has the main batch of InfiniBand/RDMA changes for 2.6.31; sorry
for being so late in the merge cycle but the whole family was sick
with the stomach flu for the past week and, well, merge requests
weren't a top priority.

Anyway, this has been a slow cycle for my tree for whatever reason, so
there's not much here; everything has been in -next for a while except
for my two IRQ double-free patches, which fix a just-reported bug (and
are tiny and have been tested).

Anton Blanchard (1):
      IB/ehca: Replace vmalloc() with kmalloc() for queue allocation

Eli Cohen (2):
      IB/mthca: Add module parameter for number of MTTs per segment
      mlx4_core: Add module parameter for number of MTTs per segment

Jack Morgenstein (1):
      IB/mlx4: Add strong ordering to local inval and fast reg work requests

Jack Stone (1):
      infiniband: Remove void casts

Joachim Fenkes (1):
      IB/ehca: Remove superfluous bitmasks from QP control block

Roel Kluin (1):
      RDMA/nes: Fix off-by-one bugs in reset_adapter_ne020() and init_serdes()

Roland Dreier (3):
      IB/mthca: Don't double-free IRQs when falling back from MSI-X to INTx
      mlx4_core: Don't double-free IRQs when falling back from MSI-X to INTx
      Merge branches 'cxgb3', 'ehca', 'misc', 'mlx4', 'mthca' and 'nes' into for-linus

Stefan Roscher (3):
      IB/ehca: Fall back to vmalloc() for big allocations
      IB/ehca: Remove unnecessary memory operations for userspace queue pairs
      IB/ehca: Increment version number

Steve Wise (2):
      RDMA/cxgb3: Report correct port state and MTU
      RDMA/cxgb3: Limit fast register size based on T3 limitations

 drivers/infiniband/hw/amso1100/c2_cq.c            |    4 +-
 drivers/infiniband/hw/cxgb3/cxio_wr.h             |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c       |   32 ++++++-
 drivers/infiniband/hw/ehca/ehca_classes_pSeries.h |   28 -----
 drivers/infiniband/hw/ehca/ehca_irq.c             |    9 +-
 drivers/infiniband/hw/ehca/ehca_main.c            |    2 +-
 drivers/infiniband/hw/ehca/ehca_qp.c              |  112 +++++++++++----------
 drivers/infiniband/hw/ehca/hcp_if.c               |    6 +-
 drivers/infiniband/hw/ehca/hcp_if.h               |    2 +-
 drivers/infiniband/hw/ehca/hcp_phyp.c             |   11 ++-
 drivers/infiniband/hw/ehca/hcp_phyp.h             |    2 +-
 drivers/infiniband/hw/ehca/ipz_pt_fn.c            |   19 +++-
 drivers/infiniband/hw/mlx4/qp.c                   |    4 +
 drivers/infiniband/hw/mthca/mthca_cmd.c           |    2 +-
 drivers/infiniband/hw/mthca/mthca_dev.h           |    1 +
 drivers/infiniband/hw/mthca/mthca_eq.c            |    4 +-
 drivers/infiniband/hw/mthca/mthca_main.c          |   17 +++-
 drivers/infiniband/hw/mthca/mthca_mr.c            |   16 ++--
 drivers/infiniband/hw/mthca/mthca_profile.c       |    4 +-
 drivers/infiniband/hw/nes/nes_hw.c                |   14 ++--
 drivers/net/mlx4/eq.c                             |    4 +-
 drivers/net/mlx4/main.c                           |   14 ++-
 drivers/net/mlx4/mr.c                             |    6 +-
 drivers/net/mlx4/profile.c                        |    2 +-
 include/linux/mlx4/device.h                       |    1 +
 include/linux/mlx4/qp.h                           |    1 +
 26 files changed, 183 insertions(+), 136 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-05-13 22:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-05-13 22:18 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a couple of fixes to low-level drivers that fix crashes
seen when running NFS/RDMA:

Jack Morgenstein (1):
      IB/mlx4: Don't overwrite fast registration page list when posting work request

Roland Dreier (1):
      Merge branches 'cxgb3' and 'mlx4' into for-linus

Steve Wise (1):
      RDMA/cxgb3: Don't complete flushed send work requests twice

 drivers/infiniband/hw/cxgb3/cxio_hal.c |    1 +
 drivers/infiniband/hw/mlx4/mlx4_ib.h   |    1 +
 drivers/infiniband/hw/mlx4/mr.c        |   10 ++++++++--
 drivers/infiniband/hw/mlx4/qp.c        |    2 +-
 4 files changed, 11 insertions(+), 3 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
index 8d71086..62f9cf2 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c
@@ -410,6 +410,7 @@ int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count)
 	ptr = wq->sq_rptr + count;
 	sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2);
 	while (ptr != wq->sq_wptr) {
+		sqp->signaled = 0;
 		insert_sq_cqe(wq, cq, sqp);
 		ptr++;
 		sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2);
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h
index 9974e88..8a7dd67 100644
--- a/drivers/infiniband/hw/mlx4/mlx4_ib.h
+++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h
@@ -86,6 +86,7 @@ struct mlx4_ib_mr {
 
 struct mlx4_ib_fast_reg_page_list {
 	struct ib_fast_reg_page_list	ibfrpl;
+	__be64			       *mapped_page_list;
 	dma_addr_t			map;
 };
 
diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c
index 8e4d26d..8f3666b 100644
--- a/drivers/infiniband/hw/mlx4/mr.c
+++ b/drivers/infiniband/hw/mlx4/mr.c
@@ -231,7 +231,11 @@ struct ib_fast_reg_page_list *mlx4_ib_alloc_fast_reg_page_list(struct ib_device
 	if (!mfrpl)
 		return ERR_PTR(-ENOMEM);
 
-	mfrpl->ibfrpl.page_list = dma_alloc_coherent(&dev->dev->pdev->dev,
+	mfrpl->ibfrpl.page_list = kmalloc(size, GFP_KERNEL);
+	if (!mfrpl->ibfrpl.page_list)
+		goto err_free;
+
+	mfrpl->mapped_page_list = dma_alloc_coherent(&dev->dev->pdev->dev,
 						     size, &mfrpl->map,
 						     GFP_KERNEL);
 	if (!mfrpl->ibfrpl.page_list)
@@ -242,6 +246,7 @@ struct ib_fast_reg_page_list *mlx4_ib_alloc_fast_reg_page_list(struct ib_device
 	return &mfrpl->ibfrpl;
 
 err_free:
+	kfree(mfrpl->ibfrpl.page_list);
 	kfree(mfrpl);
 	return ERR_PTR(-ENOMEM);
 }
@@ -252,8 +257,9 @@ void mlx4_ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list)
 	struct mlx4_ib_fast_reg_page_list *mfrpl = to_mfrpl(page_list);
 	int size = page_list->max_page_list_len * sizeof (u64);
 
-	dma_free_coherent(&dev->dev->pdev->dev, size, page_list->page_list,
+	dma_free_coherent(&dev->dev->pdev->dev, size, mfrpl->mapped_page_list,
 			  mfrpl->map);
+	kfree(mfrpl->ibfrpl.page_list);
 	kfree(mfrpl);
 }
 
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index f385a24..20724ae 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1365,7 +1365,7 @@ static void set_fmr_seg(struct mlx4_wqe_fmr_seg *fseg, struct ib_send_wr *wr)
 	int i;
 
 	for (i = 0; i < wr->wr.fast_reg.page_list_len; ++i)
-		wr->wr.fast_reg.page_list->page_list[i] =
+		mfrpl->mapped_page_list[i] =
 			cpu_to_be64(wr->wr.fast_reg.page_list->page_list[i] |
 				    MLX4_MTT_FLAG_PRESENT);
 

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

* [GIT PULL] please pull infiniband.git
@ 2009-04-28 23:03 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-04-28 23:03 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a batch of changes for -rc2, mostly low-level hardware
driver fixes with a few other miscellaneous fixes and an IPoIB
documentation update.

Chien Tung (8):
      RDMA/nes: Fix compiler warning at nes_verbs.c:1955
      RDMA/nes: Modify thermo mitigation to flip SerDes1 ref clk to internal
      RDMA/nes: Correct CDR loop filter setting for port 1
      RDMA/nes: Enable repause timer for port 1
      RDMA/nes: Set trace length to 1 inch for SFP_D
      RDMA/nes: Fix fw_ver in /sys
      RDMA/nes: Fix unused variable compile warning when INFINIBAND_NES_DEBUG=n
      RDMA/nes: Update iw_nes version

Don Wood (1):
      RDMA/nes: Fix bugs in nes_reg_phys_mr()

Faisal Latif (5):
      RDMA/nes: Do not set apbvt entry for loopback
      RDMA/nes: Check for sequence number wrap-around
      RDMA/nes: Increase rexmit timeout interval
      RDMA/nes: Fix hang issues for large cluster dynamic connections
      RDMA/nes: Fix error path in nes_accept()

Jack Morgenstein (1):
      IB/mthca: Fix timeout for INIT_HCA and a few other commands

Matt Kraai (1):
      RDMA/nes: Remove root_256()'s unused pbl_count_256 parameter

Miroslaw Walukiewicz (1):
      RDMA/nes: Fix resource issues in nes_create_cq() and nes_destroy_cq()

Nicolas Morey-Chaisemartin (1):
      mlx4_core: Fix memory leak in mlx4_enable_msi_x()

Roland Dreier (1):
      Merge branches 'cxgb3', 'ipoib', 'mthca', 'mlx4' and 'nes' into for-linus

Steve Wise (2):
      RDMA/cxgb3: Adjust ORD/IRD (if needed) for peer2peer connections
      RDMA/cxgb3: Don't zero QP attrs when moving to IDLE

Yossi Etigin (1):
      IPoIB: Disable NAPI while CQ is being drained

 drivers/infiniband/hw/cxgb3/iwch_cm.c     |    8 +++
 drivers/infiniband/hw/cxgb3/iwch_qp.c     |    1 -
 drivers/infiniband/hw/mthca/mthca_cmd.c   |   16 +++---
 drivers/infiniband/hw/nes/nes.h           |    4 +-
 drivers/infiniband/hw/nes/nes_cm.c        |   84 ++++++++++++++--------------
 drivers/infiniband/hw/nes/nes_cm.h        |    1 +
 drivers/infiniband/hw/nes/nes_hw.c        |   30 ++++++----
 drivers/infiniband/hw/nes/nes_verbs.c     |   67 +++++++++++++++--------
 drivers/infiniband/hw/nes/nes_verbs.h     |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_ib.c   |    6 ++-
 drivers/infiniband/ulp/ipoib/ipoib_main.c |    5 +--
 drivers/net/mlx4/main.c                   |    2 +-
 12 files changed, 130 insertions(+), 95 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-04-09 21:58 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-04-09 21:58 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a batch of changes for -rc2, mostly low-level hardware
driver fixes with a few other miscellaneous fixes and an IPoIB
documentation update.

Chien Tung (3):
      RDMA/nes: Fix SFP+ PHY initialization
      RDMA/nes: Add wide_ppm_offset parm for switch compatibility
      RDMA/nes: Add support for new SFP+ PHY

Don Wood (1):
      RDMA/nes: Fix incorrect casts on 32-bit architectures

Faisal Latif (2):
      RDMA/nes: Fix error handling issues
      RDMA/nes: Fix nes_nic_cm_xmit() error handling

Or Gerlitz (1):
      IPoIB: Document newish features

Roland Dreier (4):
      IB/mlx4: Use pgprot_writecombine() for BlueFlame pages
      mlx4_core: Don't leak mailbox for SET_PORT on Ethernet ports
      IPoIB: Avoid free_netdev() BUG when destroying a child interface
      Merge branches 'cma', 'cxgb3', 'ipoib', 'mlx4' and 'nes' into for-next

Steve Wise (2):
      RDMA/cxgb3: Handle EEH events
      RDMA/cxgb3: Release dependent resources only when endpoint memory is freed.

Yossi Etigin (2):
      RDMA/cma: Use rate from IPoIB broadcast when joining IPoIB multicast groups
      RDMA/cma: Create cm id even when IB port is down

 Documentation/infiniband/ipoib.txt        |   45 ++++
 drivers/infiniband/core/cma.c             |   45 +++-
 drivers/infiniband/hw/cxgb3/cxio_hal.c    |   10 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.h    |    6 +
 drivers/infiniband/hw/cxgb3/iwch.c        |   11 +-
 drivers/infiniband/hw/cxgb3/iwch.h        |    5 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c     |  116 ++++++---
 drivers/infiniband/hw/cxgb3/iwch_cm.h     |    3 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c     |    4 +-
 drivers/infiniband/hw/mlx4/main.c         |    3 +-
 drivers/infiniband/hw/nes/nes.h           |    4 +-
 drivers/infiniband/hw/nes/nes_cm.c        |   22 +-
 drivers/infiniband/hw/nes/nes_cm.h        |    1 -
 drivers/infiniband/hw/nes/nes_hw.c        |  389 ++++++++++++++---------------
 drivers/infiniband/hw/nes/nes_hw.h        |    2 +
 drivers/infiniband/hw/nes/nes_nic.c       |   52 +++--
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c |   25 ++-
 drivers/net/mlx4/port.c                   |    5 +-
 18 files changed, 442 insertions(+), 306 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-03-25  4:05 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-03-25  4:05 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This has the first batch of 2.6.30 changes -- I have one more patch
that I'll send after the net-next tree is merged (just to avoid merge
hassles due to dependencies).

Chien Tung (3):
      RDMA/nes: Update copyright to new legal entity and year
      RDMA/nes: Report correct vendor_id and vendor_part_id
      RDMA/nes: Fix tmp_addr compilation warning

Don Wood (3):
      RDMA/nes: Account for freed PBL after HW operation
      RDMA/nes: Inform hardware that asynchronous event has been handled
      RDMA/nes: Improve use of PBLs

Faisal Latif (2):
      RDMA/nes: Remove LLTX
      RDMA/nes: Handle MPA Reject message properly

Harvey Harrison (1):
      IB: Remove __constant_{endian} uses

Jack Morgenstein (3):
      IPoIB: In unicast_arp_send(), only free newly-created paths
      mlx4_core: Add device IDs for MT25458 10GigE devices
      IB/sa_query: Fix AH leak due to update_sm_ah() race

Moni Shoua (2):
      IB/mlx4: Fix dispatch of IB_EVENT_LID_CHANGE event
      IB/mthca: Fix dispatch of IB_EVENT_LID_CHANGE event

Or Gerlitz (1):
      IB/iser: Remove hard setting of path MTU

Ralph Campbell (3):
      IB/mad: Fix null pointer dereference in local_completions()
      IB/mad: initialize mad_agent_priv before putting on lists
      IB/mad: Fix ib_post_send_mad() returning 0 with no generate send comp

Ramachandra K (1):
      IB/mad: Fix RMPP header RRespTime manipulation

Roland Dreier (5):
      IB/ipath: Fix memory leak in init_shadow_tids() error path
      IB/ipath: Really run work in ipath_release_user_pages_on_close()
      IB: Remove sysfs files before unregistering device
      IB: Remove useless ibdev_is_alive() tests from sysfs code
      Merge branches 'cxgb3', 'endian', 'ipath', 'ipoib', 'iser', 'mad', 'misc', 'mlx4', 'mthca', 'nes' and 'sysfs' into for-next

Steve Wise (4):
      RDMA/cxgb3: sgl/pbl offset calculation needs 64 bits
      RDMA/cxgb3: Connection termination fixes
      RDMA/cxgb3: Remove modulo math from build_rdma_recv()
      RDMA/cxgb3: Enforce required firmware

Yevgeny Petrilin (3):
      mlx4_core: Don't perform SET_PORT command for Ethernet ports
      mlx4_core: Add link type autosensing
      IB/mlx4: Unregister IB device prior to CLOSE PORT command

 drivers/infiniband/core/cm.c                   |   15 +-
 drivers/infiniband/core/cm_msgs.h              |   22 +-
 drivers/infiniband/core/device.c               |    4 +-
 drivers/infiniband/core/mad.c                  |   40 +-
 drivers/infiniband/core/mad_rmpp.c             |    2 +-
 drivers/infiniband/core/sa_query.c             |    2 +
 drivers/infiniband/core/sysfs.c                |   19 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |   30 ++-
 drivers/infiniband/hw/cxgb3/cxio_hal.h         |    3 +
 drivers/infiniband/hw/cxgb3/cxio_wr.h          |    6 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |    3 +
 drivers/infiniband/hw/cxgb3/iwch_ev.c          |    5 -
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |   17 +-
 drivers/infiniband/hw/ehca/ehca_sqp.c          |    8 +-
 drivers/infiniband/hw/ipath/ipath_eeprom.c     |    4 +-
 drivers/infiniband/hw/ipath/ipath_init_chip.c  |    2 +-
 drivers/infiniband/hw/ipath/ipath_mad.c        |   95 ++--
 drivers/infiniband/hw/ipath/ipath_rc.c         |    2 +-
 drivers/infiniband/hw/ipath/ipath_sdma.c       |    4 +-
 drivers/infiniband/hw/ipath/ipath_uc.c         |    2 +-
 drivers/infiniband/hw/ipath/ipath_ud.c         |    4 +-
 drivers/infiniband/hw/ipath/ipath_user_pages.c |    8 +-
 drivers/infiniband/hw/ipath/ipath_user_sdma.c  |    6 +-
 drivers/infiniband/hw/ipath/ipath_verbs.c      |    2 +-
 drivers/infiniband/hw/ipath/ipath_verbs.h      |   10 +-
 drivers/infiniband/hw/mlx4/mad.c               |   27 +-
 drivers/infiniband/hw/mlx4/main.c              |    5 +-
 drivers/infiniband/hw/mlx4/qp.c                |   22 +-
 drivers/infiniband/hw/mthca/mthca_mad.c        |   25 +-
 drivers/infiniband/hw/nes/nes.c                |    2 +-
 drivers/infiniband/hw/nes/nes.h                |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c             |  586 ++++++++++++++++--------
 drivers/infiniband/hw/nes/nes_cm.h             |   12 +-
 drivers/infiniband/hw/nes/nes_context.h        |    2 +-
 drivers/infiniband/hw/nes/nes_hw.c             |   17 +-
 drivers/infiniband/hw/nes/nes_hw.h             |    5 +-
 drivers/infiniband/hw/nes/nes_nic.c            |  142 +++----
 drivers/infiniband/hw/nes/nes_user.h           |    2 +-
 drivers/infiniband/hw/nes/nes_utils.c          |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c          |  249 +++++++----
 drivers/infiniband/hw/nes/nes_verbs.h          |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    9 +-
 drivers/infiniband/ulp/iser/iser_verbs.c       |    7 -
 drivers/net/mlx4/Makefile                      |    2 +-
 drivers/net/mlx4/catas.c                       |   16 +-
 drivers/net/mlx4/eq.c                          |   16 +-
 drivers/net/mlx4/main.c                        |  106 ++++--
 drivers/net/mlx4/mlx4.h                        |   27 +-
 drivers/net/mlx4/port.c                        |   13 +-
 drivers/net/mlx4/sense.c                       |  156 +++++++
 include/linux/mlx4/cmd.h                       |    1 +
 include/linux/mlx4/device.h                    |    6 +-
 include/rdma/ib_cm.h                           |   12 +-
 include/rdma/ib_mad.h                          |    4 +-
 include/rdma/ib_smi.h                          |   34 +-
 55 files changed, 1190 insertions(+), 636 deletions(-)
 create mode 100644 drivers/net/mlx4/sense.c

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

* [GIT PULL] please pull infiniband.git
@ 2009-01-16 23:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-01-16 23:07 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Some fixes to go into 2.6.29-rc3.  Nothing too urgent so if this takes
a long time due to LCA, it's not a big deal.  The bulk of things are
for the ehca driver, to fix warning spew caused by the powerpc u64
transition from long to long long.

Andrew Morton (1):
      mlx4_core: Fix min() warning

Roland Dreier (4):
      IPoIB: Fix hang in napi_disable() if P_Key is never found
      IPoIB: Fix deadlock between ipoib_open() and child interface create
      IB/mlx4: Fix memory ordering problem when posting LSO sends
      Merge branches 'ehca', 'ipoib' and 'mlx4' into for-linus

Stephen Rothwell (2):
      IB/ehca: Fix printk format warnings from u64 type change
      IB/ehca: Use consistent types for ehca_plpar_hcall9()

Yossi Etigin (1):
      IPoIB: Do not print error messages for multicast join retries

 drivers/infiniband/hw/ehca/ehca_cq.c           |   16 ++--
 drivers/infiniband/hw/ehca/ehca_hca.c          |    2 +-
 drivers/infiniband/hw/ehca/ehca_irq.c          |   18 ++--
 drivers/infiniband/hw/ehca/ehca_main.c         |    6 +-
 drivers/infiniband/hw/ehca/ehca_mcast.c        |    4 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c         |  144 ++++++++++++------------
 drivers/infiniband/hw/ehca/ehca_qp.c           |   32 +++---
 drivers/infiniband/hw/ehca/ehca_reqs.c         |    2 +-
 drivers/infiniband/hw/ehca/ehca_sqp.c          |    2 +-
 drivers/infiniband/hw/ehca/ehca_tools.h        |    2 +-
 drivers/infiniband/hw/ehca/ehca_uverbs.c       |    2 +-
 drivers/infiniband/hw/ehca/hcp_if.c            |   56 +++++-----
 drivers/infiniband/hw/mlx4/qp.c                |   28 +++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   27 +++--
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c      |   11 ++-
 drivers/net/mlx4/profile.c                     |    6 +-
 17 files changed, 189 insertions(+), 171 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2009-01-13  3:40 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2009-01-13  3:40 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Some fixes for 2.6.29-rc2:

Harvey Harrison (1):
      RDMA/nes: Fix for NIPQUAD removal

Randy Dunlap (1):
      IB/iser: Add dependency on INFINIBAND_ADDR_TRANS

Roland Dreier (3):
      mlx4_core: Fix warning from min()
      IB/mlx4: Don't register IB device for adapters with no IB ports
      Merge branches 'ehca', 'ipoib', 'iser', 'mlx4' and 'nes' into for-next

Stephen Rothwell (1):
      IB/ehca: spin_lock_irqsave() takes an unsigned long

Yossi Etigin (2):
      IPoIB: Fix loss of connectivity after bonding failover on both sides
      IPoIB: Do not join broadcast group if interface is brought down

 drivers/infiniband/hw/ehca/ehca_main.c         |    2 +-
 drivers/infiniband/hw/mlx4/main.c              |   13 +++++--
 drivers/infiniband/hw/nes/nes_cm.c             |   12 +++++--
 drivers/infiniband/hw/nes/nes_utils.c          |    4 ++-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   38 ++++++++++++------------
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    3 ++
 drivers/infiniband/ulp/iser/Kconfig            |    2 +-
 drivers/net/mlx4/main.c                        |    4 +-
 8 files changed, 47 insertions(+), 31 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 3b77b67..c7b8a50 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -955,7 +955,7 @@ void ehca_poll_eqs(unsigned long data)
 			struct ehca_eq *eq = &shca->eq;
 			int max = 3;
 			volatile u64 q_ofs, q_ofs2;
-			u64 flags;
+			unsigned long flags;
 			spin_lock_irqsave(&eq->spinlock, flags);
 			q_ofs = eq->ipz_queue.current_q_offset;
 			spin_unlock_irqrestore(&eq->spinlock, flags);
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index dcefe1f..61588bd 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -543,14 +543,21 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
 {
 	static int mlx4_ib_version_printed;
 	struct mlx4_ib_dev *ibdev;
+	int num_ports = 0;
 	int i;
 
-
 	if (!mlx4_ib_version_printed) {
 		printk(KERN_INFO "%s", mlx4_ib_version);
 		++mlx4_ib_version_printed;
 	}
 
+	mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
+		num_ports++;
+
+	/* No point in registering a device with no ports... */
+	if (num_ports == 0)
+		return NULL;
+
 	ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev);
 	if (!ibdev) {
 		dev_err(&dev->pdev->dev, "Device struct alloc failed\n");
@@ -574,9 +581,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
 	ibdev->ib_dev.owner		= THIS_MODULE;
 	ibdev->ib_dev.node_type		= RDMA_NODE_IB_CA;
 	ibdev->ib_dev.local_dma_lkey	= dev->caps.reserved_lkey;
-	ibdev->num_ports = 0;
-	mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
-		ibdev->num_ports++;
+	ibdev->num_ports		= num_ports;
 	ibdev->ib_dev.phys_port_cnt     = ibdev->num_ports;
 	ibdev->ib_dev.num_comp_vectors	= dev->caps.num_comp_vectors;
 	ibdev->ib_dev.dma_device	= &dev->pdev->dev;
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
index a812db2..ca9ef3f 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -778,12 +778,13 @@ static struct nes_cm_node *find_node(struct nes_cm_core *cm_core,
 	unsigned long flags;
 	struct list_head *hte;
 	struct nes_cm_node *cm_node;
+	__be32 tmp_addr = cpu_to_be32(loc_addr);
 
 	/* get a handle on the hte */
 	hte = &cm_core->connected_nodes;
 
 	nes_debug(NES_DBG_CM, "Searching for an owner node: %pI4:%x from core %p->%p\n",
-		  &loc_addr, loc_port, cm_core, hte);
+		  &tmp_addr, loc_port, cm_core, hte);
 
 	/* walk list and find cm_node associated with this session ID */
 	spin_lock_irqsave(&cm_core->ht_lock, flags);
@@ -816,6 +817,7 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core,
 {
 	unsigned long flags;
 	struct nes_cm_listener *listen_node;
+	__be32 tmp_addr = cpu_to_be32(dst_addr);
 
 	/* walk list and find cm_node associated with this session ID */
 	spin_lock_irqsave(&cm_core->listen_list_lock, flags);
@@ -833,7 +835,7 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core,
 	spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
 
 	nes_debug(NES_DBG_CM, "Unable to find listener for %pI4:%x\n",
-		  &dst_addr, dst_port);
+		  &tmp_addr, dst_port);
 
 	/* no listener */
 	return NULL;
@@ -2059,6 +2061,7 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core,
 	struct tcphdr *tcph;
 	struct nes_cm_info nfo;
 	int skb_handled = 1;
+	__be32 tmp_daddr, tmp_saddr;
 
 	if (!skb)
 		return 0;
@@ -2074,8 +2077,11 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core,
 	nfo.rem_addr = ntohl(iph->saddr);
 	nfo.rem_port = ntohs(tcph->source);
 
+	tmp_daddr = cpu_to_be32(iph->daddr);
+	tmp_saddr = cpu_to_be32(iph->saddr);
+
 	nes_debug(NES_DBG_CM, "Received packet: dest=%pI4:0x%04X src=%pI4:0x%04X\n",
-		  &iph->daddr, tcph->dest, &iph->saddr, tcph->source);
+		  &tmp_daddr, tcph->dest, &tmp_saddr, tcph->source);
 
 	do {
 		cm_node = find_node(cm_core,
diff --git a/drivers/infiniband/hw/nes/nes_utils.c b/drivers/infiniband/hw/nes/nes_utils.c
index aa9b734..6f3bc1b 100644
--- a/drivers/infiniband/hw/nes/nes_utils.c
+++ b/drivers/infiniband/hw/nes/nes_utils.c
@@ -655,6 +655,7 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti
 	struct nes_adapter *nesadapter = nesdev->nesadapter;
 	int arp_index;
 	int err = 0;
+	__be32 tmp_addr;
 
 	for (arp_index = 0; (u32) arp_index < nesadapter->arp_table_size; arp_index++) {
 		if (nesadapter->arp_table[arp_index].ip_addr == ip_addr)
@@ -682,8 +683,9 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti
 
 	/* DELETE or RESOLVE */
 	if (arp_index == nesadapter->arp_table_size) {
+		tmp_addr = cpu_to_be32(ip_addr);
 		nes_debug(NES_DBG_NETDEV, "MAC for %pI4 not in ARP table - cannot %s\n",
-			  &ip_addr, action == NES_ARP_RESOLVE ? "resolve" : "delete");
+			  &tmp_addr, action == NES_ARP_RESOLVE ? "resolve" : "delete");
 		return -1;
 	}
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 19e06bc..dce0443 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -711,26 +711,26 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 		neigh = *to_ipoib_neigh(skb->dst->neighbour);
 
-		if (neigh->ah)
-			if (unlikely((memcmp(&neigh->dgid.raw,
-					    skb->dst->neighbour->ha + 4,
-					    sizeof(union ib_gid))) ||
-					 (neigh->dev != dev))) {
-				spin_lock_irqsave(&priv->lock, flags);
-				/*
-				 * It's safe to call ipoib_put_ah() inside
-				 * priv->lock here, because we know that
-				 * path->ah will always hold one more reference,
-				 * so ipoib_put_ah() will never do more than
-				 * decrement the ref count.
-				 */
+		if (unlikely((memcmp(&neigh->dgid.raw,
+				     skb->dst->neighbour->ha + 4,
+				     sizeof(union ib_gid))) ||
+			     (neigh->dev != dev))) {
+			spin_lock_irqsave(&priv->lock, flags);
+			/*
+			 * It's safe to call ipoib_put_ah() inside
+			 * priv->lock here, because we know that
+			 * path->ah will always hold one more reference,
+			 * so ipoib_put_ah() will never do more than
+			 * decrement the ref count.
+			 */
+			if (neigh->ah)
 				ipoib_put_ah(neigh->ah);
-				list_del(&neigh->list);
-				ipoib_neigh_free(dev, neigh);
-				spin_unlock_irqrestore(&priv->lock, flags);
-				ipoib_path_lookup(skb, dev);
-				return NETDEV_TX_OK;
-			}
+			list_del(&neigh->list);
+			ipoib_neigh_free(dev, neigh);
+			spin_unlock_irqrestore(&priv->lock, flags);
+			ipoib_path_lookup(skb, dev);
+			return NETDEV_TX_OK;
+		}
 
 		if (ipoib_cm_get(neigh)) {
 			if (ipoib_cm_up(neigh)) {
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index a2eb3b9..59d02e0 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -529,6 +529,9 @@ void ipoib_mcast_join_task(struct work_struct *work)
 	if (!priv->broadcast) {
 		struct ipoib_mcast *broadcast;
 
+		if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
+			return;
+
 		broadcast = ipoib_mcast_alloc(dev, 1);
 		if (!broadcast) {
 			ipoib_warn(priv, "failed to allocate broadcast group\n");
diff --git a/drivers/infiniband/ulp/iser/Kconfig b/drivers/infiniband/ulp/iser/Kconfig
index 77dedba..b411c51 100644
--- a/drivers/infiniband/ulp/iser/Kconfig
+++ b/drivers/infiniband/ulp/iser/Kconfig
@@ -1,6 +1,6 @@
 config INFINIBAND_ISER
 	tristate "iSCSI Extensions for RDMA (iSER)"
-	depends on SCSI && INET
+	depends on SCSI && INET && INFINIBAND_ADDR_TRANS
 	select SCSI_ISCSI_ATTRS
 	---help---
 	  Support for the iSCSI Extensions for RDMA (iSER) Protocol
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index 710c79e..6ef2490 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -912,8 +912,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
 	int i;
 
 	if (msi_x) {
-		nreq = min(dev->caps.num_eqs - dev->caps.reserved_eqs,
-			   num_possible_cpus() + 1);
+		nreq = min_t(int, dev->caps.num_eqs - dev->caps.reserved_eqs,
+			     num_possible_cpus() + 1);
 		entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL);
 		if (!entries)
 			goto no_msi;

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

* [GIT PULL] please pull infiniband.git
@ 2008-12-30 23:38 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-12-30 23:38 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

A build fix and an endianness bug fix before the new year:

Roland Dreier (3):
      RDMA/addr: Fix build breakage when IPv6 is disabled
      IB/mlx4: Fix reading SL field out of cqe->sl_vid
      Merge branches 'cma' and 'mlx4' into for-linus

 drivers/infiniband/Kconfig      |    1 +
 drivers/infiniband/core/addr.c  |   47 +++++++++++++++++++++++++++++++++-----
 drivers/infiniband/hw/mlx4/cq.c |    2 +-
 3 files changed, 42 insertions(+), 8 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-12-25 15:21 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-12-25 15:21 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first tranche of InfiniBand/RDMA changes for 2.6.29:

Aleksey Senin (2):
      RDMA/addr: Add support for translating IPv6 addresses
      RDMA/cma: Add IPv6 support

Chien Tung (2):
      RDMA/nes: Add loopback check to make_cm_node()
      RDMA/nes: Cleanup warnings

Dave Olson (4):
      IB/ipath: Don't count IB symbol and link errors unless link is UP
      IB/ipath: Only do 1X workaround on rev1 chips
      IB/ipath: Fix spi_pioindex value
      IB/ipath: Add locking for interrupt use of ipath_pd contexts vs free

David Disseldorp (1):
      IB/iser: Avoid recv buffer exhaustion caused by unexpected PDUs

Faisal Latif (7):
      RDMA/nes: Cleanup cqp_request list usage
      RDMA/nes: Lock down connected_nodes list while processing it
      RDMA/nes: Avoid race between MPA request and reset event to rdma_cm
      RDMA/nes: Forward packets for a new connection with stale APBVT entry
      RDMA/nes: Fix TCP compliance test failures
      RDMA/nes: Check cqp_avail_reqs is empty after locking the list
      RDMA/nes: Remove tx_free_list

Jack Morgenstein (1):
      IB/mlx4: Set ownership bit correctly when copying CQEs during CQ resize

Joachim Fenkes (1):
      IB/ehca: Fix locking for shca_list_lock

Julia Lawall (1):
      IB/ehca: Remove redundant test of vpage

Michael Ellerman (1):
      IB/ipath: Fix pointer-to-pointer thinko in ipath_fs.c

Ralph Campbell (3):
      IB/ipath: Improve UD loopback performance by allocating temp array only once
      IB/ipath: Fix PSN of send WQEs after an RDMA read resend
      IB/ipath: Check return value of dma_map_single()

Roland Dreier (2):
      mlx4_core: Delete incorrect comment
      Merge branches 'cma', 'ehca', 'ipath', 'iser', 'mlx4' and 'nes' into for-next

Stefan Roscher (1):
      IB/ehca: Replace modulus operations in flush error completion path

Yevgeny Petrilin (1):
      mlx4_core: Add support for multiple completion event vectors

 drivers/infiniband/core/addr.c                |  196 +++++++++++++----
 drivers/infiniband/core/cma.c                 |   86 ++++++---
 drivers/infiniband/hw/ehca/ehca_classes.h     |    7 +
 drivers/infiniband/hw/ehca/ehca_eq.c          |    2 +-
 drivers/infiniband/hw/ehca/ehca_main.c        |   17 +-
 drivers/infiniband/hw/ehca/ehca_qp.c          |   12 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c        |   13 +-
 drivers/infiniband/hw/ipath/ipath_driver.c    |   49 +++--
 drivers/infiniband/hw/ipath/ipath_file_ops.c  |   30 ++--
 drivers/infiniband/hw/ipath/ipath_fs.c        |    2 +-
 drivers/infiniband/hw/ipath/ipath_iba6120.c   |   61 ++++++
 drivers/infiniband/hw/ipath/ipath_iba7220.c   |   83 +++++++-
 drivers/infiniband/hw/ipath/ipath_init_chip.c |    1 +
 drivers/infiniband/hw/ipath/ipath_kernel.h    |   15 ++
 drivers/infiniband/hw/ipath/ipath_keys.c      |    2 +
 drivers/infiniband/hw/ipath/ipath_mad.c       |    2 +
 drivers/infiniband/hw/ipath/ipath_qp.c        |   32 ++-
 drivers/infiniband/hw/ipath/ipath_rc.c        |    5 +-
 drivers/infiniband/hw/ipath/ipath_sdma.c      |   21 ++-
 drivers/infiniband/hw/ipath/ipath_stats.c     |    8 +
 drivers/infiniband/hw/ipath/ipath_ud.c        |   19 +--
 drivers/infiniband/hw/ipath/ipath_verbs.c     |    3 +-
 drivers/infiniband/hw/ipath/ipath_verbs.h     |    1 +
 drivers/infiniband/hw/mlx4/cq.c               |   12 +-
 drivers/infiniband/hw/mlx4/main.c             |    2 +-
 drivers/infiniband/hw/nes/nes.h               |   18 +-
 drivers/infiniband/hw/nes/nes_cm.c            |  279 +++++++++++++------------
 drivers/infiniband/hw/nes/nes_cm.h            |   14 +-
 drivers/infiniband/hw/nes/nes_hw.c            |   42 ++--
 drivers/infiniband/hw/nes/nes_utils.c         |    9 +-
 drivers/infiniband/hw/nes/nes_verbs.c         |   45 +---
 drivers/infiniband/ulp/iser/iscsi_iser.h      |    3 +
 drivers/infiniband/ulp/iser/iser_initiator.c  |  132 ++++++++----
 drivers/infiniband/ulp/iser/iser_verbs.c      |    1 +
 drivers/net/mlx4/cq.c                         |   11 +-
 drivers/net/mlx4/en_cq.c                      |    9 +-
 drivers/net/mlx4/en_main.c                    |    4 +-
 drivers/net/mlx4/eq.c                         |  121 ++++++++---
 drivers/net/mlx4/main.c                       |   53 ++++--
 drivers/net/mlx4/mlx4.h                       |   14 +-
 drivers/net/mlx4/profile.c                    |    4 +-
 include/linux/mlx4/device.h                   |    4 +-
 42 files changed, 965 insertions(+), 479 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-12-01 18:16 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-12-01 18:16 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get two fixes to the ehca driver for problems in patches
added in the 2.6.28 cycle, and two fixes for mlx4, one for a
regression introduced in the 2.6.28 cycle, and one for a resource leak
that is serious enough and has a simple enough fix to target -stable.

Jack Morgenstein (2):
      mlx4_core: Save/restore default port IB capability mask
      IB/mlx4: Fix MTT leakage in resize CQ

Joachim Fenkes (1):
      IB/ehca: Change misleading error message on memory hotplug

Roland Dreier (1):
      Merge branches 'ehca' and 'mlx4' into for-linus

Stefan Roscher (1):
      IB/ehca: Fix problem with generated flush work completions

 drivers/infiniband/hw/ehca/ehca_classes.h |    4 ++-
 drivers/infiniband/hw/ehca/ehca_main.c    |    3 +-
 drivers/infiniband/hw/ehca/ehca_qp.c      |   26 +++++++++++---
 drivers/infiniband/hw/ehca/ehca_reqs.c    |   51 +++++++++++++++++------------
 drivers/infiniband/hw/mlx4/cq.c           |    5 +++
 drivers/net/mlx4/main.c                   |    8 ++++
 drivers/net/mlx4/mlx4.h                   |    1 +
 drivers/net/mlx4/port.c                   |   39 +++++++++++++++++++++-
 include/linux/mlx4/device.h               |    1 +
 9 files changed, 107 insertions(+), 31 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 4df887a..7fc35cf 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -163,7 +163,8 @@ struct ehca_mod_qp_parm {
 /* struct for tracking if cqes have been reported to the application */
 struct ehca_qmap_entry {
 	u16 app_wr_id;
-	u16 reported;
+	u8 reported;
+	u8 cqe_req;
 };
 
 struct ehca_queue_map {
@@ -171,6 +172,7 @@ struct ehca_queue_map {
 	unsigned int entries;
 	unsigned int tail;
 	unsigned int left_to_poll;
+	unsigned int next_wqe_idx;   /* Idx to first wqe to be flushed */
 };
 
 struct ehca_qp {
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;
 		}
 	}
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index 9e05ee2..cadbf0c 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -435,9 +435,13 @@ static void reset_queue_map(struct ehca_queue_map *qmap)
 {
 	int i;
 
-	qmap->tail = 0;
-	for (i = 0; i < qmap->entries; i++)
+	qmap->tail = qmap->entries - 1;
+	qmap->left_to_poll = 0;
+	qmap->next_wqe_idx = 0;
+	for (i = 0; i < qmap->entries; i++) {
 		qmap->map[i].reported = 1;
+		qmap->map[i].cqe_req = 0;
+	}
 }
 
 /*
@@ -1121,6 +1125,7 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue,
 	void *wqe_v;
 	u64 q_ofs;
 	u32 wqe_idx;
+	unsigned int tail_idx;
 
 	/* convert real to abs address */
 	wqe_p = wqe_p & (~(1UL << 63));
@@ -1133,12 +1138,17 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue,
 		return -EFAULT;
 	}
 
+	tail_idx = (qmap->tail + 1) % qmap->entries;
 	wqe_idx = q_ofs / ipz_queue->qe_size;
-	if (wqe_idx < qmap->tail)
-		qmap->left_to_poll = (qmap->entries - qmap->tail) + wqe_idx;
-	else
-		qmap->left_to_poll = wqe_idx - qmap->tail;
 
+	/* check all processed wqes, whether a cqe is requested or not */
+	while (tail_idx != wqe_idx) {
+		if (qmap->map[tail_idx].cqe_req)
+			qmap->left_to_poll++;
+		tail_idx = (tail_idx + 1) % qmap->entries;
+	}
+	/* save index in queue, where we have to start flushing */
+	qmap->next_wqe_idx = wqe_idx;
 	return 0;
 }
 
@@ -1185,10 +1195,14 @@ static int check_for_left_cqes(struct ehca_qp *my_qp, struct ehca_shca *shca)
 	} else {
 		spin_lock_irqsave(&my_qp->send_cq->spinlock, flags);
 		my_qp->sq_map.left_to_poll = 0;
+		my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) %
+						my_qp->sq_map.entries;
 		spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags);
 
 		spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags);
 		my_qp->rq_map.left_to_poll = 0;
+		my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) %
+						my_qp->rq_map.entries;
 		spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags);
 	}
 
diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
index 6492807..00a648f 100644
--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
+++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
@@ -179,6 +179,7 @@ static inline int ehca_write_swqe(struct ehca_qp *qp,
 
 	qmap_entry->app_wr_id = get_app_wr_id(send_wr->wr_id);
 	qmap_entry->reported = 0;
+	qmap_entry->cqe_req = 0;
 
 	switch (send_wr->opcode) {
 	case IB_WR_SEND:
@@ -203,8 +204,10 @@ static inline int ehca_write_swqe(struct ehca_qp *qp,
 
 	if ((send_wr->send_flags & IB_SEND_SIGNALED ||
 	    qp->init_attr.sq_sig_type == IB_SIGNAL_ALL_WR)
-	    && !hidden)
+	    && !hidden) {
 		wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM;
+		qmap_entry->cqe_req = 1;
+	}
 
 	if (send_wr->opcode == IB_WR_SEND_WITH_IMM ||
 	    send_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) {
@@ -569,6 +572,7 @@ static int internal_post_recv(struct ehca_qp *my_qp,
 		qmap_entry = &my_qp->rq_map.map[rq_map_idx];
 		qmap_entry->app_wr_id = get_app_wr_id(cur_recv_wr->wr_id);
 		qmap_entry->reported = 0;
+		qmap_entry->cqe_req = 1;
 
 		wqe_cnt++;
 	} /* eof for cur_recv_wr */
@@ -706,27 +710,34 @@ repoll:
 		goto repoll;
 	wc->qp = &my_qp->ib_qp;
 
+	qmap_tail_idx = get_app_wr_id(cqe->work_request_id);
+	if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT))
+		/* We got a send completion. */
+		qmap = &my_qp->sq_map;
+	else
+		/* We got a receive completion. */
+		qmap = &my_qp->rq_map;
+
+	/* advance the tail pointer */
+	qmap->tail = qmap_tail_idx;
+
 	if (is_error) {
 		/*
 		 * set left_to_poll to 0 because in error state, we will not
 		 * get any additional CQEs
 		 */
-		ehca_add_to_err_list(my_qp, 1);
+		my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) %
+						my_qp->sq_map.entries;
 		my_qp->sq_map.left_to_poll = 0;
+		ehca_add_to_err_list(my_qp, 1);
 
+		my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) %
+						my_qp->rq_map.entries;
+		my_qp->rq_map.left_to_poll = 0;
 		if (HAS_RQ(my_qp))
 			ehca_add_to_err_list(my_qp, 0);
-		my_qp->rq_map.left_to_poll = 0;
 	}
 
-	qmap_tail_idx = get_app_wr_id(cqe->work_request_id);
-	if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT))
-		/* We got a send completion. */
-		qmap = &my_qp->sq_map;
-	else
-		/* We got a receive completion. */
-		qmap = &my_qp->rq_map;
-
 	qmap_entry = &qmap->map[qmap_tail_idx];
 	if (qmap_entry->reported) {
 		ehca_warn(cq->device, "Double cqe on qp_num=%#x",
@@ -738,10 +749,6 @@ repoll:
 	wc->wr_id = replace_wr_id(cqe->work_request_id, qmap_entry->app_wr_id);
 	qmap_entry->reported = 1;
 
-	/* this is a proper completion, we need to advance the tail pointer */
-	if (++qmap->tail == qmap->entries)
-		qmap->tail = 0;
-
 	/* if left_to_poll is decremented to 0, add the QP to the error list */
 	if (qmap->left_to_poll > 0) {
 		qmap->left_to_poll--;
@@ -805,13 +812,14 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq,
 	else
 		qmap = &my_qp->rq_map;
 
-	qmap_entry = &qmap->map[qmap->tail];
+	qmap_entry = &qmap->map[qmap->next_wqe_idx];
 
 	while ((nr < num_entries) && (qmap_entry->reported == 0)) {
 		/* generate flush CQE */
+
 		memset(wc, 0, sizeof(*wc));
 
-		offset = qmap->tail * ipz_queue->qe_size;
+		offset = qmap->next_wqe_idx * ipz_queue->qe_size;
 		wqe = (struct ehca_wqe *)ipz_qeit_calc(ipz_queue, offset);
 		if (!wqe) {
 			ehca_err(cq->device, "Invalid wqe offset=%#lx on "
@@ -850,11 +858,12 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq,
 
 		wc->qp = &my_qp->ib_qp;
 
-		/* mark as reported and advance tail pointer */
+		/* mark as reported and advance next_wqe pointer */
 		qmap_entry->reported = 1;
-		if (++qmap->tail == qmap->entries)
-			qmap->tail = 0;
-		qmap_entry = &qmap->map[qmap->tail];
+		qmap->next_wqe_idx++;
+		if (qmap->next_wqe_idx == qmap->entries)
+			qmap->next_wqe_idx = 0;
+		qmap_entry = &qmap->map[qmap->next_wqe_idx];
 
 		wc++; nr++;
 	}
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index d0866a3..1830849 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -343,6 +343,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
 {
 	struct mlx4_ib_dev *dev = to_mdev(ibcq->device);
 	struct mlx4_ib_cq *cq = to_mcq(ibcq);
+	struct mlx4_mtt mtt;
 	int outst_cqe;
 	int err;
 
@@ -376,10 +377,13 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
 			goto out;
 	}
 
+	mtt = cq->buf.mtt;
+
 	err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt);
 	if (err)
 		goto err_buf;
 
+	mlx4_mtt_cleanup(dev->dev, &mtt);
 	if (ibcq->uobject) {
 		cq->buf      = cq->resize_buf->buf;
 		cq->ibcq.cqe = cq->resize_buf->cqe;
@@ -406,6 +410,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
 	goto out;
 
 err_buf:
+	mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt);
 	if (!ibcq->uobject)
 		mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf,
 				    cq->resize_buf->cqe);
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index 468921b..90a0281 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -753,6 +753,7 @@ static int mlx4_setup_hca(struct mlx4_dev *dev)
 	struct mlx4_priv *priv = mlx4_priv(dev);
 	int err;
 	int port;
+	__be32 ib_port_default_caps;
 
 	err = mlx4_init_uar_table(dev);
 	if (err) {
@@ -852,6 +853,13 @@ static int mlx4_setup_hca(struct mlx4_dev *dev)
 	}
 
 	for (port = 1; port <= dev->caps.num_ports; port++) {
+		ib_port_default_caps = 0;
+		err = mlx4_get_port_ib_caps(dev, port, &ib_port_default_caps);
+		if (err)
+			mlx4_warn(dev, "failed to get port %d default "
+				  "ib capabilities (%d). Continuing with "
+				  "caps = 0\n", port, err);
+		dev->caps.ib_port_def_cap[port] = ib_port_default_caps;
 		err = mlx4_SET_PORT(dev, port);
 		if (err) {
 			mlx4_err(dev, "Failed to set port %d, aborting\n",
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index 56a2e21..34c909d 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -385,5 +385,6 @@ void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table);
 void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table);
 
 int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port);
+int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps);
 
 #endif /* MLX4_H */
diff --git a/drivers/net/mlx4/port.c b/drivers/net/mlx4/port.c
index e2fdab4..0a057e5 100644
--- a/drivers/net/mlx4/port.c
+++ b/drivers/net/mlx4/port.c
@@ -258,6 +258,42 @@ out:
 }
 EXPORT_SYMBOL_GPL(mlx4_unregister_vlan);
 
+int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps)
+{
+	struct mlx4_cmd_mailbox *inmailbox, *outmailbox;
+	u8 *inbuf, *outbuf;
+	int err;
+
+	inmailbox = mlx4_alloc_cmd_mailbox(dev);
+	if (IS_ERR(inmailbox))
+		return PTR_ERR(inmailbox);
+
+	outmailbox = mlx4_alloc_cmd_mailbox(dev);
+	if (IS_ERR(outmailbox)) {
+		mlx4_free_cmd_mailbox(dev, inmailbox);
+		return PTR_ERR(outmailbox);
+	}
+
+	inbuf = inmailbox->buf;
+	outbuf = outmailbox->buf;
+	memset(inbuf, 0, 256);
+	memset(outbuf, 0, 256);
+	inbuf[0] = 1;
+	inbuf[1] = 1;
+	inbuf[2] = 1;
+	inbuf[3] = 1;
+	*(__be16 *) (&inbuf[16]) = cpu_to_be16(0x0015);
+	*(__be32 *) (&inbuf[20]) = cpu_to_be32(port);
+
+	err = mlx4_cmd_box(dev, inmailbox->dma, outmailbox->dma, port, 3,
+			   MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C);
+	if (!err)
+		*caps = *(__be32 *) (outbuf + 84);
+	mlx4_free_cmd_mailbox(dev, inmailbox);
+	mlx4_free_cmd_mailbox(dev, outmailbox);
+	return err;
+}
+
 int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port)
 {
 	struct mlx4_cmd_mailbox *mailbox;
@@ -273,7 +309,8 @@ int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port)
 		((u8 *) mailbox->buf)[3] = 6;
 		((__be16 *) mailbox->buf)[4] = cpu_to_be16(1 << 15);
 		((__be16 *) mailbox->buf)[6] = cpu_to_be16(1 << 15);
-	}
+	} else
+		((__be32 *) mailbox->buf)[1] = dev->caps.ib_port_def_cap[port];
 	err = mlx4_cmd(dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT,
 		       MLX4_CMD_TIME_CLASS_B);
 
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index bd9977b..371086f 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -179,6 +179,7 @@ struct mlx4_caps {
 	int			num_ports;
 	int			vl_cap[MLX4_MAX_PORTS + 1];
 	int			ib_mtu_cap[MLX4_MAX_PORTS + 1];
+	__be32			ib_port_def_cap[MLX4_MAX_PORTS + 1];
 	u64			def_mac[MLX4_MAX_PORTS + 1];
 	int			eth_mtu_cap[MLX4_MAX_PORTS + 1];
 	int			gid_table_len[MLX4_MAX_PORTS + 1];

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

* [GIT PULL] please pull infiniband.git
@ 2008-11-04 21:37 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-11-04 21:37 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the following changes; mostly low-level hardware changes
plus a couple of small patches that fix IPoIB crashes.

Chien Tung (2):
      RDMA/nes: Correct handling of PBL resources
      RDMA/nes: Mitigate compatibility issue regarding PCIe write credits

Ilpo Järvinen (1):
      RDMA/nes: Reindent mis-indented spinlocks

Ralph Campbell (1):
      IB/ipath: Fix RDMA write with immediate copy of last packet

Roland Dreier (3):
      RDMA/cxgb3: Fix too-big reserved field zeroing in iwch_post_zb_read()
      mlx4_core: Fix unused variable warning
      Merge branches 'cxgb3', 'ehca', 'ipath', 'ipoib', 'mlx4' and 'nes' into for-next

Stefan Roscher (1):
      IB/ehca: Remove reference to special QP in case of port activation failure

Vadim Makhervaks (1):
      RDMA/nes: Fix CQ allocation scheme for multicast receive queue apps

Yossi Etigin (3):
      IPoIB: Don't enable napi when it's already enabled
      IPoIB: Fix hang in ipoib_flush_paths()
      IPoIB: Fix crash in path_rec_completion()

 drivers/infiniband/hw/cxgb3/iwch_qp.c     |    1 -
 drivers/infiniband/hw/ehca/ehca_irq.c     |    7 ++-
 drivers/infiniband/hw/ehca/ehca_qp.c      |    5 ++
 drivers/infiniband/hw/ipath/ipath_ruc.c   |   10 ++--
 drivers/infiniband/hw/nes/nes.c           |   16 +++++++
 drivers/infiniband/hw/nes/nes_hw.h        |    1 +
 drivers/infiniband/hw/nes/nes_verbs.c     |   64 +++++++++++++++++++---------
 drivers/infiniband/ulp/ipoib/ipoib_main.c |    6 ++-
 drivers/net/mlx4/mlx4.h                   |    9 +---
 9 files changed, 82 insertions(+), 37 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 3e4585c..19661b2 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -745,7 +745,6 @@ int iwch_post_zb_read(struct iwch_qp *qhp)
 	wqe->read.rdmaop = T3_READ_REQ;
 	wqe->read.reserved[0] = 0;
 	wqe->read.reserved[1] = 0;
-	wqe->read.reserved[2] = 0;
 	wqe->read.rem_stag = cpu_to_be32(1);
 	wqe->read.rem_to = cpu_to_be64(1);
 	wqe->read.local_stag = cpu_to_be32(1);
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index cb55be0..9e43459 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -370,6 +370,10 @@ static void parse_ec(struct ehca_shca *shca, u64 eqe)
 	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);
@@ -387,8 +391,7 @@ static void parse_ec(struct ehca_shca *shca, u64 eqe)
 			sport->port_state = IB_PORT_ACTIVE;
 			dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE,
 					    "is active");
-			ehca_query_sma_attr(shca, port,
-					    &sport->saved_attr);
+			ehca_query_sma_attr(shca, port, &sport->saved_attr);
 		} else {
 			sport->port_state = IB_PORT_DOWN;
 			dispatch_port_event(shca, port, IB_EVENT_PORT_ERR,
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index 4d54b9f..9e05ee2 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -860,6 +860,11 @@ static struct ehca_qp *internal_create_qp(
 	if (qp_type == IB_QPT_GSI) {
 		h_ret = ehca_define_sqp(shca, my_qp, init_attr);
 		if (h_ret != H_SUCCESS) {
+			kfree(my_qp->mod_qp_parm);
+			my_qp->mod_qp_parm = NULL;
+			/* the QP pointer is no longer valid */
+			shca->sport[init_attr->port_num - 1].ibqp_sqp[qp_type] =
+				NULL;
 			ret = ehca2ib_return_code(h_ret);
 			goto create_qp_exit6;
 		}
diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c
index fc0f6d9..2296832 100644
--- a/drivers/infiniband/hw/ipath/ipath_ruc.c
+++ b/drivers/infiniband/hw/ipath/ipath_ruc.c
@@ -156,7 +156,7 @@ bail:
 /**
  * ipath_get_rwqe - copy the next RWQE into the QP's RWQE
  * @qp: the QP
- * @wr_id_only: update wr_id only, not SGEs
+ * @wr_id_only: update qp->r_wr_id only, not qp->r_sge
  *
  * Return 0 if no RWQE is available, otherwise return 1.
  *
@@ -173,8 +173,6 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only)
 	u32 tail;
 	int ret;
 
-	qp->r_sge.sg_list = qp->r_sg_list;
-
 	if (qp->ibqp.srq) {
 		srq = to_isrq(qp->ibqp.srq);
 		handler = srq->ibsrq.event_handler;
@@ -206,8 +204,10 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only)
 		wqe = get_rwqe_ptr(rq, tail);
 		if (++tail >= rq->size)
 			tail = 0;
-	} while (!wr_id_only && !ipath_init_sge(qp, wqe, &qp->r_len,
-						&qp->r_sge));
+		if (wr_id_only)
+			break;
+		qp->r_sge.sg_list = qp->r_sg_list;
+	} while (!ipath_init_sge(qp, wqe, &qp->r_len, &qp->r_sge));
 	qp->r_wr_id = wqe->wr_id;
 	wq->tail = tail;
 
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c
index a2b04d6..aa1dc41 100644
--- a/drivers/infiniband/hw/nes/nes.c
+++ b/drivers/infiniband/hw/nes/nes.c
@@ -95,6 +95,10 @@ unsigned int wqm_quanta = 0x10000;
 module_param(wqm_quanta, int, 0644);
 MODULE_PARM_DESC(wqm_quanta, "WQM quanta");
 
+static unsigned int limit_maxrdreqsz;
+module_param(limit_maxrdreqsz, bool, 0644);
+MODULE_PARM_DESC(limit_maxrdreqsz, "Limit max read request size to 256 Bytes");
+
 LIST_HEAD(nes_adapter_list);
 static LIST_HEAD(nes_dev_list);
 
@@ -588,6 +592,18 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
 						nesdev->nesadapter->port_count;
 	}
 
+	if ((limit_maxrdreqsz ||
+	     ((nesdev->nesadapter->phy_type[0] == NES_PHY_TYPE_GLADIUS) &&
+	      (hw_rev == NE020_REV1))) &&
+	    (pcie_get_readrq(pcidev) > 256)) {
+		if (pcie_set_readrq(pcidev, 256))
+			printk(KERN_ERR PFX "Unable to set max read request"
+				" to 256 bytes\n");
+		else
+			nes_debug(NES_DBG_INIT, "Max read request size set"
+				" to 256 bytes\n");
+	}
+
 	tasklet_init(&nesdev->dpc_tasklet, nes_dpc, (unsigned long)nesdev);
 
 	/* bring up the Control QP */
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h
index 610b9d8..bc0b4de 100644
--- a/drivers/infiniband/hw/nes/nes_hw.h
+++ b/drivers/infiniband/hw/nes/nes_hw.h
@@ -40,6 +40,7 @@
 #define NES_PHY_TYPE_ARGUS     4
 #define NES_PHY_TYPE_PUMA_1G   5
 #define NES_PHY_TYPE_PUMA_10G  6
+#define NES_PHY_TYPE_GLADIUS   7
 
 #define NES_MULTICAST_PF_MAX 8
 
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index 932e56f..d36c9a0 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -220,14 +220,14 @@ static int nes_bind_mw(struct ib_qp *ibqp, struct ib_mw *ibmw,
 	if (nesqp->ibqp_state > IB_QPS_RTS)
 		return -EINVAL;
 
-		spin_lock_irqsave(&nesqp->lock, flags);
+	spin_lock_irqsave(&nesqp->lock, flags);
 
 	head = nesqp->hwqp.sq_head;
 	qsize = nesqp->hwqp.sq_tail;
 
 	/* Check for SQ overflow */
 	if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) {
-			spin_unlock_irqrestore(&nesqp->lock, flags);
+		spin_unlock_irqrestore(&nesqp->lock, flags);
 		return -EINVAL;
 	}
 
@@ -269,7 +269,7 @@ static int nes_bind_mw(struct ib_qp *ibqp, struct ib_mw *ibmw,
 	nes_write32(nesdev->regs+NES_WQE_ALLOC,
 			(1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);
 
-		spin_unlock_irqrestore(&nesqp->lock, flags);
+	spin_unlock_irqrestore(&nesqp->lock, flags);
 
 	return 0;
 }
@@ -349,7 +349,7 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
 			if (nesfmr->nesmr.pbls_used > nesadapter->free_4kpbl) {
 				spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 				ret = -ENOMEM;
-				goto failed_vpbl_alloc;
+				goto failed_vpbl_avail;
 			} else {
 				nesadapter->free_4kpbl -= nesfmr->nesmr.pbls_used;
 			}
@@ -357,7 +357,7 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
 			if (nesfmr->nesmr.pbls_used > nesadapter->free_256pbl) {
 				spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 				ret = -ENOMEM;
-				goto failed_vpbl_alloc;
+				goto failed_vpbl_avail;
 			} else {
 				nesadapter->free_256pbl -= nesfmr->nesmr.pbls_used;
 			}
@@ -391,14 +391,14 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
 			goto failed_vpbl_alloc;
 		}
 
-		nesfmr->root_vpbl.leaf_vpbl = kzalloc(sizeof(*nesfmr->root_vpbl.leaf_vpbl)*1024, GFP_KERNEL);
+		nesfmr->leaf_pbl_cnt = nesfmr->nesmr.pbls_used-1;
+		nesfmr->root_vpbl.leaf_vpbl = kzalloc(sizeof(*nesfmr->root_vpbl.leaf_vpbl)*1024, GFP_ATOMIC);
 		if (!nesfmr->root_vpbl.leaf_vpbl) {
 			spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 			ret = -ENOMEM;
 			goto failed_leaf_vpbl_alloc;
 		}
 
-		nesfmr->leaf_pbl_cnt = nesfmr->nesmr.pbls_used-1;
 		nes_debug(NES_DBG_MR, "two level pbl, root_vpbl.pbl_vbase=%p"
 				" leaf_pbl_cnt=%d root_vpbl.leaf_vpbl=%p\n",
 				nesfmr->root_vpbl.pbl_vbase, nesfmr->leaf_pbl_cnt, nesfmr->root_vpbl.leaf_vpbl);
@@ -519,6 +519,16 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
 				nesfmr->root_vpbl.pbl_pbase);
 
 	failed_vpbl_alloc:
+	if (nesfmr->nesmr.pbls_used != 0) {
+		spin_lock_irqsave(&nesadapter->pbl_lock, flags);
+		if (nesfmr->nesmr.pbl_4k)
+			nesadapter->free_4kpbl += nesfmr->nesmr.pbls_used;
+		else
+			nesadapter->free_256pbl += nesfmr->nesmr.pbls_used;
+		spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
+	}
+
+failed_vpbl_avail:
 	kfree(nesfmr);
 
 	failed_fmr_alloc:
@@ -534,18 +544,14 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
  */
 static int nes_dealloc_fmr(struct ib_fmr *ibfmr)
 {
+	unsigned long flags;
 	struct nes_mr *nesmr = to_nesmr_from_ibfmr(ibfmr);
 	struct nes_fmr *nesfmr = to_nesfmr(nesmr);
 	struct nes_vnic *nesvnic = to_nesvnic(ibfmr->device);
 	struct nes_device *nesdev = nesvnic->nesdev;
-	struct nes_mr temp_nesmr = *nesmr;
+	struct nes_adapter *nesadapter = nesdev->nesadapter;
 	int i = 0;
 
-	temp_nesmr.ibmw.device = ibfmr->device;
-	temp_nesmr.ibmw.pd = ibfmr->pd;
-	temp_nesmr.ibmw.rkey = ibfmr->rkey;
-	temp_nesmr.ibmw.uobject = NULL;
-
 	/* free the resources */
 	if (nesfmr->leaf_pbl_cnt == 0) {
 		/* single PBL case */
@@ -561,8 +567,24 @@ static int nes_dealloc_fmr(struct ib_fmr *ibfmr)
 		pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase,
 				nesfmr->root_vpbl.pbl_pbase);
 	}
+	nesmr->ibmw.device = ibfmr->device;
+	nesmr->ibmw.pd = ibfmr->pd;
+	nesmr->ibmw.rkey = ibfmr->rkey;
+	nesmr->ibmw.uobject = NULL;
 
-	return nes_dealloc_mw(&temp_nesmr.ibmw);
+	if (nesfmr->nesmr.pbls_used != 0) {
+		spin_lock_irqsave(&nesadapter->pbl_lock, flags);
+		if (nesfmr->nesmr.pbl_4k) {
+			nesadapter->free_4kpbl += nesfmr->nesmr.pbls_used;
+			WARN_ON(nesadapter->free_4kpbl > nesadapter->max_4kpbl);
+		} else {
+			nesadapter->free_256pbl += nesfmr->nesmr.pbls_used;
+			WARN_ON(nesadapter->free_256pbl > nesadapter->max_256pbl);
+		}
+		spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
+	}
+
+	return nes_dealloc_mw(&nesmr->ibmw);
 }
 
 
@@ -1595,7 +1617,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
 		nes_ucontext->mcrqf = req.mcrqf;
 		if (nes_ucontext->mcrqf) {
 			if (nes_ucontext->mcrqf & 0x80000000)
-				nescq->hw_cq.cq_number = nesvnic->nic.qp_id + 12 + (nes_ucontext->mcrqf & 0xf) - 1;
+				nescq->hw_cq.cq_number = nesvnic->nic.qp_id + 28 + 2 * ((nes_ucontext->mcrqf & 0xf) - 1);
 			else if (nes_ucontext->mcrqf & 0x40000000)
 				nescq->hw_cq.cq_number = nes_ucontext->mcrqf & 0xffff;
 			else
@@ -3212,7 +3234,7 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
 	if (nesqp->ibqp_state > IB_QPS_RTS)
 		return -EINVAL;
 
-		spin_lock_irqsave(&nesqp->lock, flags);
+	spin_lock_irqsave(&nesqp->lock, flags);
 
 	head = nesqp->hwqp.sq_head;
 
@@ -3337,7 +3359,7 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
 				(counter << 24) | 0x00800000 | nesqp->hwqp.qp_id);
 	}
 
-		spin_unlock_irqrestore(&nesqp->lock, flags);
+	spin_unlock_irqrestore(&nesqp->lock, flags);
 
 	if (err)
 		*bad_wr = ib_wr;
@@ -3368,7 +3390,7 @@ static int nes_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
 	if (nesqp->ibqp_state > IB_QPS_RTS)
 		return -EINVAL;
 
-		spin_lock_irqsave(&nesqp->lock, flags);
+	spin_lock_irqsave(&nesqp->lock, flags);
 
 	head = nesqp->hwqp.rq_head;
 
@@ -3421,7 +3443,7 @@ static int nes_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
 		nes_write32(nesdev->regs+NES_WQE_ALLOC, (counter<<24) | nesqp->hwqp.qp_id);
 	}
 
-		spin_unlock_irqrestore(&nesqp->lock, flags);
+	spin_unlock_irqrestore(&nesqp->lock, flags);
 
 	if (err)
 		*bad_wr = ib_wr;
@@ -3453,7 +3475,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
 
 	nes_debug(NES_DBG_CQ, "\n");
 
-		spin_lock_irqsave(&nescq->lock, flags);
+	spin_lock_irqsave(&nescq->lock, flags);
 
 	head = nescq->hw_cq.cq_head;
 	cq_size = nescq->hw_cq.cq_size;
@@ -3562,7 +3584,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
 	nes_debug(NES_DBG_CQ, "Reporting %u completions for CQ%u.\n",
 			cqe_count, nescq->hw_cq.cq_number);
 
-		spin_unlock_irqrestore(&nescq->lock, flags);
+	spin_unlock_irqrestore(&nescq->lock, flags);
 
 	return cqe_count;
 }
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index fddded7..85257f6 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -106,12 +106,13 @@ int ipoib_open(struct net_device *dev)
 
 	ipoib_dbg(priv, "bringing up interface\n");
 
-	napi_enable(&priv->napi);
 	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
 
 	if (ipoib_pkey_dev_delay_open(dev))
 		return 0;
 
+	napi_enable(&priv->napi);
+
 	if (ipoib_ib_dev_open(dev)) {
 		napi_disable(&priv->napi);
 		return -EINVAL;
@@ -546,6 +547,7 @@ static int path_rec_start(struct net_device *dev,
 	if (path->query_id < 0) {
 		ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id);
 		path->query = NULL;
+		complete(&path->done);
 		return path->query_id;
 	}
 
@@ -662,7 +664,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
 			skb_push(skb, sizeof *phdr);
 			__skb_queue_tail(&path->queue, skb);
 
-			if (path_rec_start(dev, path)) {
+			if (!path->query && path_rec_start(dev, path)) {
 				spin_unlock_irqrestore(&priv->lock, flags);
 				path_free(dev, path);
 				return;
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index fa431fa..56a2e21 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -87,6 +87,9 @@ enum {
 
 #ifdef CONFIG_MLX4_DEBUG
 extern int mlx4_debug_level;
+#else /* CONFIG_MLX4_DEBUG */
+#define mlx4_debug_level	(0)
+#endif /* CONFIG_MLX4_DEBUG */
 
 #define mlx4_dbg(mdev, format, arg...)					\
 	do {								\
@@ -94,12 +97,6 @@ extern int mlx4_debug_level;
 			dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ## arg); \
 	} while (0)
 
-#else /* CONFIG_MLX4_DEBUG */
-
-#define mlx4_dbg(mdev, format, arg...) do { (void) mdev; } while (0)
-
-#endif /* CONFIG_MLX4_DEBUG */
-
 #define mlx4_err(mdev, format, arg...) \
 	dev_err(&mdev->pdev->dev, format, ## arg)
 #define mlx4_info(mdev, format, arg...) \

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

* [GIT PULL] please pull infiniband.git
@ 2008-10-23  4:37 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-10-23  4:37 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel, jeff

Linus, please pull from

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the last batch of merges for the 2.6.28 window.  As the
dirstat shows, this is almost entirely the new mlx4_en driver, which
is a 10G Ethernet driver for Mellanox ConnectX adapters:

   1.2% drivers/infiniband/
  98.6% drivers/net/mlx4/

Jeff Garzik and I agreed that this new driver should go through my
tree because it depended on changes to the existing mlx4_ib InfiniBand
driver that I wanted to review and apply through my tree.

Other than mlx4_en, there are just miscellaneous fixes of the usual
type (low-level hardware drivers and IPoIB).

Hoang-Nam Nguyen (1):
      IB/ehca: Don't allow creating UC QP with SRQ

Julien Brunel (1):
      RDMA/ucma: Test ucma_alloc_multicast() return against NULL, not with IS_ERR()

Or Gerlitz (2):
      IPoIB: Clean up ethtool support
      IPoIB: Set netdev offload features properly for child (VLAN) interfaces

Roland Dreier (4):
      IPoIB: Always initialize poll_timer to avoid crash on unload
      IB/mad: Use krealloc() to resize snoop table
      Update NetEffect maintainer emails to Intel emails
      Merge branches 'cma', 'cxgb3', 'ehca', 'ipoib', 'mad', 'mlx4' and 'nes' into for-next

Stefan Roscher (2):
      IB/ehca: Fix reported max number of QPs and CQs in systems with >1 adapter
      IB/ehca: Reject dynamic memory add/remove when ehca adapter is present

Steve Wise (1):
      RDMA/cxgb3: Remove cmid reference on tid allocation failures

Yevgeny Petrilin (7):
      mlx4_core: Add QP range reservation support
      mlx4_core: Support multiple pre-reserved QP regions
      mlx4_core: Get ethernet MTU and default address from firmware
      mlx4_core: Ethernet MAC/VLAN management
      mlx4_core: Multiple port type support
      mlx4_en: Add driver for Mellanox ConnectX 10GbE NIC
      mlx4_core: Add Ethernet PCI device IDs

 MAINTAINERS                                  |    4 +-
 drivers/infiniband/core/mad.c                |   14 +-
 drivers/infiniband/core/ucma.c               |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c        |    1 +
 drivers/infiniband/hw/ehca/ehca_classes.h    |    2 +
 drivers/infiniband/hw/ehca/ehca_cq.c         |    4 +-
 drivers/infiniband/hw/ehca/ehca_main.c       |   83 ++-
 drivers/infiniband/hw/ehca/ehca_qp.c         |   10 +-
 drivers/infiniband/hw/mlx4/mad.c             |    6 +-
 drivers/infiniband/hw/mlx4/main.c            |   11 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h         |    1 +
 drivers/infiniband/hw/mlx4/qp.c              |   21 +-
 drivers/infiniband/ulp/ipoib/ipoib.h         |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c |    9 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |    7 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |   67 +-
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c    |    4 +
 drivers/net/Kconfig                          |    9 +
 drivers/net/mlx4/Makefile                    |    7 +-
 drivers/net/mlx4/alloc.c                     |   97 +++-
 drivers/net/mlx4/cq.c                        |    2 +-
 drivers/net/mlx4/en_cq.c                     |  146 ++++
 drivers/net/mlx4/en_main.c                   |  254 ++++++
 drivers/net/mlx4/en_netdev.c                 | 1088 ++++++++++++++++++++++++++
 drivers/net/mlx4/en_params.c                 |  480 ++++++++++++
 drivers/net/mlx4/en_port.c                   |  261 ++++++
 drivers/net/mlx4/en_port.h                   |  570 ++++++++++++++
 drivers/net/mlx4/en_resources.c              |   96 +++
 drivers/net/mlx4/en_rx.c                     | 1080 +++++++++++++++++++++++++
 drivers/net/mlx4/en_tx.c                     |  820 +++++++++++++++++++
 drivers/net/mlx4/eq.c                        |    2 +-
 drivers/net/mlx4/fw.c                        |   20 +-
 drivers/net/mlx4/fw.h                        |    7 +-
 drivers/net/mlx4/main.c                      |  287 +++++++-
 drivers/net/mlx4/mcg.c                       |    4 +-
 drivers/net/mlx4/mlx4.h                      |   45 +-
 drivers/net/mlx4/mlx4_en.h                   |  561 +++++++++++++
 drivers/net/mlx4/mr.c                        |    2 +-
 drivers/net/mlx4/pd.c                        |    4 +-
 drivers/net/mlx4/port.c                      |  282 +++++++
 drivers/net/mlx4/qp.c                        |   81 ++-
 drivers/net/mlx4/srq.c                       |    2 +-
 include/linux/mlx4/cmd.h                     |    9 +
 include/linux/mlx4/device.h                  |   54 ++-
 44 files changed, 6394 insertions(+), 125 deletions(-)
 create mode 100644 drivers/net/mlx4/en_cq.c
 create mode 100644 drivers/net/mlx4/en_main.c
 create mode 100644 drivers/net/mlx4/en_netdev.c
 create mode 100644 drivers/net/mlx4/en_params.c
 create mode 100644 drivers/net/mlx4/en_port.c
 create mode 100644 drivers/net/mlx4/en_port.h
 create mode 100644 drivers/net/mlx4/en_resources.c
 create mode 100644 drivers/net/mlx4/en_rx.c
 create mode 100644 drivers/net/mlx4/en_tx.c
 create mode 100644 drivers/net/mlx4/mlx4_en.h
 create mode 100644 drivers/net/mlx4/port.c

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

* [GIT PULL] please pull infiniband.git
@ 2008-10-10  0:48 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-10-10  0:48 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first batch of 2.6.28 merges -- pretty much all
low-level hardware driver and IP-over-IB fixes, along with a few little
things elsewhere, as the dirstat shows:

  14.4% drivers/infiniband/hw/ehca/
  22.0% drivers/infiniband/hw/mthca/
  33.1% drivers/infiniband/hw/nes/
  26.9% drivers/infiniband/ulp/ipoib/
   3.4% drivers/infiniband/

Full list of patches below:

Alexander Schmidt (1):
      IB/ehca: Generate flush status CQ entries

Bob Sharp (4):
      RDMA/nes: Free NIC TX buffers when destroying NIC QP
      RDMA/nes: Enable MC/UC after changing MTU
      RDMA/nes: Correct MAX TSO frags value
      RDMA/nes: Fix routed RDMA connections

Chien Tung (10):
      RDMA/nes: Add support for 4-port 1G HP blade card
      RDMA/nes: Module parameter permissions
      RDMA/nes: Add wqm_quanta module option
      RDMA/nes: Fix MDC setting
      RDMA/nes: Fill in firmware version for ethtool
      RDMA/nes: Correct tso_wqe_length
      RDMA/nes: Stop spurious MAC interrupts
      RDMA/nes: Limit critical error interrupts
      RDMA/nes: Correct error_module bit mask
      RDMA/nes: Fix slab corruption

Faisal Latif (2):
      RDMA/nes: Make mini_cm_connect() static
      RDMA/nes: Handle AE bounds violation

Hefty, Sean (1):
      IB/cm: Correctly free cm_device structure

John Lacombe (1):
      RDMA/nes: Use ethtool timer value

Jon Mason (1):
      RDMA/cxgb3: Set active_mtu in ib_port_attr

Julia Lawall (1):
      IB: Drop code after return statement

Michael Brooks (1):
      IB/mad: Don't discard BMA responses in kernel

Ralph Campbell (1):
      IB/ipath: Fix SLID generation for RC/UC QPs when LMC > 0

Roland Dreier (4):
      IPoIB: Fix crash when path record fails after path flush
      IB/mthca: Use pci_request_regions()
      IPoIB: Use netif_tx_lock() and get rid of private tx_lock, LLTX
      Merge branches 'cma', 'cxgb3', 'ehca', 'ipath', 'ipoib', 'mad', 'misc', 'mlx4', 'mthca' and 'nes' into for-next

Vadim Makhervaks (1):
      RDMA/nes: Enhanced PFT management scheme

Vladimir Sokolovsky (1):
      IB/mlx4: Set RLKEY bit for kernel QPs

Yannick Cote (1):
      IB/ipath: Fix hang on module unload

 drivers/infiniband/core/cm.c                   |    2 +
 drivers/infiniband/core/mad.c                  |    5 +-
 drivers/infiniband/hw/amso1100/c2_provider.c   |    1 -
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |    9 +-
 drivers/infiniband/hw/ehca/ehca_classes.h      |   14 ++-
 drivers/infiniband/hw/ehca/ehca_cq.c           |    3 +
 drivers/infiniband/hw/ehca/ehca_iverbs.h       |    2 +
 drivers/infiniband/hw/ehca/ehca_qp.c           |  225 ++++++++++++++++++++++--
 drivers/infiniband/hw/ehca/ehca_reqs.c         |  211 +++++++++++++++++++---
 drivers/infiniband/hw/ipath/ipath_rc.c         |    3 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c        |    3 +-
 drivers/infiniband/hw/ipath/ipath_verbs.c      |    7 +
 drivers/infiniband/hw/mlx4/qp.c                |    3 +
 drivers/infiniband/hw/mthca/mthca_catas.c      |   15 +--
 drivers/infiniband/hw/mthca/mthca_eq.c         |   51 +-----
 drivers/infiniband/hw/mthca/mthca_main.c       |   59 +------
 drivers/infiniband/hw/nes/nes.c                |   95 +++++++++-
 drivers/infiniband/hw/nes/nes.h                |    2 +-
 drivers/infiniband/hw/nes/nes_cm.c             |   41 ++++-
 drivers/infiniband/hw/nes/nes_hw.c             |  205 ++++++++++++++++++----
 drivers/infiniband/hw/nes/nes_hw.h             |    6 +
 drivers/infiniband/hw/nes/nes_nic.c            |  122 +++++++++++---
 drivers/infiniband/hw/nes/nes_verbs.c          |    3 -
 drivers/infiniband/ulp/ipoib/ipoib.h           |    8 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |   88 ++++++----
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |   30 +++-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   76 ++++-----
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   31 ++--
 28 files changed, 961 insertions(+), 359 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-09-17 16:40 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-09-17 16:40 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get four patches, which I believe are all appropriate for
this stage of 2.6.27:

 - A fix for a nes regression we introduced in some earlier 2.6.27
   patches that leads to userspace processes hanging on exit.

 - Two fixes that make a new mlx4 feature we added in 2.6.27 actually
   work.  The functions touched are only used for the new fast
   register work requests so fixing this is low risk.

 - A fix for an IPoIB RTNL deadlock that we introduced in 2.6.27.

Faisal Latif (1):
      RDMA/nes: Fix client side QP destroy

Roland Dreier (1):
      Merge branches 'ipoib', 'mlx4' and 'nes' into for-linus

Vladimir Sokolovsky (2):
      mlx4_core: Set RAE and init mtt_sz field in FRMR MPT entries
      IB/mlx4: Fix up fast register page list format

Yossi Etigin (1):
      IPoIB: Fix deadlock on RTNL between bcast join comp and ipoib_stop()

 drivers/infiniband/hw/mlx4/qp.c                |    6 ++++
 drivers/infiniband/hw/nes/nes_cm.c             |   11 +-------
 drivers/infiniband/ulp/ipoib/ipoib.h           |    2 +
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   31 ++++++++++++++++-------
 drivers/net/mlx4/mr.c                          |   10 ++++---
 include/linux/mlx4/device.h                    |    4 +++
 7 files changed, 42 insertions(+), 23 deletions(-)


commit e8224e4b804b4fd26723191c1891101a5959bb8a
Author: Yossi Etigin <yossi.openib@gmail.com>
Date:   Tue Sep 16 11:57:45 2008 -0700

    IPoIB: Fix deadlock on RTNL between bcast join comp and ipoib_stop()
    
    Taking rtnl_lock in ipoib_mcast_join_complete() causes a deadlock with
    ipoib_stop().  We avoid it by scheduling the piece of code that takes
    the lock on ipoib_workqueue instead of executing it directly.  This
    works because we only flush the ipoib_workqueue with the RTNL not held.
    
    The deadlock happens because ipoib_stop() calls ipoib_ib_dev_down()
    which calls ipoib_mcast_dev_flush(), which calls ipoib_mcast_free(),
    which calls ipoib_mcast_leave(). The latter calls
    ib_sa_free_multicast(), and this waits until the multicast completion
    handler finishes.  This handler is ipoib_mcast_join_complete(), which
    waits for the rtnl_lock(), which was already taken by ipoib_stop().
    
    This bug was introduced in commit a77a57a1 ("IPoIB: Fix deadlock on
    RTNL in ipoib_stop()").
    
    Signed-off-by: Yossi Etigin <yosefe@voltaire.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index b0ffc9a..05eb41b 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -293,6 +293,7 @@ struct ipoib_dev_priv {
 
 	struct delayed_work pkey_poll_task;
 	struct delayed_work mcast_task;
+	struct work_struct carrier_on_task;
 	struct work_struct flush_light;
 	struct work_struct flush_normal;
 	struct work_struct flush_heavy;
@@ -464,6 +465,7 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port);
 void ipoib_dev_cleanup(struct net_device *dev);
 
 void ipoib_mcast_join_task(struct work_struct *work);
+void ipoib_mcast_carrier_on_task(struct work_struct *work);
 void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb);
 
 void ipoib_mcast_restart_task(struct work_struct *work);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 7e9e218..1b1df5c 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -1075,6 +1075,7 @@ static void ipoib_setup(struct net_device *dev)
 
 	INIT_DELAYED_WORK(&priv->pkey_poll_task, ipoib_pkey_poll);
 	INIT_DELAYED_WORK(&priv->mcast_task,   ipoib_mcast_join_task);
+	INIT_WORK(&priv->carrier_on_task, ipoib_mcast_carrier_on_task);
 	INIT_WORK(&priv->flush_light,   ipoib_ib_dev_flush_light);
 	INIT_WORK(&priv->flush_normal,   ipoib_ib_dev_flush_normal);
 	INIT_WORK(&priv->flush_heavy,   ipoib_ib_dev_flush_heavy);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index ac33c8f..aae2862 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -366,6 +366,21 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast)
 	return ret;
 }
 
+void ipoib_mcast_carrier_on_task(struct work_struct *work)
+{
+	struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
+						   carrier_on_task);
+
+	/*
+	 * Take rtnl_lock to avoid racing with ipoib_stop() and
+	 * turning the carrier back on while a device is being
+	 * removed.
+	 */
+	rtnl_lock();
+	netif_carrier_on(priv->dev);
+	rtnl_unlock();
+}
+
 static int ipoib_mcast_join_complete(int status,
 				     struct ib_sa_multicast *multicast)
 {
@@ -392,16 +407,12 @@ static int ipoib_mcast_join_complete(int status,
 					   &priv->mcast_task, 0);
 		mutex_unlock(&mcast_mutex);
 
-		if (mcast == priv->broadcast) {
-			/*
-			 * Take RTNL lock here to avoid racing with
-			 * ipoib_stop() and turning the carrier back
-			 * on while a device is being removed.
-			 */
-			rtnl_lock();
-			netif_carrier_on(dev);
-			rtnl_unlock();
-		}
+		/*
+		 * Defer carrier on work to ipoib_workqueue to avoid a
+		 * deadlock on rtnl_lock here.
+		 */
+		if (mcast == priv->broadcast)
+			queue_work(ipoib_workqueue, &priv->carrier_on_task);
 
 		return 0;
 	}

commit d7ffd5076d4407d54b25bc4b25f3002f74fbafde
Author: Faisal Latif <flatif@neteffect.com>
Date:   Tue Sep 16 11:56:26 2008 -0700

    RDMA/nes: Fix client side QP destroy
    
    Fix QP not being destroyed properly on the client, which leads to
    userspace programs hanging on exit.  This is a missing chunk from the
    connection management rewrite in commit 6492cdf3 ("RDMA/nes: CM
    connection setup/teardown rework").
    
    Signed-off-by: Faisal Latif <flatif@neteffect.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
index 9f0b964..499d3cf 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -1956,13 +1956,6 @@ static int mini_cm_reject(struct nes_cm_core *cm_core,
 		return ret;
 	cleanup_retrans_entry(cm_node);
 	cm_node->state = NES_CM_STATE_CLOSED;
-	ret = send_fin(cm_node, NULL);
-
-	if (cm_node->accept_pend) {
-		BUG_ON(!cm_node->listener);
-		atomic_dec(&cm_node->listener->pend_accepts_cnt);
-		BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);
-	}
 
 	ret = send_reset(cm_node, NULL);
 	return ret;
@@ -2383,6 +2376,7 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp)
 			atomic_inc(&cm_disconnects);
 			cm_event.event = IW_CM_EVENT_DISCONNECT;
 			if (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET) {
+				issued_disconnect_reset = 1;
 				cm_event.status = IW_CM_EVENT_STATUS_RESET;
 				nes_debug(NES_DBG_CM, "Generating a CM "
 					"Disconnect Event (status reset) for "
@@ -2508,7 +2502,6 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
 		nes_debug(NES_DBG_CM, "Call close API\n");
 
 		g_cm_core->api->close(g_cm_core, nesqp->cm_node);
-		nesqp->cm_node = NULL;
 	}
 
 	return ret;
@@ -2837,6 +2830,7 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
 	cm_node->apbvt_set = 1;
 	nesqp->cm_node = cm_node;
 	cm_node->nesqp = nesqp;
+	nes_add_ref(&nesqp->ibqp);
 
 	return 0;
 }
@@ -3167,7 +3161,6 @@ static void cm_event_connect_error(struct nes_cm_event *event)
 	if (ret)
 		printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
 			"ret=%d\n", __func__, __LINE__, ret);
-	nes_rem_ref(&nesqp->ibqp);
 	cm_id->rem_ref(cm_id);
 
 	rem_ref_cm_node(event->cm_node->cm_core, event->cm_node);

commit 29bdc88384c2b24e37e5760df0dc898546083d6b
Author: Vladimir Sokolovsky <vlad@mellanox.co.il>
Date:   Mon Sep 15 14:25:23 2008 -0700

    IB/mlx4: Fix up fast register page list format
    
    Byte swap the addresses in the page list for fast register work requests
    to big endian to match what the HCA expectx.  Also, the addresses must
    have the "present" bit set so that the HCA knows it can access them.
    Otherwise the HCA will fault the first time it accesses the memory
    region.
    
    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index f29dbb7..9559248 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1342,6 +1342,12 @@ static __be32 convert_access(int acc)
 static void set_fmr_seg(struct mlx4_wqe_fmr_seg *fseg, struct ib_send_wr *wr)
 {
 	struct mlx4_ib_fast_reg_page_list *mfrpl = to_mfrpl(wr->wr.fast_reg.page_list);
+	int i;
+
+	for (i = 0; i < wr->wr.fast_reg.page_list_len; ++i)
+		wr->wr.fast_reg.page_list->page_list[i] =
+			cpu_to_be64(wr->wr.fast_reg.page_list->page_list[i] |
+				    MLX4_MTT_FLAG_PRESENT);
 
 	fseg->flags		= convert_access(wr->wr.fast_reg.access_flags);
 	fseg->mem_key		= cpu_to_be32(wr->wr.fast_reg.rkey);
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index 644adf0..d1dd5b4 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -71,8 +71,6 @@ struct mlx4_mpt_entry {
 #define MLX4_MPT_PD_FLAG_RAE	    (1 << 28)
 #define MLX4_MPT_PD_FLAG_EN_INV	    (3 << 24)
 
-#define MLX4_MTT_FLAG_PRESENT		1
-
 #define MLX4_MPT_STATUS_SW		0xF0
 #define MLX4_MPT_STATUS_HW		0x00
 
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 655ea0d..b2f9444 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -141,6 +141,10 @@ enum {
 	MLX4_STAT_RATE_OFFSET	= 5
 };
 
+enum {
+	MLX4_MTT_FLAG_PRESENT		= 1
+};
+
 static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor)
 {
 	return (major << 32) | (minor << 16) | subminor;

commit c9257433f2eaf8803a1f3d3be5d984232db41ffe
Author: Vladimir Sokolovsky <vlad@mellanox.co.il>
Date:   Tue Sep 2 13:38:29 2008 -0700

    mlx4_core: Set RAE and init mtt_sz field in FRMR MPT entries
    
    Set the RAE (remote access enable) bit and correctly initialize the
    MTT size in MPT entries being set up for fast register memory
    regions.  Otherwise the callers can't enable remote access and in fact
    can't fast register at all (since the HCA will think no MTT entries
    are allocated).
    
    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index 62071d9..644adf0 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -67,7 +67,8 @@ struct mlx4_mpt_entry {
 #define MLX4_MPT_FLAG_PHYSICAL	    (1 <<  9)
 #define MLX4_MPT_FLAG_REGION	    (1 <<  8)
 
-#define MLX4_MPT_PD_FLAG_FAST_REG   (1 << 26)
+#define MLX4_MPT_PD_FLAG_FAST_REG   (1 << 27)
+#define MLX4_MPT_PD_FLAG_RAE	    (1 << 28)
 #define MLX4_MPT_PD_FLAG_EN_INV	    (3 << 24)
 
 #define MLX4_MTT_FLAG_PRESENT		1
@@ -348,7 +349,10 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr)
 	if (mr->mtt.order >= 0 && mr->mtt.page_shift == 0) {
 		/* fast register MR in free state */
 		mpt_entry->flags    |= cpu_to_be32(MLX4_MPT_FLAG_FREE);
-		mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG);
+		mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG |
+						   MLX4_MPT_PD_FLAG_RAE);
+		mpt_entry->mtt_sz    = cpu_to_be32((1 << mr->mtt.order) *
+						   MLX4_MTT_ENTRY_PER_SEG);
 	} else {
 		mpt_entry->flags    |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS);
 	}

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

* [GIT PULL] please pull infiniband.git
@ 2008-08-19 22:03 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-08-19 22:03 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Dave Olson (1):
      IB/ipath: Fix incorrect check for max physical address in TID

Ralph Campbell (1):
      IB/ipath: Fix lost UD send work request

Roland Dreier (2):
      IPoIB: Fix deadlock on RTNL in ipoib_stop()
      Merge branches 'ipath' and 'ipoib' into for-linus

 drivers/infiniband/hw/ipath/ipath_iba7220.c    |    2 +-
 drivers/infiniband/hw/ipath/ipath_ud.c         |    8 ++++++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   19 +++++++++----------
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 +++++++++-
 4 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/drivers/infiniband/hw/ipath/ipath_iba7220.c b/drivers/infiniband/hw/ipath/ipath_iba7220.c
index d90f5e9..9839e20 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba7220.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba7220.c
@@ -1720,7 +1720,7 @@ static void ipath_7220_put_tid(struct ipath_devdata *dd, u64 __iomem *tidptr,
 				 "not 2KB aligned!\n", pa);
 			return;
 		}
-		if (pa >= (1UL << IBA7220_TID_SZ_SHIFT)) {
+		if (chippa >= (1UL << IBA7220_TID_SZ_SHIFT)) {
 			ipath_dev_err(dd,
 				      "BUG: Physical page address 0x%lx "
 				      "larger than supported\n", pa);
diff --git a/drivers/infiniband/hw/ipath/ipath_ud.c b/drivers/infiniband/hw/ipath/ipath_ud.c
index 36aa242..729446f 100644
--- a/drivers/infiniband/hw/ipath/ipath_ud.c
+++ b/drivers/infiniband/hw/ipath/ipath_ud.c
@@ -267,6 +267,7 @@ int ipath_make_ud_req(struct ipath_qp *qp)
 	u16 lrh0;
 	u16 lid;
 	int ret = 0;
+	int next_cur;
 
 	spin_lock_irqsave(&qp->s_lock, flags);
 
@@ -290,8 +291,9 @@ int ipath_make_ud_req(struct ipath_qp *qp)
 		goto bail;
 
 	wqe = get_swqe_ptr(qp, qp->s_cur);
-	if (++qp->s_cur >= qp->s_size)
-		qp->s_cur = 0;
+	next_cur = qp->s_cur + 1;
+	if (next_cur >= qp->s_size)
+		next_cur = 0;
 
 	/* Construct the header. */
 	ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr;
@@ -315,6 +317,7 @@ int ipath_make_ud_req(struct ipath_qp *qp)
 				qp->s_flags |= IPATH_S_WAIT_DMA;
 				goto bail;
 			}
+			qp->s_cur = next_cur;
 			spin_unlock_irqrestore(&qp->s_lock, flags);
 			ipath_ud_loopback(qp, wqe);
 			spin_lock_irqsave(&qp->s_lock, flags);
@@ -323,6 +326,7 @@ int ipath_make_ud_req(struct ipath_qp *qp)
 		}
 	}
 
+	qp->s_cur = next_cur;
 	extra_bytes = -wqe->length & 3;
 	nwords = (wqe->length + extra_bytes) >> 2;
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index f51201b..7e9e218 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -156,14 +156,8 @@ static int ipoib_stop(struct net_device *dev)
 
 	netif_stop_queue(dev);
 
-	/*
-	 * Now flush workqueue to make sure a scheduled task doesn't
-	 * bring our internal state back up.
-	 */
-	flush_workqueue(ipoib_workqueue);
-
-	ipoib_ib_dev_down(dev, 1);
-	ipoib_ib_dev_stop(dev, 1);
+	ipoib_ib_dev_down(dev, 0);
+	ipoib_ib_dev_stop(dev, 0);
 
 	if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
 		struct ipoib_dev_priv *cpriv;
@@ -1314,7 +1308,7 @@ sysfs_failed:
 
 register_failed:
 	ib_unregister_event_handler(&priv->event_handler);
-	flush_scheduled_work();
+	flush_workqueue(ipoib_workqueue);
 
 event_failed:
 	ipoib_dev_cleanup(priv->dev);
@@ -1373,7 +1367,12 @@ static void ipoib_remove_one(struct ib_device *device)
 
 	list_for_each_entry_safe(priv, tmp, dev_list, list) {
 		ib_unregister_event_handler(&priv->event_handler);
-		flush_scheduled_work();
+
+		rtnl_lock();
+		dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP);
+		rtnl_unlock();
+
+		flush_workqueue(ipoib_workqueue);
 
 		unregister_netdev(priv->dev);
 		ipoib_dev_cleanup(priv->dev);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 8950e95..ac33c8f 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -392,8 +392,16 @@ static int ipoib_mcast_join_complete(int status,
 					   &priv->mcast_task, 0);
 		mutex_unlock(&mcast_mutex);
 
-		if (mcast == priv->broadcast)
+		if (mcast == priv->broadcast) {
+			/*
+			 * Take RTNL lock here to avoid racing with
+			 * ipoib_stop() and turning the carrier back
+			 * on while a device is being removed.
+			 */
+			rtnl_lock();
 			netif_carrier_on(dev);
+			rtnl_unlock();
+		}
 
 		return 0;
 	}

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

* [GIT PULL] please pull infiniband.git
@ 2008-08-12 20:55 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-08-12 20:55 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the following fixes:

Alexander Schmidt (5):
      IB/ehca: Update qp_state on cached modify_qp()
      IB/ehca: Rename goto label in ehca_poll_cq_one()
      IB/ehca: Repoll CQ on invalid opcode
      IB/ehca: Check idr_find() return value
      IB/ehca: Discard double CQE for one WR

David J. Wilder (1):
      IPoIB/cm: Use vmalloc() to allocate rx_rings

Roland Dreier (1):
      Merge branches 'ehca' and 'ipoib' into for-linus

 drivers/infiniband/hw/ehca/ehca_classes.h |    9 ++++
 drivers/infiniband/hw/ehca/ehca_qes.h     |    1 +
 drivers/infiniband/hw/ehca/ehca_qp.c      |   48 +++++++++++++++++------
 drivers/infiniband/hw/ehca/ehca_reqs.c    |   60 ++++++++++++++++++++++------
 drivers/infiniband/ulp/ipoib/ipoib_cm.c   |   17 ++++++--
 5 files changed, 104 insertions(+), 31 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 0b0618e..1ab919f 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -156,6 +156,14 @@ struct ehca_mod_qp_parm {
 
 #define EHCA_MOD_QP_PARM_MAX 4
 
+#define QMAP_IDX_MASK 0xFFFFULL
+
+/* struct for tracking if cqes have been reported to the application */
+struct ehca_qmap_entry {
+	u16 app_wr_id;
+	u16 reported;
+};
+
 struct ehca_qp {
 	union {
 		struct ib_qp ib_qp;
@@ -165,6 +173,7 @@ struct ehca_qp {
 	enum ehca_ext_qp_type ext_type;
 	enum ib_qp_state state;
 	struct ipz_queue ipz_squeue;
+	struct ehca_qmap_entry *sq_map;
 	struct ipz_queue ipz_rqueue;
 	struct h_galpas galpas;
 	u32 qkey;
diff --git a/drivers/infiniband/hw/ehca/ehca_qes.h b/drivers/infiniband/hw/ehca/ehca_qes.h
index 8188030..5d28e3e 100644
--- a/drivers/infiniband/hw/ehca/ehca_qes.h
+++ b/drivers/infiniband/hw/ehca/ehca_qes.h
@@ -213,6 +213,7 @@ struct ehca_wqe {
 #define WC_STATUS_ERROR_BIT 0x80000000
 #define WC_STATUS_REMOTE_ERROR_FLAGS 0x0000F800
 #define WC_STATUS_PURGE_BIT 0x10
+#define WC_SEND_RECEIVE_BIT 0x80
 
 struct ehca_cqe {
 	u64 work_request_id;
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index ea13efd..b6bcee0 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -412,6 +412,7 @@ static struct ehca_qp *internal_create_qp(
 	struct ehca_shca *shca = container_of(pd->device, struct ehca_shca,
 					      ib_device);
 	struct ib_ucontext *context = NULL;
+	u32 nr_qes;
 	u64 h_ret;
 	int is_llqp = 0, has_srq = 0;
 	int qp_type, max_send_sge, max_recv_sge, ret;
@@ -715,6 +716,15 @@ static struct ehca_qp *internal_create_qp(
 				 "and pages ret=%i", ret);
 			goto create_qp_exit2;
 		}
+		nr_qes = my_qp->ipz_squeue.queue_length /
+			 my_qp->ipz_squeue.qe_size;
+		my_qp->sq_map = vmalloc(nr_qes *
+					sizeof(struct ehca_qmap_entry));
+		if (!my_qp->sq_map) {
+			ehca_err(pd->device, "Couldn't allocate squeue "
+				 "map ret=%i", ret);
+			goto create_qp_exit3;
+		}
 	}
 
 	if (HAS_RQ(my_qp)) {
@@ -724,7 +734,7 @@ static struct ehca_qp *internal_create_qp(
 		if (ret) {
 			ehca_err(pd->device, "Couldn't initialize rqueue "
 				 "and pages ret=%i", ret);
-			goto create_qp_exit3;
+			goto create_qp_exit4;
 		}
 	}
 
@@ -770,7 +780,7 @@ static struct ehca_qp *internal_create_qp(
 			if (!my_qp->mod_qp_parm) {
 				ehca_err(pd->device,
 					 "Could not alloc mod_qp_parm");
-				goto create_qp_exit4;
+				goto create_qp_exit5;
 			}
 		}
 	}
@@ -780,7 +790,7 @@ static struct ehca_qp *internal_create_qp(
 		h_ret = ehca_define_sqp(shca, my_qp, init_attr);
 		if (h_ret != H_SUCCESS) {
 			ret = ehca2ib_return_code(h_ret);
-			goto create_qp_exit5;
+			goto create_qp_exit6;
 		}
 	}
 
@@ -789,7 +799,7 @@ static struct ehca_qp *internal_create_qp(
 		if (ret) {
 			ehca_err(pd->device,
 				 "Couldn't assign qp to send_cq ret=%i", ret);
-			goto create_qp_exit5;
+			goto create_qp_exit6;
 		}
 	}
 
@@ -815,22 +825,26 @@ static struct ehca_qp *internal_create_qp(
 		if (ib_copy_to_udata(udata, &resp, sizeof resp)) {
 			ehca_err(pd->device, "Copy to udata failed");
 			ret = -EINVAL;
-			goto create_qp_exit6;
+			goto create_qp_exit7;
 		}
 	}
 
 	return my_qp;
 
-create_qp_exit6:
+create_qp_exit7:
 	ehca_cq_unassign_qp(my_qp->send_cq, my_qp->real_qp_num);
 
-create_qp_exit5:
+create_qp_exit6:
 	kfree(my_qp->mod_qp_parm);
 
-create_qp_exit4:
+create_qp_exit5:
 	if (HAS_RQ(my_qp))
 		ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue);
 
+create_qp_exit4:
+	if (HAS_SQ(my_qp))
+		vfree(my_qp->sq_map);
+
 create_qp_exit3:
 	if (HAS_SQ(my_qp))
 		ipz_queue_dtor(my_pd, &my_qp->ipz_squeue);
@@ -1534,8 +1548,6 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 	if (attr_mask & IB_QP_QKEY)
 		my_qp->qkey = attr->qkey;
 
-	my_qp->state = qp_new_state;
-
 modify_qp_exit2:
 	if (squeue_locked) { /* this means: sqe -> rts */
 		spin_unlock_irqrestore(&my_qp->spinlock_s, flags);
@@ -1551,6 +1563,8 @@ modify_qp_exit1:
 int ehca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,
 		   struct ib_udata *udata)
 {
+	int ret = 0;
+
 	struct ehca_shca *shca = container_of(ibqp->device, struct ehca_shca,
 					      ib_device);
 	struct ehca_qp *my_qp = container_of(ibqp, struct ehca_qp, ib_qp);
@@ -1597,12 +1611,18 @@ int ehca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,
 				 attr->qp_state, my_qp->init_attr.port_num,
 				 ibqp->qp_type);
 			spin_unlock_irqrestore(&sport->mod_sqp_lock, flags);
-			return 0;
+			goto out;
 		}
 		spin_unlock_irqrestore(&sport->mod_sqp_lock, flags);
 	}
 
-	return internal_modify_qp(ibqp, attr, attr_mask, 0);
+	ret = internal_modify_qp(ibqp, attr, attr_mask, 0);
+
+out:
+	if ((ret == 0) && (attr_mask & IB_QP_STATE))
+		my_qp->state = attr->qp_state;
+
+	return ret;
 }
 
 void ehca_recover_sqp(struct ib_qp *sqp)
@@ -1973,8 +1993,10 @@ static int internal_destroy_qp(struct ib_device *dev, struct ehca_qp *my_qp,
 
 	if (HAS_RQ(my_qp))
 		ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue);
-	if (HAS_SQ(my_qp))
+	if (HAS_SQ(my_qp)) {
 		ipz_queue_dtor(my_pd, &my_qp->ipz_squeue);
+		vfree(my_qp->sq_map);
+	}
 	kmem_cache_free(qp_cache, my_qp);
 	atomic_dec(&shca->num_qps);
 	return 0;
diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
index 898c8b5..4426d82 100644
--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
+++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
@@ -139,6 +139,7 @@ static void trace_send_wr_ud(const struct ib_send_wr *send_wr)
 static inline int ehca_write_swqe(struct ehca_qp *qp,
 				  struct ehca_wqe *wqe_p,
 				  const struct ib_send_wr *send_wr,
+				  u32 sq_map_idx,
 				  int hidden)
 {
 	u32 idx;
@@ -157,7 +158,11 @@ static inline int ehca_write_swqe(struct ehca_qp *qp,
 	/* clear wqe header until sglist */
 	memset(wqe_p, 0, offsetof(struct ehca_wqe, u.ud_av.sg_list));
 
-	wqe_p->work_request_id = send_wr->wr_id;
+	wqe_p->work_request_id = send_wr->wr_id & ~QMAP_IDX_MASK;
+	wqe_p->work_request_id |= sq_map_idx & QMAP_IDX_MASK;
+
+	qp->sq_map[sq_map_idx].app_wr_id = send_wr->wr_id & QMAP_IDX_MASK;
+	qp->sq_map[sq_map_idx].reported = 0;
 
 	switch (send_wr->opcode) {
 	case IB_WR_SEND:
@@ -381,6 +386,7 @@ static inline int post_one_send(struct ehca_qp *my_qp,
 {
 	struct ehca_wqe *wqe_p;
 	int ret;
+	u32 sq_map_idx;
 	u64 start_offset = my_qp->ipz_squeue.current_q_offset;
 
 	/* get pointer next to free WQE */
@@ -393,8 +399,15 @@ static inline int post_one_send(struct ehca_qp *my_qp,
 			 "qp_num=%x", my_qp->ib_qp.qp_num);
 		return -ENOMEM;
 	}
+
+	/*
+	 * Get the index of the WQE in the send queue. The same index is used
+	 * for writing into the sq_map.
+	 */
+	sq_map_idx = start_offset / my_qp->ipz_squeue.qe_size;
+
 	/* write a SEND WQE into the QUEUE */
-	ret = ehca_write_swqe(my_qp, wqe_p, cur_send_wr, hidden);
+	ret = ehca_write_swqe(my_qp, wqe_p, cur_send_wr, sq_map_idx, hidden);
 	/*
 	 * if something failed,
 	 * reset the free entry pointer to the start value
@@ -589,7 +602,7 @@ static inline int ehca_poll_cq_one(struct ib_cq *cq, struct ib_wc *wc)
 	struct ehca_qp *my_qp;
 	int cqe_count = 0, is_error;
 
-poll_cq_one_read_cqe:
+repoll:
 	cqe = (struct ehca_cqe *)
 		ipz_qeit_get_inc_valid(&my_cq->ipz_queue);
 	if (!cqe) {
@@ -617,7 +630,7 @@ poll_cq_one_read_cqe:
 			ehca_dmp(cqe, 64, "cq_num=%x qp_num=%x",
 				 my_cq->cq_number, cqe->local_qp_number);
 			/* ignore this purged cqe */
-			goto poll_cq_one_read_cqe;
+			goto repoll;
 		}
 		spin_lock_irqsave(&qp->spinlock_s, flags);
 		purgeflag = qp->sqerr_purgeflag;
@@ -636,7 +649,7 @@ poll_cq_one_read_cqe:
 			 * that caused sqe and turn off purge flag
 			 */
 			qp->sqerr_purgeflag = 0;
-			goto poll_cq_one_read_cqe;
+			goto repoll;
 		}
 	}
 
@@ -654,8 +667,34 @@ poll_cq_one_read_cqe:
 			 my_cq, my_cq->cq_number);
 	}
 
-	/* we got a completion! */
-	wc->wr_id = cqe->work_request_id;
+	read_lock(&ehca_qp_idr_lock);
+	my_qp = idr_find(&ehca_qp_idr, cqe->qp_token);
+	read_unlock(&ehca_qp_idr_lock);
+	if (!my_qp)
+		goto repoll;
+	wc->qp = &my_qp->ib_qp;
+
+	if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT)) {
+		struct ehca_qmap_entry *qmap_entry;
+		/*
+		 * We got a send completion and need to restore the original
+		 * wr_id.
+		 */
+		qmap_entry = &my_qp->sq_map[cqe->work_request_id &
+					    QMAP_IDX_MASK];
+
+		if (qmap_entry->reported) {
+			ehca_warn(cq->device, "Double cqe on qp_num=%#x",
+				  my_qp->real_qp_num);
+			/* found a double cqe, discard it and read next one */
+			goto repoll;
+		}
+		wc->wr_id = cqe->work_request_id & ~QMAP_IDX_MASK;
+		wc->wr_id |= qmap_entry->app_wr_id;
+		qmap_entry->reported = 1;
+	} else
+		/* We got a receive completion. */
+		wc->wr_id = cqe->work_request_id;
 
 	/* eval ib_wc_opcode */
 	wc->opcode = ib_wc_opcode[cqe->optype]-1;
@@ -667,7 +706,7 @@ poll_cq_one_read_cqe:
 		ehca_dmp(cqe, 64, "ehca_cq=%p cq_num=%x",
 			 my_cq, my_cq->cq_number);
 		/* update also queue adder to throw away this entry!!! */
-		goto poll_cq_one_exit0;
+		goto repoll;
 	}
 
 	/* eval ib_wc_status */
@@ -678,11 +717,6 @@ poll_cq_one_read_cqe:
 	} else
 		wc->status = IB_WC_SUCCESS;
 
-	read_lock(&ehca_qp_idr_lock);
-	my_qp = idr_find(&ehca_qp_idr, cqe->qp_token);
-	wc->qp = &my_qp->ib_qp;
-	read_unlock(&ehca_qp_idr_lock);
-
 	wc->byte_len = cqe->nr_bytes_transferred;
 	wc->pkey_index = cqe->pkey_index;
 	wc->slid = cqe->rlid;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 7ebc400..341ffed 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -202,7 +202,7 @@ static void ipoib_cm_free_rx_ring(struct net_device *dev,
 			dev_kfree_skb_any(rx_ring[i].skb);
 		}
 
-	kfree(rx_ring);
+	vfree(rx_ring);
 }
 
 static void ipoib_cm_start_rx_drain(struct ipoib_dev_priv *priv)
@@ -352,9 +352,14 @@ static int ipoib_cm_nonsrq_init_rx(struct net_device *dev, struct ib_cm_id *cm_i
 	int ret;
 	int i;
 
-	rx->rx_ring = kcalloc(ipoib_recvq_size, sizeof *rx->rx_ring, GFP_KERNEL);
-	if (!rx->rx_ring)
+	rx->rx_ring = vmalloc(ipoib_recvq_size * sizeof *rx->rx_ring);
+	if (!rx->rx_ring) {
+		printk(KERN_WARNING "%s: failed to allocate CM non-SRQ ring (%d entries)\n",
+		       priv->ca->name, ipoib_recvq_size);
 		return -ENOMEM;
+	}
+
+	memset(rx->rx_ring, 0, ipoib_recvq_size * sizeof *rx->rx_ring);
 
 	t = kmalloc(sizeof *t, GFP_KERNEL);
 	if (!t) {
@@ -1494,14 +1499,16 @@ static void ipoib_cm_create_srq(struct net_device *dev, int max_sge)
 		return;
 	}
 
-	priv->cm.srq_ring = kzalloc(ipoib_recvq_size * sizeof *priv->cm.srq_ring,
-				    GFP_KERNEL);
+	priv->cm.srq_ring = vmalloc(ipoib_recvq_size * sizeof *priv->cm.srq_ring);
 	if (!priv->cm.srq_ring) {
 		printk(KERN_WARNING "%s: failed to allocate CM SRQ ring (%d entries)\n",
 		       priv->ca->name, ipoib_recvq_size);
 		ib_destroy_srq(priv->cm.srq);
 		priv->cm.srq = NULL;
+		return;
 	}
+
+	memset(priv->cm.srq_ring, 0, ipoib_recvq_size * sizeof *priv->cm.srq_ring);
 }
 
 int ipoib_cm_dev_init(struct net_device *dev)

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

* [GIT PULL] please pull infiniband.git
@ 2008-08-07 21:15 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-08-07 21:15 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the following fixes:

Alex Naslednikov (1):
      IB/mlx4: Allow 4K messages for UD QPs

Alexander Beregalov (1):
      IB/ipath: Fix printk format warnings

Julien Brunel (1):
      IB/mad: Test ib_create_send_mad() return with IS_ERR(), not == NULL

Roland Dreier (3):
      IPoIB/cm: Set correct SG list in ipoib_cm_init_rx_wr()
      RDMA/cma: Remove padding arrays by using struct sockaddr_storage
      Merge branches 'cma', 'cxgb3', 'ipath', 'ipoib', 'mad' and 'mlx4' into for-linus

Steve Wise (3):
      RDMA/cxgb3: Fix QP capabilities
      RDMA/cxgb3: Fix up MW access rights
      RDMA/cxgb3: Fix deadlock initializing iw_cxgb3 device

Vegard Nossum (1):
      IB/ipath: Use unsigned long for irq flags

Yevgeny Petrilin (1):
      mlx4_core: Add ethernet fields to CQE struct

 drivers/infiniband/core/cma.c               |   37 +++++++++++++--------------
 drivers/infiniband/core/mad_rmpp.c          |    2 +-
 drivers/infiniband/core/ucma.c              |   14 ++++------
 drivers/infiniband/hw/cxgb3/cxio_hal.c      |    6 ++--
 drivers/infiniband/hw/cxgb3/iwch_provider.c |   28 ++------------------
 drivers/infiniband/hw/cxgb3/iwch_provider.h |    7 +++++
 drivers/infiniband/hw/cxgb3/iwch_qp.c       |   25 ++++++------------
 drivers/infiniband/hw/ipath/ipath_driver.c  |    5 ++-
 drivers/infiniband/hw/ipath/ipath_iba7220.c |    7 +++--
 drivers/infiniband/hw/ipath/ipath_intr.c    |   12 ++++++---
 drivers/infiniband/hw/ipath/ipath_verbs.c   |    6 ++--
 drivers/infiniband/hw/mlx4/cq.c             |   33 +++++++++++------------
 drivers/infiniband/hw/mlx4/qp.c             |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c     |    2 +-
 include/linux/mlx4/cq.h                     |   36 +++++++++++++++++--------
 include/rdma/rdma_cm.h                      |    8 +----
 16 files changed, 108 insertions(+), 122 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index e980ff3..d951896 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -155,9 +155,7 @@ struct cma_multicast {
 	} multicast;
 	struct list_head	list;
 	void			*context;
-	struct sockaddr		addr;
-	u8			pad[sizeof(struct sockaddr_in6) -
-				    sizeof(struct sockaddr)];
+	struct sockaddr_storage	addr;
 };
 
 struct cma_work {
@@ -786,8 +784,8 @@ static void cma_cancel_operation(struct rdma_id_private *id_priv,
 		cma_cancel_route(id_priv);
 		break;
 	case CMA_LISTEN:
-		if (cma_any_addr(&id_priv->id.route.addr.src_addr) &&
-		    !id_priv->cma_dev)
+		if (cma_any_addr((struct sockaddr *) &id_priv->id.route.addr.src_addr)
+				&& !id_priv->cma_dev)
 			cma_cancel_listens(id_priv);
 		break;
 	default:
@@ -1026,7 +1024,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
 		rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
 
 	ib_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);
-	ret = rdma_translate_ip(&id->route.addr.src_addr,
+	ret = rdma_translate_ip((struct sockaddr *) &id->route.addr.src_addr,
 				&id->route.addr.dev_addr);
 	if (ret)
 		goto destroy_id;
@@ -1064,7 +1062,7 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
 	cma_save_net_info(&id->route.addr, &listen_id->route.addr,
 			  ip_ver, port, src, dst);
 
-	ret = rdma_translate_ip(&id->route.addr.src_addr,
+	ret = rdma_translate_ip((struct sockaddr *) &id->route.addr.src_addr,
 				&id->route.addr.dev_addr);
 	if (ret)
 		goto err;
@@ -1377,7 +1375,7 @@ static int cma_ib_listen(struct rdma_id_private *id_priv)
 	if (IS_ERR(id_priv->cm_id.ib))
 		return PTR_ERR(id_priv->cm_id.ib);
 
-	addr = &id_priv->id.route.addr.src_addr;
+	addr = (struct sockaddr *) &id_priv->id.route.addr.src_addr;
 	svc_id = cma_get_service_id(id_priv->id.ps, addr);
 	if (cma_any_addr(addr))
 		ret = ib_cm_listen(id_priv->cm_id.ib, svc_id, 0, NULL);
@@ -1443,7 +1441,7 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
 
 	dev_id_priv->state = CMA_ADDR_BOUND;
 	memcpy(&id->route.addr.src_addr, &id_priv->id.route.addr.src_addr,
-	       ip_addr_size(&id_priv->id.route.addr.src_addr));
+	       ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr));
 
 	cma_attach_to_dev(dev_id_priv, cma_dev);
 	list_add_tail(&dev_id_priv->listen_list, &id_priv->listen_list);
@@ -1563,13 +1561,14 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
 	path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(&addr->dev_addr));
 	path_rec.numb_path = 1;
 	path_rec.reversible = 1;
-	path_rec.service_id = cma_get_service_id(id_priv->id.ps, &addr->dst_addr);
+	path_rec.service_id = cma_get_service_id(id_priv->id.ps,
+							(struct sockaddr *) &addr->dst_addr);
 
 	comp_mask = IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID |
 		    IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH |
 		    IB_SA_PATH_REC_REVERSIBLE | IB_SA_PATH_REC_SERVICE_ID;
 
-	if (addr->src_addr.sa_family == AF_INET) {
+	if (addr->src_addr.ss_family == AF_INET) {
 		path_rec.qos_class = cpu_to_be16((u16) id_priv->tos);
 		comp_mask |= IB_SA_PATH_REC_QOS_CLASS;
 	} else {
@@ -1848,7 +1847,7 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv)
 	ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid);
 	ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid);
 
-	if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) {
+	if (cma_zero_addr((struct sockaddr *) &id_priv->id.route.addr.src_addr)) {
 		src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr;
 		dst_in = (struct sockaddr_in *)&id_priv->id.route.addr.dst_addr;
 		src_in->sin_family = dst_in->sin_family;
@@ -1897,7 +1896,7 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
 	if (cma_any_addr(dst_addr))
 		ret = cma_resolve_loopback(id_priv);
 	else
-		ret = rdma_resolve_ip(&addr_client, &id->route.addr.src_addr,
+		ret = rdma_resolve_ip(&addr_client, (struct sockaddr *) &id->route.addr.src_addr,
 				      dst_addr, &id->route.addr.dev_addr,
 				      timeout_ms, addr_handler, id_priv);
 	if (ret)
@@ -2021,11 +2020,11 @@ static int cma_use_port(struct idr *ps, struct rdma_id_private *id_priv)
 	 * We don't support binding to any address if anyone is bound to
 	 * a specific address on the same port.
 	 */
-	if (cma_any_addr(&id_priv->id.route.addr.src_addr))
+	if (cma_any_addr((struct sockaddr *) &id_priv->id.route.addr.src_addr))
 		return -EADDRNOTAVAIL;
 
 	hlist_for_each_entry(cur_id, node, &bind_list->owners, node) {
-		if (cma_any_addr(&cur_id->id.route.addr.src_addr))
+		if (cma_any_addr((struct sockaddr *) &cur_id->id.route.addr.src_addr))
 			return -EADDRNOTAVAIL;
 
 		cur_sin = (struct sockaddr_in *) &cur_id->id.route.addr.src_addr;
@@ -2060,7 +2059,7 @@ static int cma_get_port(struct rdma_id_private *id_priv)
 	}
 
 	mutex_lock(&lock);
-	if (cma_any_port(&id_priv->id.route.addr.src_addr))
+	if (cma_any_port((struct sockaddr *) &id_priv->id.route.addr.src_addr))
 		ret = cma_alloc_any_port(ps, id_priv);
 	else
 		ret = cma_use_port(ps, id_priv);
@@ -2232,7 +2231,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
 
 	req.path = route->path_rec;
 	req.service_id = cma_get_service_id(id_priv->id.ps,
-					    &route->addr.dst_addr);
+					    (struct sockaddr *) &route->addr.dst_addr);
 	req.timeout_ms = 1 << (CMA_CM_RESPONSE_TIMEOUT - 8);
 	req.max_cm_retries = CMA_MAX_CM_RETRIES;
 
@@ -2283,7 +2282,7 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
 		req.alternate_path = &route->path_rec[1];
 
 	req.service_id = cma_get_service_id(id_priv->id.ps,
-					    &route->addr.dst_addr);
+					    (struct sockaddr *) &route->addr.dst_addr);
 	req.qp_num = id_priv->qp_num;
 	req.qp_type = IB_QPT_RC;
 	req.starting_psn = id_priv->seq_num;
@@ -2667,7 +2666,7 @@ static int cma_join_ib_multicast(struct rdma_id_private *id_priv,
 	if (ret)
 		return ret;
 
-	cma_set_mgid(id_priv, &mc->addr, &rec.mgid);
+	cma_set_mgid(id_priv, (struct sockaddr *) &mc->addr, &rec.mgid);
 	if (id_priv->id.ps == RDMA_PS_UDP)
 		rec.qkey = cpu_to_be32(RDMA_UDP_QKEY);
 	ib_addr_get_sgid(dev_addr, &rec.port_gid);
diff --git a/drivers/infiniband/core/mad_rmpp.c b/drivers/infiniband/core/mad_rmpp.c
index d0ef7d6..3af2b84 100644
--- a/drivers/infiniband/core/mad_rmpp.c
+++ b/drivers/infiniband/core/mad_rmpp.c
@@ -133,7 +133,7 @@ static void ack_recv(struct mad_rmpp_recv *rmpp_recv,
 	msg = ib_create_send_mad(&rmpp_recv->agent->agent, recv_wc->wc->src_qp,
 				 recv_wc->wc->pkey_index, 1, hdr_len,
 				 0, GFP_KERNEL);
-	if (!msg)
+	if (IS_ERR(msg))
 		return;
 
 	format_ack(msg, (struct ib_rmpp_mad *) recv_wc->recv_buf.mad, rmpp_recv);
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
index b41dd26..3ddacf3 100644
--- a/drivers/infiniband/core/ucma.c
+++ b/drivers/infiniband/core/ucma.c
@@ -81,9 +81,7 @@ struct ucma_multicast {
 
 	u64			uid;
 	struct list_head	list;
-	struct sockaddr		addr;
-	u8			pad[sizeof(struct sockaddr_in6) -
-				    sizeof(struct sockaddr)];
+	struct sockaddr_storage	addr;
 };
 
 struct ucma_event {
@@ -603,11 +601,11 @@ static ssize_t ucma_query_route(struct ucma_file *file,
 		return PTR_ERR(ctx);
 
 	memset(&resp, 0, sizeof resp);
-	addr = &ctx->cm_id->route.addr.src_addr;
+	addr = (struct sockaddr *) &ctx->cm_id->route.addr.src_addr;
 	memcpy(&resp.src_addr, addr, addr->sa_family == AF_INET ?
 				     sizeof(struct sockaddr_in) :
 				     sizeof(struct sockaddr_in6));
-	addr = &ctx->cm_id->route.addr.dst_addr;
+	addr = (struct sockaddr *) &ctx->cm_id->route.addr.dst_addr;
 	memcpy(&resp.dst_addr, addr, addr->sa_family == AF_INET ?
 				     sizeof(struct sockaddr_in) :
 				     sizeof(struct sockaddr_in6));
@@ -913,7 +911,7 @@ static ssize_t ucma_join_multicast(struct ucma_file *file,
 
 	mc->uid = cmd.uid;
 	memcpy(&mc->addr, &cmd.addr, sizeof cmd.addr);
-	ret = rdma_join_multicast(ctx->cm_id, &mc->addr, mc);
+	ret = rdma_join_multicast(ctx->cm_id, (struct sockaddr *) &mc->addr, mc);
 	if (ret)
 		goto err2;
 
@@ -929,7 +927,7 @@ static ssize_t ucma_join_multicast(struct ucma_file *file,
 	return 0;
 
 err3:
-	rdma_leave_multicast(ctx->cm_id, &mc->addr);
+	rdma_leave_multicast(ctx->cm_id, (struct sockaddr *) &mc->addr);
 	ucma_cleanup_mc_events(mc);
 err2:
 	mutex_lock(&mut);
@@ -975,7 +973,7 @@ static ssize_t ucma_leave_multicast(struct ucma_file *file,
 		goto out;
 	}
 
-	rdma_leave_multicast(mc->ctx->cm_id, &mc->addr);
+	rdma_leave_multicast(mc->ctx->cm_id, (struct sockaddr *) &mc->addr);
 	mutex_lock(&mc->ctx->file->mut);
 	ucma_cleanup_mc_events(mc);
 	list_del(&mc->list);
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
index f6d5747..4dcf08b 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c
@@ -725,9 +725,9 @@ static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry,
 				V_TPT_STAG_TYPE(type) | V_TPT_PDID(pdid));
 		BUG_ON(page_size >= 28);
 		tpt.flags_pagesize_qpid = cpu_to_be32(V_TPT_PERM(perm) |
-				F_TPT_MW_BIND_ENABLE |
-				V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) |
-				V_TPT_PAGE_SIZE(page_size));
+			((perm & TPT_MW_BIND) ? F_TPT_MW_BIND_ENABLE : 0) |
+			V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) |
+			V_TPT_PAGE_SIZE(page_size));
 		tpt.rsvd_pbl_addr = reset_tpt_entry ? 0 :
 				    cpu_to_be32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, pbl_addr)>>3));
 		tpt.len = cpu_to_be32(len);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index b89640a..eb778bf 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -1187,28 +1187,6 @@ static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
 	return sprintf(buf, "%d\n", iwch_dev->rdev.t3cdev_p->type);
 }
 
-static int fw_supports_fastreg(struct iwch_dev *iwch_dev)
-{
-	struct ethtool_drvinfo info;
-	struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev;
-	char *cp, *next;
-	unsigned fw_maj, fw_min;
-
-	rtnl_lock();
-	lldev->ethtool_ops->get_drvinfo(lldev, &info);
-	rtnl_unlock();
-
-	next = info.fw_version+1;
-	cp = strsep(&next, ".");
-	sscanf(cp, "%i", &fw_maj);
-	cp = strsep(&next, ".");
-	sscanf(cp, "%i", &fw_min);
-
-	PDBG("%s maj %u min %u\n", __func__, fw_maj, fw_min);
-
-	return fw_maj > 6 || (fw_maj == 6 && fw_min > 0);
-}
-
 static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, char *buf)
 {
 	struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev,
@@ -1325,12 +1303,12 @@ int iwch_register_device(struct iwch_dev *dev)
 	memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
 	memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);
 	dev->ibdev.owner = THIS_MODULE;
-	dev->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_WINDOW;
+	dev->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY |
+				IB_DEVICE_MEM_WINDOW |
+				IB_DEVICE_MEM_MGT_EXTENSIONS;
 
 	/* cxgb3 supports STag 0. */
 	dev->ibdev.local_dma_lkey = 0;
-	if (fw_supports_fastreg(dev))
-		dev->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS;
 
 	dev->ibdev.uverbs_cmd_mask =
 	    (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h
index f5ceca0..a237d49 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.h
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.h
@@ -293,9 +293,16 @@ static inline u32 iwch_ib_to_tpt_access(int acc)
 	return (acc & IB_ACCESS_REMOTE_WRITE ? TPT_REMOTE_WRITE : 0) |
 	       (acc & IB_ACCESS_REMOTE_READ ? TPT_REMOTE_READ : 0) |
 	       (acc & IB_ACCESS_LOCAL_WRITE ? TPT_LOCAL_WRITE : 0) |
+	       (acc & IB_ACCESS_MW_BIND ? TPT_MW_BIND : 0) |
 	       TPT_LOCAL_READ;
 }
 
+static inline u32 iwch_ib_to_tpt_bind_access(int acc)
+{
+	return (acc & IB_ACCESS_REMOTE_WRITE ? TPT_REMOTE_WRITE : 0) |
+	       (acc & IB_ACCESS_REMOTE_READ ? TPT_REMOTE_READ : 0);
+}
+
 enum iwch_mmid_state {
 	IWCH_STAG_STATE_VALID,
 	IWCH_STAG_STATE_INVALID
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 9a3be3a..3e4585c 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -565,7 +565,7 @@ int iwch_bind_mw(struct ib_qp *qp,
 	wqe->bind.type = TPT_VATO;
 
 	/* TBD: check perms */
-	wqe->bind.perms = iwch_ib_to_tpt_access(mw_bind->mw_access_flags);
+	wqe->bind.perms = iwch_ib_to_tpt_bind_access(mw_bind->mw_access_flags);
 	wqe->bind.mr_stag = cpu_to_be32(mw_bind->mr->lkey);
 	wqe->bind.mw_stag = cpu_to_be32(mw->rkey);
 	wqe->bind.mw_len = cpu_to_be32(mw_bind->length);
@@ -879,20 +879,13 @@ static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp,
 		(qhp->attr.mpa_attr.xmit_marker_enabled << 1) |
 		(qhp->attr.mpa_attr.crc_enabled << 2);
 
-	/*
-	 * XXX - The IWCM doesn't quite handle getting these
-	 * attrs set before going into RTS.  For now, just turn
-	 * them on always...
-	 */
-#if 0
-	init_attr.qpcaps = qhp->attr.enableRdmaRead |
-		(qhp->attr.enableRdmaWrite << 1) |
-		(qhp->attr.enableBind << 2) |
-		(qhp->attr.enable_stag0_fastreg << 3) |
-		(qhp->attr.enable_stag0_fastreg << 4);
-#else
-	init_attr.qpcaps = 0x1f;
-#endif
+	init_attr.qpcaps = uP_RI_QP_RDMA_READ_ENABLE |
+			   uP_RI_QP_RDMA_WRITE_ENABLE |
+			   uP_RI_QP_BIND_ENABLE;
+	if (!qhp->ibqp.uobject)
+		init_attr.qpcaps |= uP_RI_QP_STAG0_ENABLE |
+				    uP_RI_QP_FAST_REGISTER_ENABLE;
+
 	init_attr.tcp_emss = qhp->ep->emss;
 	init_attr.ord = qhp->attr.max_ord;
 	init_attr.ird = qhp->attr.max_ird;
@@ -900,8 +893,6 @@ static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp,
 	init_attr.qp_dma_size = (1UL << qhp->wq.size_log2);
 	init_attr.rqe_count = iwch_rqes_posted(qhp);
 	init_attr.flags = qhp->attr.mpa_attr.initiator ? MPA_INITIATOR : 0;
-	if (!qhp->ibqp.uobject)
-		init_attr.flags |= PRIV_QP;
 	if (peer2peer) {
 		init_attr.rtr_type = RTR_READ;
 		if (init_attr.ord == 0 && qhp->attr.mpa_attr.initiator)
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index daad09a..ad0aab6 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -1259,7 +1259,7 @@ reloop:
 			 */
 			ipath_cdbg(ERRPKT, "Error Pkt, but no eflags! egrbuf"
 				  " %x, len %x hdrq+%x rhf: %Lx\n",
-				  etail, tlen, l,
+				  etail, tlen, l, (unsigned long long)
 				  le64_to_cpu(*(__le64 *) rhf_addr));
 			if (ipath_debug & __IPATH_ERRPKTDBG) {
 				u32 j, *d, dw = rsize-2;
@@ -1457,7 +1457,8 @@ static void ipath_reset_availshadow(struct ipath_devdata *dd)
 			0xaaaaaaaaaaaaaaaaULL); /* All BUSY bits in qword */
 		if (oldval != dd->ipath_pioavailshadow[i])
 			ipath_dbg("shadow[%d] was %Lx, now %lx\n",
-				i, oldval, dd->ipath_pioavailshadow[i]);
+				i, (unsigned long long) oldval,
+				dd->ipath_pioavailshadow[i]);
 	}
 	spin_unlock_irqrestore(&ipath_pioavail_lock, flags);
 }
diff --git a/drivers/infiniband/hw/ipath/ipath_iba7220.c b/drivers/infiniband/hw/ipath/ipath_iba7220.c
index fb70712..85b2cd0 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba7220.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba7220.c
@@ -1032,7 +1032,7 @@ static int ipath_7220_bringup_serdes(struct ipath_devdata *dd)
 	ipath_cdbg(VERBOSE, "done: xgxs=%llx from %llx\n",
 		   (unsigned long long)
 		   ipath_read_kreg64(dd, dd->ipath_kregs->kr_xgxsconfig),
-		   prev_val);
+		   (unsigned long long) prev_val);
 
 	guid = be64_to_cpu(dd->ipath_guid);
 
@@ -1042,7 +1042,8 @@ static int ipath_7220_bringup_serdes(struct ipath_devdata *dd)
 		ipath_dbg("No GUID for heartbeat, faking %llx\n",
 			(unsigned long long)guid);
 	} else
-		ipath_cdbg(VERBOSE, "Wrote %llX to HRTBT_GUID\n", guid);
+		ipath_cdbg(VERBOSE, "Wrote %llX to HRTBT_GUID\n",
+			(unsigned long long) guid);
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_hrtbt_guid, guid);
 	return ret;
 }
@@ -2505,7 +2506,7 @@ done:
 	if (dd->ipath_flags & IPATH_IB_AUTONEG_INPROG) {
 		ipath_dbg("Did not get to DDR INIT (%x) after %Lu msecs\n",
 			ipath_ib_state(dd, dd->ipath_lastibcstat),
-			jiffies_to_msecs(jiffies)-startms);
+			(unsigned long long) jiffies_to_msecs(jiffies)-startms);
 		dd->ipath_flags &= ~IPATH_IB_AUTONEG_INPROG;
 		if (dd->ipath_autoneg_tries == IPATH_AUTONEG_TRIES) {
 			dd->ipath_flags |= IPATH_IB_AUTONEG_FAILED;
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c
index 26900b3..6c21b4b 100644
--- a/drivers/infiniband/hw/ipath/ipath_intr.c
+++ b/drivers/infiniband/hw/ipath/ipath_intr.c
@@ -356,9 +356,10 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd,
 			dd->ipath_cregs->cr_iblinkerrrecovcnt);
 		if (linkrecov != dd->ipath_lastlinkrecov) {
 			ipath_dbg("IB linkrecov up %Lx (%s %s) recov %Lu\n",
-				ibcs, ib_linkstate(dd, ibcs),
+				(unsigned long long) ibcs,
+				ib_linkstate(dd, ibcs),
 				ipath_ibcstatus_str[ltstate],
-				linkrecov);
+				(unsigned long long) linkrecov);
 			/* and no more until active again */
 			dd->ipath_lastlinkrecov = 0;
 			ipath_set_linkstate(dd, IPATH_IB_LINKDOWN);
@@ -1118,9 +1119,11 @@ irqreturn_t ipath_intr(int irq, void *data)
 	if (unlikely(istat & ~dd->ipath_i_bitsextant))
 		ipath_dev_err(dd,
 			      "interrupt with unknown interrupts %Lx set\n",
+			      (unsigned long long)
 			      istat & ~dd->ipath_i_bitsextant);
 	else if (istat & ~INFINIPATH_I_ERROR) /* errors do own printing */
-		ipath_cdbg(VERBOSE, "intr stat=0x%Lx\n", istat);
+		ipath_cdbg(VERBOSE, "intr stat=0x%Lx\n",
+			(unsigned long long) istat);
 
 	if (istat & INFINIPATH_I_ERROR) {
 		ipath_stats.sps_errints++;
@@ -1128,7 +1131,8 @@ irqreturn_t ipath_intr(int irq, void *data)
 					  dd->ipath_kregs->kr_errorstatus);
 		if (!estat)
 			dev_info(&dd->pcidev->dev, "error interrupt (%Lx), "
-				 "but no error bits set!\n", istat);
+				 "but no error bits set!\n",
+				 (unsigned long long) istat);
 		else if (estat == -1LL)
 			/*
 			 * should we try clearing all, or hope next read
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
index 55c7188..b766e40 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
@@ -1021,7 +1021,7 @@ static void sdma_complete(void *cookie, int status)
 	struct ipath_verbs_txreq *tx = cookie;
 	struct ipath_qp *qp = tx->qp;
 	struct ipath_ibdev *dev = to_idev(qp->ibqp.device);
-	unsigned int flags;
+	unsigned long flags;
 	enum ib_wc_status ibs = status == IPATH_SDMA_TXREQ_S_OK ?
 		IB_WC_SUCCESS : IB_WC_WR_FLUSH_ERR;
 
@@ -1051,7 +1051,7 @@ static void sdma_complete(void *cookie, int status)
 
 static void decrement_dma_busy(struct ipath_qp *qp)
 {
-	unsigned int flags;
+	unsigned long flags;
 
 	if (atomic_dec_and_test(&qp->s_dma_busy)) {
 		spin_lock_irqsave(&qp->s_lock, flags);
@@ -1221,7 +1221,7 @@ static int ipath_verbs_send_pio(struct ipath_qp *qp,
 	unsigned flush_wc;
 	u32 control;
 	int ret;
-	unsigned int flags;
+	unsigned long flags;
 
 	piobuf = ipath_getpiobuf(dd, plen, NULL);
 	if (unlikely(piobuf == NULL)) {
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index a146457..d0866a3 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -515,17 +515,17 @@ static void mlx4_ib_handle_error_cqe(struct mlx4_err_cqe *cqe,
 	wc->vendor_err = cqe->vendor_err_syndrome;
 }
 
-static int mlx4_ib_ipoib_csum_ok(__be32 status, __be16 checksum)
+static int mlx4_ib_ipoib_csum_ok(__be16 status, __be16 checksum)
 {
-	return ((status & cpu_to_be32(MLX4_CQE_IPOIB_STATUS_IPV4	|
-				      MLX4_CQE_IPOIB_STATUS_IPV4F	|
-				      MLX4_CQE_IPOIB_STATUS_IPV4OPT	|
-				      MLX4_CQE_IPOIB_STATUS_IPV6	|
-				      MLX4_CQE_IPOIB_STATUS_IPOK)) ==
-		cpu_to_be32(MLX4_CQE_IPOIB_STATUS_IPV4	|
-			    MLX4_CQE_IPOIB_STATUS_IPOK))		&&
-		(status & cpu_to_be32(MLX4_CQE_IPOIB_STATUS_UDP	|
-				      MLX4_CQE_IPOIB_STATUS_TCP))	&&
+	return ((status & cpu_to_be16(MLX4_CQE_STATUS_IPV4      |
+				      MLX4_CQE_STATUS_IPV4F     |
+				      MLX4_CQE_STATUS_IPV4OPT   |
+				      MLX4_CQE_STATUS_IPV6      |
+				      MLX4_CQE_STATUS_IPOK)) ==
+		cpu_to_be16(MLX4_CQE_STATUS_IPV4        |
+			    MLX4_CQE_STATUS_IPOK))              &&
+		(status & cpu_to_be16(MLX4_CQE_STATUS_UDP       |
+				      MLX4_CQE_STATUS_TCP))     &&
 		checksum == cpu_to_be16(0xffff);
 }
 
@@ -582,17 +582,17 @@ repoll:
 	}
 
 	if (!*cur_qp ||
-	    (be32_to_cpu(cqe->my_qpn) & 0xffffff) != (*cur_qp)->mqp.qpn) {
+	    (be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK) != (*cur_qp)->mqp.qpn) {
 		/*
 		 * We do not have to take the QP table lock here,
 		 * because CQs will be locked while QPs are removed
 		 * from the table.
 		 */
 		mqp = __mlx4_qp_lookup(to_mdev(cq->ibcq.device)->dev,
-				       be32_to_cpu(cqe->my_qpn));
+				       be32_to_cpu(cqe->vlan_my_qpn));
 		if (unlikely(!mqp)) {
 			printk(KERN_WARNING "CQ %06x with entry for unknown QPN %06x\n",
-			       cq->mcq.cqn, be32_to_cpu(cqe->my_qpn) & 0xffffff);
+			       cq->mcq.cqn, be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK);
 			return -EINVAL;
 		}
 
@@ -692,14 +692,13 @@ repoll:
 		}
 
 		wc->slid	   = be16_to_cpu(cqe->rlid);
-		wc->sl		   = cqe->sl >> 4;
+		wc->sl		   = be16_to_cpu(cqe->sl_vid >> 12);
 		g_mlpath_rqpn	   = be32_to_cpu(cqe->g_mlpath_rqpn);
 		wc->src_qp	   = g_mlpath_rqpn & 0xffffff;
 		wc->dlid_path_bits = (g_mlpath_rqpn >> 24) & 0x7f;
 		wc->wc_flags	  |= g_mlpath_rqpn & 0x80000000 ? IB_WC_GRH : 0;
 		wc->pkey_index     = be32_to_cpu(cqe->immed_rss_invalid) & 0x7f;
-		wc->csum_ok	   = mlx4_ib_ipoib_csum_ok(cqe->ipoib_status,
-							   cqe->checksum);
+		wc->csum_ok	   = mlx4_ib_ipoib_csum_ok(cqe->status, cqe->checksum);
 	}
 
 	return 0;
@@ -767,7 +766,7 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq)
 	 */
 	while ((int) --prod_index - (int) cq->mcq.cons_index >= 0) {
 		cqe = get_cqe(cq, prod_index & cq->ibcq.cqe);
-		if ((be32_to_cpu(cqe->my_qpn) & 0xffffff) == qpn) {
+		if ((be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK) == qpn) {
 			if (srq && !(cqe->owner_sr_opcode & MLX4_CQE_IS_SEND_MASK))
 				mlx4_ib_free_srq_wqe(srq, be16_to_cpu(cqe->wqe_index));
 			++nfreed;
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index f7bc7dd..f29dbb7 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -902,7 +902,7 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 			context->mtu_msgmax = (IB_MTU_4096 << 5) |
 					      ilog2(dev->dev->caps.max_gso_sz);
 		else
-			context->mtu_msgmax = (IB_MTU_4096 << 5) | 11;
+			context->mtu_msgmax = (IB_MTU_4096 << 5) | 12;
 	} else if (attr_mask & IB_QP_PATH_MTU) {
 		if (attr->path_mtu < IB_MTU_256 || attr->path_mtu > IB_MTU_4096) {
 			printk(KERN_ERR "path MTU (%u) is invalid\n",
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 0f2d304..7ebc400 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -337,7 +337,7 @@ static void ipoib_cm_init_rx_wr(struct net_device *dev,
 		sge[i].length = PAGE_SIZE;
 
 	wr->next    = NULL;
-	wr->sg_list = priv->cm.rx_sge;
+	wr->sg_list = sge;
 	wr->num_sge = priv->cm.num_frags;
 }
 
diff --git a/include/linux/mlx4/cq.h b/include/linux/mlx4/cq.h
index 071cf96..6f65b2c 100644
--- a/include/linux/mlx4/cq.h
+++ b/include/linux/mlx4/cq.h
@@ -39,17 +39,18 @@
 #include <linux/mlx4/doorbell.h>
 
 struct mlx4_cqe {
-	__be32			my_qpn;
+	__be32			vlan_my_qpn;
 	__be32			immed_rss_invalid;
 	__be32			g_mlpath_rqpn;
-	u8			sl;
-	u8			reserved1;
+	__be16			sl_vid;
 	__be16			rlid;
-	__be32			ipoib_status;
+	__be16			status;
+	u8			ipv6_ext_mask;
+	u8			badfcs_enc;
 	__be32			byte_cnt;
 	__be16			wqe_index;
 	__be16			checksum;
-	u8			reserved2[3];
+	u8			reserved[3];
 	u8			owner_sr_opcode;
 };
 
@@ -64,6 +65,11 @@ struct mlx4_err_cqe {
 };
 
 enum {
+	MLX4_CQE_VLAN_PRESENT_MASK	= 1 << 29,
+	MLX4_CQE_QPN_MASK		= 0xffffff,
+};
+
+enum {
 	MLX4_CQE_OWNER_MASK	= 0x80,
 	MLX4_CQE_IS_SEND_MASK	= 0x40,
 	MLX4_CQE_OPCODE_MASK	= 0x1f
@@ -86,13 +92,19 @@ enum {
 };
 
 enum {
-	MLX4_CQE_IPOIB_STATUS_IPV4			= 1 << 22,
-	MLX4_CQE_IPOIB_STATUS_IPV4F			= 1 << 23,
-	MLX4_CQE_IPOIB_STATUS_IPV6			= 1 << 24,
-	MLX4_CQE_IPOIB_STATUS_IPV4OPT			= 1 << 25,
-	MLX4_CQE_IPOIB_STATUS_TCP			= 1 << 26,
-	MLX4_CQE_IPOIB_STATUS_UDP			= 1 << 27,
-	MLX4_CQE_IPOIB_STATUS_IPOK			= 1 << 28,
+	MLX4_CQE_STATUS_IPV4		= 1 << 6,
+	MLX4_CQE_STATUS_IPV4F		= 1 << 7,
+	MLX4_CQE_STATUS_IPV6		= 1 << 8,
+	MLX4_CQE_STATUS_IPV4OPT		= 1 << 9,
+	MLX4_CQE_STATUS_TCP		= 1 << 10,
+	MLX4_CQE_STATUS_UDP		= 1 << 11,
+	MLX4_CQE_STATUS_IPOK		= 1 << 12,
+};
+
+enum {
+	MLX4_CQE_LLC                     = 1,
+	MLX4_CQE_SNAP                    = 1 << 1,
+	MLX4_CQE_BAD_FCS                 = 1 << 4,
 };
 
 static inline void mlx4_cq_arm(struct mlx4_cq *cq, u32 cmd,
diff --git a/include/rdma/rdma_cm.h b/include/rdma/rdma_cm.h
index df7faf0..c6b2962 100644
--- a/include/rdma/rdma_cm.h
+++ b/include/rdma/rdma_cm.h
@@ -71,12 +71,8 @@ enum rdma_port_space {
 };
 
 struct rdma_addr {
-	struct sockaddr src_addr;
-	u8		src_pad[sizeof(struct sockaddr_in6) -
-				sizeof(struct sockaddr)];
-	struct sockaddr dst_addr;
-	u8		dst_pad[sizeof(struct sockaddr_in6) -
-				sizeof(struct sockaddr)];
+	struct sockaddr_storage src_addr;
+	struct sockaddr_storage dst_addr;
 	struct rdma_dev_addr dev_addr;
 };
 

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

* [GIT PULL] please pull infiniband.git
@ 2008-07-26 21:02 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-07-26 21:02 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the some last RDMA/InfiniBand changes for 2.6.27.  The
only major thing is changes to the iw_nes connection setup handling,
which fix problems with lots of connections:

Faisal Latif (1):
      RDMA/nes: CM connection setup/teardown rework

Jack Morgenstein (1):
      mlx4: Update/add Mellanox Technologies copyright lines to mlx4 driver files

Roland Dreier (5):
      RDMA/ucma: BKL is not needed for ucma_open()
      RDMA/ucm: BKL is not needed for ib_ucm_open()
      IPoIB/cm: Connected mode is no longer EXPERIMENTAL
      IPoIB: Correct help text for INFINIBAND_IPOIB_DEBUG
      Merge branches 'bkl-removal', 'ipoib', 'mlx4' and 'nes' into for-linus

Yevgeny Petrilin (1):
      mlx4_core: Add VLAN tag field to WQE control segment struct

 drivers/infiniband/core/ucm.c         |   10 +-
 drivers/infiniband/core/ucma.c        |   11 +-
 drivers/infiniband/hw/mlx4/cq.c       |    1 +
 drivers/infiniband/hw/mlx4/main.c     |    1 +
 drivers/infiniband/hw/mlx4/mlx4_ib.h  |    1 +
 drivers/infiniband/hw/mlx4/mr.c       |    1 +
 drivers/infiniband/hw/mlx4/qp.c       |    1 +
 drivers/infiniband/hw/mlx4/srq.c      |    1 +
 drivers/infiniband/hw/mlx4/user.h     |    1 +
 drivers/infiniband/hw/nes/nes.c       |    4 +-
 drivers/infiniband/hw/nes/nes_cm.c    | 2034 ++++++++++++++++++---------------
 drivers/infiniband/hw/nes/nes_cm.h    |   23 +-
 drivers/infiniband/hw/nes/nes_hw.c    |    9 -
 drivers/infiniband/hw/nes/nes_verbs.c |   15 -
 drivers/infiniband/ulp/ipoib/Kconfig  |   22 +-
 drivers/net/mlx4/alloc.c              |    1 +
 drivers/net/mlx4/catas.c              |    1 +
 drivers/net/mlx4/cmd.c                |    2 +-
 drivers/net/mlx4/cq.c                 |    2 +-
 drivers/net/mlx4/eq.c                 |    2 +-
 drivers/net/mlx4/fw.c                 |    2 +-
 drivers/net/mlx4/fw.h                 |    2 +-
 drivers/net/mlx4/icm.c                |    2 +-
 drivers/net/mlx4/icm.h                |    2 +-
 drivers/net/mlx4/intf.c               |    1 +
 drivers/net/mlx4/main.c               |    2 +-
 drivers/net/mlx4/mcg.c                |    1 +
 drivers/net/mlx4/mlx4.h               |    2 +-
 drivers/net/mlx4/mr.c                 |    2 +-
 drivers/net/mlx4/qp.c                 |    2 +-
 drivers/net/mlx4/reset.c              |    1 +
 drivers/net/mlx4/srq.c                |    1 +
 include/linux/mlx4/qp.h               |    4 +-
 33 files changed, 1211 insertions(+), 956 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-07-24 15:41 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-07-24 15:41 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the some more RDMA/InfiniBand changes for 2.6.27, all of
which have been in linux-next:

Amir Vadai (1):
      RDMA/cma: Add RDMA_CM_EVENT_TIMEWAIT_EXIT event

Dotan Barak (1):
      RDMA/iwcm: Remove IB_ACCESS_LOCAL_WRITE from remote QP attributes

Jack Morgenstein (2):
      mlx4_core: Add module parameter to enable QoS support
      mlx4_code: Add missing FW status return code

Joachim Fenkes (2):
      IB/ehca: Filter PATH_MIG events if QP was never armed
      IB/ehca: Use default value for Local CA ACK Delay if FW returns 0

Julia Lawall (1):
      IB/ehca: Release mutex in error path of alloc_small_queue_page()

Or Gerlitz (3):
      RDMA/cma: Add RDMA_CM_EVENT_ADDR_CHANGE event
      IB/iser: Add support for RDMA_CM_EVENT_ADDR_CHANGE event
      IPoIB: Include err code in trace message for ib_sa_path_rec_get() failures

Ralph Campbell (1):
      IB/sa_query: Check if sm_ah is NULL in ib_sa_remove_one()

Roland Dreier (7):
      IB/mlx4: Rename struct mlx4_lso_seg to mlx4_wqe_lso_seg
      mlx4_core: Keep free count for MTT buddy allocator
      IB/mthca: Keep free count for MTT buddy allocator
      IB/mlx4: Add support for memory management extensions and local DMA L_Key
      mlx4_core: Improve error message when not enough UAR pages are available
      MAINTAINERS: Remove Glenn Streiff from NetEffect entry
      Merge branches 'bkl-removal', 'cma', 'ehca', 'for-2.6.27', 'mlx4', 'mthca' and 'nes' into for-linus

 MAINTAINERS                               |    2 -
 drivers/infiniband/core/cma.c             |   99 ++++++++++++++++++++++++++++-
 drivers/infiniband/core/iwcm.c            |    3 +-
 drivers/infiniband/core/sa_query.c        |    3 +-
 drivers/infiniband/hw/ehca/ehca_classes.h |    1 +
 drivers/infiniband/hw/ehca/ehca_hca.c     |    4 +-
 drivers/infiniband/hw/ehca/ehca_irq.c     |    4 +
 drivers/infiniband/hw/ehca/ehca_qp.c      |    2 +
 drivers/infiniband/hw/ehca/ipz_pt_fn.c    |    1 +
 drivers/infiniband/hw/mlx4/cq.c           |   12 ++++
 drivers/infiniband/hw/mlx4/main.c         |   11 +++
 drivers/infiniband/hw/mlx4/mlx4_ib.h      |   15 +++++
 drivers/infiniband/hw/mlx4/mr.c           |   70 ++++++++++++++++++++
 drivers/infiniband/hw/mlx4/qp.c           |   74 ++++++++++++++++++++--
 drivers/infiniband/hw/mthca/mthca_dev.h   |    1 +
 drivers/infiniband/hw/mthca/mthca_mr.c    |   26 +++++---
 drivers/infiniband/ulp/ipoib/ipoib_main.c |    2 +-
 drivers/infiniband/ulp/iser/iser_verbs.c  |    1 +
 drivers/net/mlx4/cmd.c                    |    3 +
 drivers/net/mlx4/fw.c                     |   18 +++--
 drivers/net/mlx4/fw.h                     |    2 +-
 drivers/net/mlx4/main.c                   |    2 +
 drivers/net/mlx4/mlx4.h                   |    1 +
 drivers/net/mlx4/mr.c                     |   49 +++++++++++----
 drivers/net/mlx4/pd.c                     |    7 ++
 include/linux/mlx4/device.h               |   10 +++
 include/linux/mlx4/qp.h                   |   18 ++++--
 include/rdma/rdma_cm.h                    |    4 +-
 28 files changed, 396 insertions(+), 49 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-07-15  6:51 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-07-15  6:51 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first big batch of RDMA/InfiniBand changes for
2.6.27, all of which have been in linux-next:

Christophe Jaillet (1):
      RDMA/nes: Remove unnecessary memset()

Dotan Barak (1):
      RDMA: Improve include file coding style

Eli Cohen (12):
      IB/mlx4: Optimize QP stamping
      IPoIB: Copy small received SKBs in connected mode
      IB/mlx4: Configure QPs' max message size based on real device capability
      IB/mlx4: Pass congestion management class MADs to the HCA
      IPoIB: Remove unused IPOIB_MCAST_STARTED code
      IPoIB: Remove priv->mcast_mutex
      IPoIB: Only set Q_Key once: after joining broadcast group
      IPoIB: Use rtnl lock/unlock when changing device flags
      IPoIB: Use dev_set_mtu() to change mtu
      IPoIB/cm: Reduce connected mode TX object size
      IPoIB: Double default RX/TX ring sizes
      IB/mlx4: Use kzalloc() for new QPs so flags are initialized to 0

Joachim Fenkes (2):
      IB/ehca: Reject receive work requests if QP is in RESET state
      IB/ehca: Make device table externally visible

Jon Mason (1):
      RDMA/cxgb3: Propagate HW page size capabilities

Moni Shoua (2):
      IB/sa: Fail requests made while creating new SM AH
      IPoIB: Refresh paths instead of flushing them on SM change events

Or Gerlitz (2):
      RDMA/addr: Keep pointer to netdevice in struct rdma_dev_addr
      RDMA/cma: Simplify locking needed for serialization of callbacks

Ralph Campbell (2):
      IB/core: Reset to error QP state transition is not allowed
      IB/ipath: Use IEEE OUI for vendor_id reported by ibv_query_device()

Robert P. J. Day (1):
      IB/ipath: Simplify code using ARRAY_SIZE() macro

Roland Dreier (13):
      IB/srp: Remove use of cached P_Key/GID queries
      RDMA: Remove subversion $Id tags
      IB/mthca: Remove extra code for RESET->ERR QP state transition
      IB/mlx4: Remove extra code for RESET->ERR QP state transition
      RDMA/cxgb3: Remove write-only iwch_rnic_attributes fields
      RDMA/cma: Add missing newlines to printk()s
      IPoIB/cm: Fix racy use of receive WR/SGL in ipoib_cm_post_receive_nonsrq()
      RDMA/nes: Encapsulate logic nes_put_cqp_request()
      RDMA/nes: Get rid of ring_doorbell parameter of nes_post_cqp_request()
      IPoIB: Get rid of ipoib_mcast_detach() wrapper
      IB/mthca: Remove "stop" flag for catastrophic error polling timer
      IB/mthca: Use round_jiffies() for catastrophic error polling timer
      IB/mthca: Fix check of max_send_sge for special QPs

Ron Livne (3):
      IB/core: Add support for multicast loopback blocking
      IB/mlx4: Add support for blocking multicast loopback packets
      IPoIB: Use multicast loopback blocking if available

Sean Hefty (1):
      RDMA: Fix license text

Stefan Roscher (1):
      IB/ehca: In case of lost interrupts, trigger EOI to reenable interrupts

Steve Wise (8):
      RDMA/core: Add memory management extensions support
      RDMA/cxgb3: MEM_MGT_EXTENSIONS support
      RDMA/cxgb3: Fix up some ib_device_attr fields
      RDMA/core: Add iWARP protocol statistics attributes in sysfs
      RDMA/cxgb3: Add support for protocol statistics
      RDMA/cxgb3: Set rkey field for new memory windows in iwch_alloc_mw()
      RDMA/core: Add local DMA L_Key support
      RDMA/cxgb3: Fixes for zero STag

Vladimir Sokolovsky (2):
      IPoIB: add LRO support
      mlx4_core: Use MOD_STAT_CFG command to get minimal page size

 drivers/infiniband/core/addr.c                 |   42 +++--
 drivers/infiniband/core/agent.h                |    2 -
 drivers/infiniband/core/cache.c                |    2 -
 drivers/infiniband/core/cm.c                   |    2 -
 drivers/infiniband/core/cma.c                  |  162 ++++++++--------
 drivers/infiniband/core/core_priv.h            |    2 -
 drivers/infiniband/core/device.c               |    2 -
 drivers/infiniband/core/fmr_pool.c             |    2 -
 drivers/infiniband/core/mad_priv.h             |    2 -
 drivers/infiniband/core/mad_rmpp.c             |    2 -
 drivers/infiniband/core/mad_rmpp.h             |    2 -
 drivers/infiniband/core/packer.c               |    2 -
 drivers/infiniband/core/sa_query.c             |   24 ++-
 drivers/infiniband/core/sysfs.c                |  122 +++++++++++-
 drivers/infiniband/core/ucm.c                  |    2 -
 drivers/infiniband/core/ud_header.c            |    2 -
 drivers/infiniband/core/umem.c                 |    2 -
 drivers/infiniband/core/user_mad.c             |    2 -
 drivers/infiniband/core/uverbs.h               |    2 -
 drivers/infiniband/core/uverbs_cmd.c           |    4 +-
 drivers/infiniband/core/uverbs_main.c          |    2 -
 drivers/infiniband/core/verbs.c                |   49 ++++-
 drivers/infiniband/hw/amso1100/c2_rnic.c       |    2 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |   27 ++-
 drivers/infiniband/hw/cxgb3/cxio_hal.h         |    5 +-
 drivers/infiniband/hw/cxgb3/cxio_wr.h          |  103 ++++++++--
 drivers/infiniband/hw/cxgb3/iwch.c             |    8 +-
 drivers/infiniband/hw/cxgb3/iwch.h             |    2 -
 drivers/infiniband/hw/cxgb3/iwch_cq.c          |   15 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |  199 +++++++++++++++++-
 drivers/infiniband/hw/cxgb3/iwch_provider.h    |    8 -
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |  261 ++++++++++++++++++------
 drivers/infiniband/hw/ehca/ehca_irq.c          |    9 +-
 drivers/infiniband/hw/ehca/ehca_main.c         |    1 +
 drivers/infiniband/hw/ehca/ehca_reqs.c         |   14 +-
 drivers/infiniband/hw/ehca/hcp_if.c            |   10 +
 drivers/infiniband/hw/ehca/hcp_if.h            |    1 +
 drivers/infiniband/hw/ipath/ipath_cq.c         |    2 +-
 drivers/infiniband/hw/ipath/ipath_iba7220.c    |    4 +-
 drivers/infiniband/hw/ipath/ipath_mad.c        |    6 +-
 drivers/infiniband/hw/ipath/ipath_rc.c         |    4 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c        |    4 +-
 drivers/infiniband/hw/ipath/ipath_uc.c         |    8 +-
 drivers/infiniband/hw/ipath/ipath_ud.c         |    8 +-
 drivers/infiniband/hw/ipath/ipath_verbs.c      |    3 +-
 drivers/infiniband/hw/mlx4/cq.c                |   12 +-
 drivers/infiniband/hw/mlx4/mad.c               |    3 +-
 drivers/infiniband/hw/mlx4/main.c              |    7 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h           |    3 +-
 drivers/infiniband/hw/mlx4/qp.c                |   73 +++----
 drivers/infiniband/hw/mthca/mthca_allocator.c  |    2 -
 drivers/infiniband/hw/mthca/mthca_av.c         |    2 -
 drivers/infiniband/hw/mthca/mthca_catas.c      |   17 +--
 drivers/infiniband/hw/mthca/mthca_cmd.c        |    2 -
 drivers/infiniband/hw/mthca/mthca_cmd.h        |    2 -
 drivers/infiniband/hw/mthca/mthca_config_reg.h |    2 -
 drivers/infiniband/hw/mthca/mthca_cq.c         |    6 +-
 drivers/infiniband/hw/mthca/mthca_dev.h        |    3 -
 drivers/infiniband/hw/mthca/mthca_doorbell.h   |    2 -
 drivers/infiniband/hw/mthca/mthca_eq.c         |    2 -
 drivers/infiniband/hw/mthca/mthca_mad.c        |    2 -
 drivers/infiniband/hw/mthca/mthca_main.c       |    2 -
 drivers/infiniband/hw/mthca/mthca_mcg.c        |    2 -
 drivers/infiniband/hw/mthca/mthca_memfree.c    |    2 -
 drivers/infiniband/hw/mthca/mthca_memfree.h    |    2 -
 drivers/infiniband/hw/mthca/mthca_mr.c         |    2 -
 drivers/infiniband/hw/mthca/mthca_pd.c         |    2 -
 drivers/infiniband/hw/mthca/mthca_profile.c    |    2 -
 drivers/infiniband/hw/mthca/mthca_profile.h    |    2 -
 drivers/infiniband/hw/mthca/mthca_provider.c   |    2 -
 drivers/infiniband/hw/mthca/mthca_provider.h   |    2 -
 drivers/infiniband/hw/mthca/mthca_qp.c         |   32 +---
 drivers/infiniband/hw/mthca/mthca_reset.c      |    2 -
 drivers/infiniband/hw/mthca/mthca_srq.c        |    2 -
 drivers/infiniband/hw/mthca/mthca_uar.c        |    2 -
 drivers/infiniband/hw/mthca/mthca_user.h       |    1 -
 drivers/infiniband/hw/mthca/mthca_wqe.h        |    2 -
 drivers/infiniband/hw/nes/nes.c                |    2 +-
 drivers/infiniband/hw/nes/nes.h                |    9 +-
 drivers/infiniband/hw/nes/nes_cm.c             |    1 -
 drivers/infiniband/hw/nes/nes_hw.c             |   68 +-----
 drivers/infiniband/hw/nes/nes_hw.h             |    2 +-
 drivers/infiniband/hw/nes/nes_utils.c          |   33 +++-
 drivers/infiniband/hw/nes/nes_verbs.c          |  207 ++++---------------
 drivers/infiniband/ulp/ipoib/Kconfig           |    1 +
 drivers/infiniband/ulp/ipoib/ipoib.h           |   48 ++++--
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |  104 +++++++---
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c   |   46 ++++
 drivers/infiniband/ulp/ipoib/ipoib_fs.c        |    2 -
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |   52 +++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |  115 ++++++++++-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   27 +--
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |   69 +++----
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c      |    2 -
 drivers/infiniband/ulp/iser/iscsi_iser.c       |    3 -
 drivers/infiniband/ulp/iser/iscsi_iser.h       |    2 -
 drivers/infiniband/ulp/iser/iser_initiator.c   |    2 -
 drivers/infiniband/ulp/iser/iser_memory.c      |    2 -
 drivers/infiniband/ulp/iser/iser_verbs.c       |    2 -
 drivers/infiniband/ulp/srp/ib_srp.c            |   15 +-
 drivers/infiniband/ulp/srp/ib_srp.h            |    2 -
 drivers/net/cxgb3/cxgb3_ctl_defs.h             |    1 +
 drivers/net/cxgb3/cxgb3_offload.c              |    7 +
 drivers/net/cxgb3/version.h                    |    2 +-
 drivers/net/mlx4/fw.c                          |   28 +++
 drivers/net/mlx4/fw.h                          |    6 +
 drivers/net/mlx4/main.c                        |    7 +
 drivers/net/mlx4/mcg.c                         |   17 ++-
 include/linux/mlx4/device.h                    |    3 +-
 include/rdma/ib_addr.h                         |   43 +++--
 include/rdma/ib_cache.h                        |    2 -
 include/rdma/ib_cm.h                           |    2 -
 include/rdma/ib_fmr_pool.h                     |    4 +-
 include/rdma/ib_mad.h                          |   17 +-
 include/rdma/ib_pack.h                         |    2 -
 include/rdma/ib_sa.h                           |    2 -
 include/rdma/ib_smi.h                          |    4 +-
 include/rdma/ib_user_cm.h                      |    2 -
 include/rdma/ib_user_mad.h                     |    2 -
 include/rdma/ib_user_verbs.h                   |    7 +-
 include/rdma/ib_verbs.h                        |  149 +++++++++++++-
 include/rdma/iw_cm.h                           |    2 +-
 include/rdma/rdma_cm.h                         |   52 +++---
 include/rdma/rdma_cm_ib.h                      |   50 +++--
 124 files changed, 1632 insertions(+), 935 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-07-08 21:41 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-07-08 21:41 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel, steve

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fix for one regression introduced earlier in the
2.6.26 cycle:

Steve Wise (1):
      RDMA/cxgb3: Fix regression caused by class_device -> device conversion

 drivers/infiniband/hw/cxgb3/iwch_provider.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index 8934178..95f82cf 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -1096,7 +1096,9 @@ static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, ch
 	struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev;
 
 	PDBG("%s dev 0x%p\n", __func__, dev);
+	rtnl_lock();
 	lldev->ethtool_ops->get_drvinfo(lldev, &info);
+	rtnl_unlock();
 	return sprintf(buf, "%s\n", info.fw_version);
 }
 
@@ -1109,7 +1111,9 @@ static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
 	struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev;
 
 	PDBG("%s dev 0x%p\n", __func__, dev);
+	rtnl_lock();
 	lldev->ethtool_ops->get_drvinfo(lldev, &info);
+	rtnl_unlock();
 	return sprintf(buf, "%s\n", info.driver);
 }
 

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

* [GIT PULL] please pull infiniband.git
@ 2008-06-23 19:23 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-06-23 19:23 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fix for one rare bug seen by SGI on large clusters:

Eli Cohen (1):
      IB/mthca: Clear ICM pages before handing to FW

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

diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c
index b224079..d5862e5 100644
--- a/drivers/infiniband/hw/mthca/mthca_memfree.c
+++ b/drivers/infiniband/hw/mthca/mthca_memfree.c
@@ -109,7 +109,11 @@ static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_m
 {
 	struct page *page;
 
-	page = alloc_pages(gfp_mask, order);
+	/*
+	 * Use __GFP_ZERO because buggy firmware assumes ICM pages are
+	 * cleared, and subtle failures are seen if they aren't.
+	 */
+	page = alloc_pages(gfp_mask | __GFP_ZERO, order);
 	if (!page)
 		return -ENOMEM;
 

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

* [GIT PULL] please pull infiniband.git
@ 2008-06-18 22:38 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-06-18 22:38 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a couple of small fixes:

Jack Morgenstein (1):
      IB/uverbs: Fix check of is_closed flag check in ib_uverbs_async_handler()

Roland Dreier (1):
      RDMA/nes: Fix off-by-one in nes_reg_user_mr() error path

 drivers/infiniband/core/uverbs_main.c |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c |    4 +---
 2 files changed, 2 insertions(+), 4 deletions(-)


diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index f806da1..caed42b 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -423,7 +423,7 @@ static void ib_uverbs_async_handler(struct ib_uverbs_file *file,
 	unsigned long flags;
 
 	spin_lock_irqsave(&file->async_file->lock, flags);
-	if (!file->async_file->is_closed) {
+	if (file->async_file->is_closed) {
 		spin_unlock_irqrestore(&file->async_file->lock, flags);
 		return;
 	}
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index 99b3c4a..d617da9 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -2456,10 +2456,8 @@ static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 						if ((page_count!=0)&&(page_count<<12)-(region->offset&(4096-1))>=region->length)
 							goto enough_pages;
 						if ((page_count&0x01FF) == 0) {
-							if (page_count>(1024*512)) {
+							if (page_count >= 1024 * 512) {
 								ib_umem_release(region);
-								pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
-										vpbl.pbl_pbase);
 								nes_free_resource(nesadapter,
 										nesadapter->allocated_mrs, stag_index);
 								kfree(nesmr);

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

* [GIT PULL] please pull infiniband.git
@ 2008-06-09 20:10 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-06-09 20:10 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fix for a crash/lockup triggerable by buggy userspace
(that I already sent you as a patch via email), and remove one API
that only appeared in 2.6.26-rc kernels and that we decided should be
exposed in a different way (already queued for 2.6.27 in linux-next).

Roland Dreier (2):
      IB/umem: Avoid sign problems when demoting npages to integer
      IB/core: Remove IB_DEVICE_SEND_W_INV capability flag

 drivers/infiniband/core/umem.c           |    2 +-
 drivers/infiniband/hw/amso1100/c2_rnic.c |    3 +--
 include/rdma/ib_verbs.h                  |    1 -
 3 files changed, 2 insertions(+), 4 deletions(-)


diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
index fe78f7d..a1768db 100644
--- a/drivers/infiniband/core/umem.c
+++ b/drivers/infiniband/core/umem.c
@@ -150,7 +150,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
 	ret = 0;
 	while (npages) {
 		ret = get_user_pages(current, current->mm, cur_base,
-				     min_t(int, npages,
+				     min_t(unsigned long, npages,
 					   PAGE_SIZE / sizeof (struct page *)),
 				     1, !umem->writable, page_list, vma_list);
 
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index 9a054c6..b1441ae 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -455,8 +455,7 @@ int __devinit c2_rnic_init(struct c2_dev *c2dev)
 	     IB_DEVICE_CURR_QP_STATE_MOD |
 	     IB_DEVICE_SYS_IMAGE_GUID |
 	     IB_DEVICE_ZERO_STAG |
-	     IB_DEVICE_MEM_WINDOW |
-	     IB_DEVICE_SEND_W_INV);
+	     IB_DEVICE_MEM_WINDOW);
 
 	/* Allocate the qptr_array */
 	c2dev->qptr_array = vmalloc(C2_MAX_CQS * sizeof(void *));
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 911a661..31d30b1 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -105,7 +105,6 @@ enum ib_device_cap_flags {
 	 */
 	IB_DEVICE_UD_IP_CSUM		= (1<<18),
 	IB_DEVICE_UD_TSO		= (1<<19),
-	IB_DEVICE_SEND_W_INV		= (1<<21),
 };
 
 enum ib_atomic_cap {

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

* [GIT PULL] please pull infiniband.git
@ 2008-06-06 18:26 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-06-06 18:26 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get some small fixes for various low-level driver issues:

Chien Tung (1):
      MAINTAINERS: Update NetEffect (iw_nes) entry

Joachim Fenkes (1):
      IB/ehca: Reject send WRs only for RESET, INIT and RTR state

Ralph Campbell (2):
      IB/ipath: Fix device capability flags
      IB/ipath: Fix SM trap forwarding

Roland Dreier (1):
      IB/ipath: Avoid test_bit() on u64 SDMA status value

 MAINTAINERS                                |    4 ++--
 drivers/infiniband/hw/ehca/ehca_reqs.c     |    6 ++++--
 drivers/infiniband/hw/ipath/ipath_kernel.h |    5 +++++
 drivers/infiniband/hw/ipath/ipath_mad.c    |    4 ++++
 drivers/infiniband/hw/ipath/ipath_sdma.c   |   12 ++++--------
 drivers/infiniband/hw/ipath/ipath_verbs.c  |    3 ++-
 6 files changed, 21 insertions(+), 13 deletions(-)


diff --git a/MAINTAINERS b/MAINTAINERS
index 0a6d2ca..bd3badb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2866,8 +2866,8 @@ S:	Maintained
 NETEFFECT IWARP RNIC DRIVER (IW_NES)
 P:	Faisal Latif
 M:	flatif@neteffect.com
-P:	Nishi Gupta
-M:	ngupta@neteffect.com
+P:	Chien Tung
+M:	ctung@neteffect.com
 P:	Glenn Streiff
 M:	gstreiff@neteffect.com
 L:	general@lists.openfabrics.org
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;
 	}
 
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index 59a8b25..0bd8bcb 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -232,6 +232,11 @@ struct ipath_sdma_desc {
 #define IPATH_SDMA_TXREQ_S_ABORTED   2
 #define IPATH_SDMA_TXREQ_S_SHUTDOWN  3
 
+#define IPATH_SDMA_STATUS_SCORE_BOARD_DRAIN_IN_PROG	(1ull << 63)
+#define IPATH_SDMA_STATUS_ABORT_IN_PROG			(1ull << 62)
+#define IPATH_SDMA_STATUS_INTERNAL_SDMA_ENABLE		(1ull << 61)
+#define IPATH_SDMA_STATUS_SCB_EMPTY			(1ull << 30)
+
 /* max dwords in small buffer packet */
 #define IPATH_SMALLBUF_DWORDS (dd->ipath_piosize2k >> 2)
 
diff --git a/drivers/infiniband/hw/ipath/ipath_mad.c b/drivers/infiniband/hw/ipath/ipath_mad.c
index 1ff46ae..5f9315d 100644
--- a/drivers/infiniband/hw/ipath/ipath_mad.c
+++ b/drivers/infiniband/hw/ipath/ipath_mad.c
@@ -1492,6 +1492,10 @@ static int process_subn(struct ib_device *ibdev, int mad_flags,
 			goto bail;
 		}
 
+	case IB_MGMT_METHOD_TRAP:
+	case IB_MGMT_METHOD_REPORT:
+	case IB_MGMT_METHOD_REPORT_RESP:
+	case IB_MGMT_METHOD_TRAP_REPRESS:
 	case IB_MGMT_METHOD_GET_RESP:
 		/*
 		 * The ib_mad module will call us to process responses
diff --git a/drivers/infiniband/hw/ipath/ipath_sdma.c b/drivers/infiniband/hw/ipath/ipath_sdma.c
index 0a8c1b8..eaba032 100644
--- a/drivers/infiniband/hw/ipath/ipath_sdma.c
+++ b/drivers/infiniband/hw/ipath/ipath_sdma.c
@@ -263,14 +263,10 @@ static void sdma_abort_task(unsigned long opaque)
 		hwstatus = ipath_read_kreg64(dd,
 				dd->ipath_kregs->kr_senddmastatus);
 
-		if (/* ScoreBoardDrainInProg */
-		    test_bit(63, &hwstatus) ||
-		    /* AbortInProg */
-		    test_bit(62, &hwstatus) ||
-		    /* InternalSDmaEnable */
-		    test_bit(61, &hwstatus) ||
-		    /* ScbEmpty */
-		    !test_bit(30, &hwstatus)) {
+		if ((hwstatus & (IPATH_SDMA_STATUS_SCORE_BOARD_DRAIN_IN_PROG |
+				 IPATH_SDMA_STATUS_ABORT_IN_PROG	     |
+				 IPATH_SDMA_STATUS_INTERNAL_SDMA_ENABLE)) ||
+		    !(hwstatus & IPATH_SDMA_STATUS_SCB_EMPTY)) {
 			if (dd->ipath_sdma_reset_wait > 0) {
 				/* not done shutting down sdma */
 				--dd->ipath_sdma_reset_wait;
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
index e0ec540..7779165 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
@@ -1494,7 +1494,8 @@ static int ipath_query_device(struct ib_device *ibdev,
 
 	props->device_cap_flags = IB_DEVICE_BAD_PKEY_CNTR |
 		IB_DEVICE_BAD_QKEY_CNTR | IB_DEVICE_SHUTDOWN_PORT |
-		IB_DEVICE_SYS_IMAGE_GUID;
+		IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_RC_RNR_NAK_GEN |
+		IB_DEVICE_PORT_ACTIVE_EVENT | IB_DEVICE_SRQ_RESIZE;
 	props->page_size_cap = PAGE_SIZE;
 	props->vendor_id = dev->dd->ipath_vendorid;
 	props->vendor_part_id = dev->dd->ipath_deviceid;

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

* [GIT PULL] please pull infiniband.git
@ 2008-05-23 17:57 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-05-23 17:57 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fixes for various issues:

 - Various trivial fixes that get rid of warnings
 - A couple of oopsable bugs fixed
 - Fixes for mthca/mlx4 driver bugs that stop NFS/RDMA from working
 - MAINTAINERS entry for Chelsio drivers

Andrew Morton (1):
      IB/mlx4: Fix uninitialized-var warning in mlx4_ib_post_send()

Dave Olson (1):
      IB/mad: Fix kernel crash when .process_mad() returns SUCCESS|CONSUMED

Jack Morgenstein (1):
      IPoIB: Test for NULL broadcast object in ipiob_mcast_join_finish()

Ralph Campbell (1):
      IB/ipath: Fix UC receive completion opcode for RDMA WRITE with immediate

Roland Dreier (4):
      IB/ipath: Fix printk format for ipath_sdma_status
      RDMA/cxgb3: Fix uninitialized variable warning in iwch_post_send()
      IB/mthca: Fix max_sge value returned by query_device
      IB/mlx4: Fix creation of kernel QP with max number of send s/g entries

Steve Wise (1):
      MAINTAINERS: Add cxgb3 and iw_cxgb3 NIC and iWARP driver entries

 MAINTAINERS                                    |   14 ++++++++++++++
 drivers/infiniband/core/mad.c                  |    4 +++-
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |    2 +-
 drivers/infiniband/hw/ipath/ipath_sdma.c       |    4 ++--
 drivers/infiniband/hw/ipath/ipath_uc.c         |    4 ++--
 drivers/infiniband/hw/mlx4/qp.c                |   15 +++++++++------
 drivers/infiniband/hw/mthca/mthca_main.c       |   14 +++++++++++++-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    6 ++++++
 8 files changed, 50 insertions(+), 13 deletions(-)


diff --git a/MAINTAINERS b/MAINTAINERS
index bc1c008..907d8c4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1239,6 +1239,20 @@ L:	video4linux-list@redhat.com
 W:	http://linuxtv.org
 S:	Maintained
 
+CXGB3 ETHERNET DRIVER (CXGB3)
+P:	Divy Le Ray
+M:	divy@chelsio.com
+L:	netdev@vger.kernel.org
+W:	http://www.chelsio.com
+S:	Supported
+
+CXGB3 IWARP RNIC DRIVER (IW_CXGB3)
+P:	Steve Wise
+M:	swise@chelsio.com
+L:	general@lists.openfabrics.org
+W:	http://www.openfabrics.org
+S:	Supported
+
 CYBERPRO FB DRIVER
 P:	Russell King
 M:	rmk@arm.linux.org.uk
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index fbe16d5..1adf2ef 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -747,7 +747,9 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
 		break;
 	case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED:
 		kmem_cache_free(ib_mad_cache, mad_priv);
-		break;
+		kfree(local);
+		ret = 1;
+		goto out;
 	case IB_MAD_RESULT_SUCCESS:
 		/* Treat like an incoming receive MAD */
 		port_priv = ib_get_mad_port(mad_agent_priv->agent.device,
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 79dbe5b..9926137 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -229,7 +229,7 @@ int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 		      struct ib_send_wr **bad_wr)
 {
 	int err = 0;
-	u8 t3_wr_flit_cnt;
+	u8 uninitialized_var(t3_wr_flit_cnt);
 	enum t3_wr_opcode t3_wr_opcode = 0;
 	enum t3_wr_flags t3_wr_flags;
 	struct iwch_qp *qhp;
diff --git a/drivers/infiniband/hw/ipath/ipath_sdma.c b/drivers/infiniband/hw/ipath/ipath_sdma.c
index 3697449..0a8c1b8 100644
--- a/drivers/infiniband/hw/ipath/ipath_sdma.c
+++ b/drivers/infiniband/hw/ipath/ipath_sdma.c
@@ -345,7 +345,7 @@ resched:
 	 * state change
 	 */
 	if (jiffies > dd->ipath_sdma_abort_jiffies) {
-		ipath_dbg("looping with status 0x%016llx\n",
+		ipath_dbg("looping with status 0x%08lx\n",
 			  dd->ipath_sdma_status);
 		dd->ipath_sdma_abort_jiffies = jiffies + 5 * HZ;
 	}
@@ -615,7 +615,7 @@ void ipath_restart_sdma(struct ipath_devdata *dd)
 	}
 	spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags);
 	if (!needed) {
-		ipath_dbg("invalid attempt to restart SDMA, status 0x%016llx\n",
+		ipath_dbg("invalid attempt to restart SDMA, status 0x%08lx\n",
 			dd->ipath_sdma_status);
 		goto bail;
 	}
diff --git a/drivers/infiniband/hw/ipath/ipath_uc.c b/drivers/infiniband/hw/ipath/ipath_uc.c
index 7fd18e8..0596ec1 100644
--- a/drivers/infiniband/hw/ipath/ipath_uc.c
+++ b/drivers/infiniband/hw/ipath/ipath_uc.c
@@ -407,12 +407,11 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
 			dev->n_pkt_drops++;
 			goto done;
 		}
-		/* XXX Need to free SGEs */
+		wc.opcode = IB_WC_RECV;
 	last_imm:
 		ipath_copy_sge(&qp->r_sge, data, tlen);
 		wc.wr_id = qp->r_wr_id;
 		wc.status = IB_WC_SUCCESS;
-		wc.opcode = IB_WC_RECV;
 		wc.qp = &qp->ibqp;
 		wc.src_qp = qp->remote_qpn;
 		wc.slid = qp->remote_ah_attr.dlid;
@@ -514,6 +513,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
 			goto done;
 		}
 		wc.byte_len = qp->r_len;
+		wc.opcode = IB_WC_RECV_RDMA_WITH_IMM;
 		goto last_imm;
 
 	case OP(RDMA_WRITE_LAST):
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 8e02ecf..a80df22 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -333,6 +333,9 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 		cap->max_inline_data + sizeof (struct mlx4_wqe_inline_seg)) +
 		send_wqe_overhead(type, qp->flags);
 
+	if (s > dev->dev->caps.max_sq_desc_sz)
+		return -EINVAL;
+
 	/*
 	 * Hermon supports shrinking WQEs, such that a single work
 	 * request can include multiple units of 1 << wqe_shift.  This
@@ -372,9 +375,6 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 		qp->sq.wqe_shift = ilog2(roundup_pow_of_two(s));
 
 	for (;;) {
-		if (1 << qp->sq.wqe_shift > dev->dev->caps.max_sq_desc_sz)
-			return -EINVAL;
-
 		qp->sq_max_wqes_per_wr = DIV_ROUND_UP(s, 1U << qp->sq.wqe_shift);
 
 		/*
@@ -395,7 +395,8 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 		++qp->sq.wqe_shift;
 	}
 
-	qp->sq.max_gs = ((qp->sq_max_wqes_per_wr << qp->sq.wqe_shift) -
+	qp->sq.max_gs = (min(dev->dev->caps.max_sq_desc_sz,
+			     (qp->sq_max_wqes_per_wr << qp->sq.wqe_shift)) -
 			 send_wqe_overhead(type, qp->flags)) /
 		sizeof (struct mlx4_wqe_data_seg);
 
@@ -411,7 +412,9 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 
 	cap->max_send_wr  = qp->sq.max_post =
 		(qp->sq.wqe_cnt - qp->sq_spare_wqes) / qp->sq_max_wqes_per_wr;
-	cap->max_send_sge = qp->sq.max_gs;
+	cap->max_send_sge = min(qp->sq.max_gs,
+				min(dev->dev->caps.max_sq_sg,
+				    dev->dev->caps.max_rq_sg));
 	/* We don't support inline sends for kernel QPs (yet) */
 	cap->max_inline_data = 0;
 
@@ -1457,7 +1460,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 	unsigned ind;
 	int uninitialized_var(stamp);
 	int uninitialized_var(size);
-	unsigned seglen;
+	unsigned uninitialized_var(seglen);
 	int i;
 
 	spin_lock_irqsave(&qp->sq.lock, flags);
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c
index 9ebadd6..200cf13 100644
--- a/drivers/infiniband/hw/mthca/mthca_main.c
+++ b/drivers/infiniband/hw/mthca/mthca_main.c
@@ -45,6 +45,7 @@
 #include "mthca_cmd.h"
 #include "mthca_profile.h"
 #include "mthca_memfree.h"
+#include "mthca_wqe.h"
 
 MODULE_AUTHOR("Roland Dreier");
 MODULE_DESCRIPTION("Mellanox InfiniBand HCA low-level driver");
@@ -200,7 +201,18 @@ static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
 	mdev->limits.gid_table_len  	= dev_lim->max_gids;
 	mdev->limits.pkey_table_len 	= dev_lim->max_pkeys;
 	mdev->limits.local_ca_ack_delay = dev_lim->local_ca_ack_delay;
-	mdev->limits.max_sg             = dev_lim->max_sg;
+	/*
+	 * Need to allow for worst case send WQE overhead and check
+	 * whether max_desc_sz imposes a lower limit than max_sg; UD
+	 * send has the biggest overhead.
+	 */
+	mdev->limits.max_sg		= min_t(int, dev_lim->max_sg,
+					      (dev_lim->max_desc_sz -
+					       sizeof (struct mthca_next_seg) -
+					       (mthca_is_memfree(mdev) ?
+						sizeof (struct mthca_arbel_ud_seg) :
+						sizeof (struct mthca_tavor_ud_seg))) /
+						sizeof (struct mthca_data_seg));
 	mdev->limits.max_wqes           = dev_lim->max_qp_sz;
 	mdev->limits.max_qp_init_rdma   = dev_lim->max_requester_per_qp;
 	mdev->limits.reserved_qps       = dev_lim->reserved_qps;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index d00a2c1..3f663fb 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -194,7 +194,13 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
 	/* Set the cached Q_Key before we attach if it's the broadcast group */
 	if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4,
 		    sizeof (union ib_gid))) {
+		spin_lock_irq(&priv->lock);
+		if (!priv->broadcast) {
+			spin_unlock_irq(&priv->lock);
+			return -EAGAIN;
+		}
 		priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey);
+		spin_unlock_irq(&priv->lock);
 		priv->tx_wr.wr.ud.remote_qkey = priv->qkey;
 	}
 

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

* [GIT PULL] please pull infiniband.git
@ 2008-05-07 19:17 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-05-07 19:17 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fixes for various low-level HW driver issues:

 - cxgb3 severe limits on memory registration size
 - ehca QP async event race
 - ipath miscellaneous issues

Dave Olson (2):
      IB/ipath: Fix bug that can leave sends disabled after freeze recovery
      IB/ipath: Need to always request and handle PIO avail interrupts

John Gregor (1):
      IB/ipath: Fix SDMA error recovery in absence of link status change

Michael Albaugh (2):
      IB/ipath: Only warn about prototype chip during init
      IB/ipath: Fix count of packets received by kernel

Ralph Campbell (2):
      IB/ipath: Only increment SSN if WQE is put on send queue
      IB/ipath: Return the correct opcode for RDMA WRITE with immediate

Roland Dreier (2):
      RDMA/cxgb3: Don't add PBL memory to gen_pool in chunks
      RDMA/cxgb3: Fix severe limit on userspace memory registration size

Stefan Roscher (1):
      IB/ehca: Wait for async events to finish before destroying QP

 drivers/infiniband/hw/cxgb3/cxio_hal.c        |   90 ++++++++--------
 drivers/infiniband/hw/cxgb3/cxio_hal.h        |    8 +-
 drivers/infiniband/hw/cxgb3/cxio_resource.c   |   36 +++++--
 drivers/infiniband/hw/cxgb3/iwch_mem.c        |   75 +++++++++-----
 drivers/infiniband/hw/cxgb3/iwch_provider.c   |   68 ++++++++++---
 drivers/infiniband/hw/cxgb3/iwch_provider.h   |    8 +-
 drivers/infiniband/hw/ehca/ehca_classes.h     |    2 +
 drivers/infiniband/hw/ehca/ehca_irq.c         |    4 +
 drivers/infiniband/hw/ehca/ehca_qp.c          |    5 +
 drivers/infiniband/hw/ipath/ipath_driver.c    |  138 ++++++++++++++++++++++---
 drivers/infiniband/hw/ipath/ipath_file_ops.c  |   72 ++++++--------
 drivers/infiniband/hw/ipath/ipath_iba7220.c   |   26 ++---
 drivers/infiniband/hw/ipath/ipath_init_chip.c |   95 ++++++++----------
 drivers/infiniband/hw/ipath/ipath_intr.c      |   80 ++------------
 drivers/infiniband/hw/ipath/ipath_kernel.h    |    8 ++-
 drivers/infiniband/hw/ipath/ipath_rc.c        |    6 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c       |    7 +-
 drivers/infiniband/hw/ipath/ipath_sdma.c      |   44 ++++++--
 drivers/infiniband/hw/ipath/ipath_verbs.c     |    2 +-
 19 files changed, 458 insertions(+), 316 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-05-05 23:00 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-05-05 23:00 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fixes for:

 - mlx4 breakage introduced (by me) with the CQ resize support
 - mlx4 breakage with new FW that supports smaller adapter pages
 - IPoIB breakage introduced with the separate send CQ support
 - longstanding cxgb3 breakage uncovered by stress testing
 - ehca minor messiness

Eli Cohen (1):
      IB/ipoib: Fix transmit queue stalling forever

Oren Duer (1):
      mlx4_core: Support creation of FMRs with pages smaller than 4K

Roland Dreier (1):
      IB/mlx4: Fix off-by-one errors in calls to mlx4_ib_free_cq_buf()

Stefan Roscher (1):
      IB/ehca: Fix function return types

Steve Wise (3):
      RDMA/cxgb3: QP flush fixes
      RDMA/cxgb3: Silently ignore close reply after abort.
      RDMA/cxgb3: Bump up the MPA connection setup timeout.

 drivers/infiniband/hw/cxgb3/cxio_hal.c     |   13 ++++++--
 drivers/infiniband/hw/cxgb3/cxio_hal.h     |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c      |    6 ++--
 drivers/infiniband/hw/cxgb3/iwch_qp.c      |   13 +++++---
 drivers/infiniband/hw/ehca/ehca_hca.c      |    7 ++--
 drivers/infiniband/hw/mlx4/cq.c            |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib.h       |    2 +
 drivers/infiniband/ulp/ipoib/ipoib_ib.c    |   47 +++++++++++++++++++++++++---
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c |    3 +-
 drivers/net/mlx4/mr.c                      |    2 +-
 10 files changed, 75 insertions(+), 26 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
index ed2ee4b..5fd8506 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c
@@ -359,9 +359,10 @@ static void insert_recv_cqe(struct t3_wq *wq, struct t3_cq *cq)
 	cq->sw_wptr++;
 }
 
-void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count)
+int cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count)
 {
 	u32 ptr;
+	int flushed = 0;
 
 	PDBG("%s wq %p cq %p\n", __func__, wq, cq);
 
@@ -369,8 +370,11 @@ void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count)
 	PDBG("%s rq_rptr %u rq_wptr %u skip count %u\n", __func__,
 	    wq->rq_rptr, wq->rq_wptr, count);
 	ptr = wq->rq_rptr + count;
-	while (ptr++ != wq->rq_wptr)
+	while (ptr++ != wq->rq_wptr) {
 		insert_recv_cqe(wq, cq);
+		flushed++;
+	}
+	return flushed;
 }
 
 static void insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq,
@@ -394,9 +398,10 @@ static void insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq,
 	cq->sw_wptr++;
 }
 
-void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count)
+int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count)
 {
 	__u32 ptr;
+	int flushed = 0;
 	struct t3_swsq *sqp = wq->sq + Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2);
 
 	ptr = wq->sq_rptr + count;
@@ -405,7 +410,9 @@ void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count)
 		insert_sq_cqe(wq, cq, sqp);
 		sqp++;
 		ptr++;
+		flushed++;
 	}
+	return flushed;
 }
 
 /*
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h
index 2bcff7f..69ab08e 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.h
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.h
@@ -173,8 +173,8 @@ u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp);
 void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid);
 int __init cxio_hal_init(void);
 void __exit cxio_hal_exit(void);
-void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count);
-void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count);
+int cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count);
+int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count);
 void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count);
 void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count);
 void cxio_flush_hw_cq(struct t3_cq *cq);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index d44a6df..c325c44 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -67,10 +67,10 @@ int peer2peer = 0;
 module_param(peer2peer, int, 0644);
 MODULE_PARM_DESC(peer2peer, "Support peer2peer ULPs (default=0)");
 
-static int ep_timeout_secs = 10;
+static int ep_timeout_secs = 60;
 module_param(ep_timeout_secs, int, 0644);
 MODULE_PARM_DESC(ep_timeout_secs, "CM Endpoint operation timeout "
-				   "in seconds (default=10)");
+				   "in seconds (default=60)");
 
 static int mpa_rev = 1;
 module_param(mpa_rev, int, 0644);
@@ -1650,8 +1650,8 @@ static int close_con_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 		release = 1;
 		break;
 	case ABORTING:
-		break;
 	case DEAD:
+		break;
 	default:
 		BUG_ON(1);
 		break;
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 9b4be88..79dbe5b 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -655,6 +655,7 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag)
 {
 	struct iwch_cq *rchp, *schp;
 	int count;
+	int flushed;
 
 	rchp = get_chp(qhp->rhp, qhp->attr.rcq);
 	schp = get_chp(qhp->rhp, qhp->attr.scq);
@@ -669,20 +670,22 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag)
 	spin_lock(&qhp->lock);
 	cxio_flush_hw_cq(&rchp->cq);
 	cxio_count_rcqes(&rchp->cq, &qhp->wq, &count);
-	cxio_flush_rq(&qhp->wq, &rchp->cq, count);
+	flushed = cxio_flush_rq(&qhp->wq, &rchp->cq, count);
 	spin_unlock(&qhp->lock);
 	spin_unlock_irqrestore(&rchp->lock, *flag);
-	(*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context);
+	if (flushed)
+		(*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context);
 
 	/* locking heirarchy: cq lock first, then qp lock. */
 	spin_lock_irqsave(&schp->lock, *flag);
 	spin_lock(&qhp->lock);
 	cxio_flush_hw_cq(&schp->cq);
 	cxio_count_scqes(&schp->cq, &qhp->wq, &count);
-	cxio_flush_sq(&qhp->wq, &schp->cq, count);
+	flushed = cxio_flush_sq(&qhp->wq, &schp->cq, count);
 	spin_unlock(&qhp->lock);
 	spin_unlock_irqrestore(&schp->lock, *flag);
-	(*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context);
+	if (flushed)
+		(*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context);
 
 	/* deref */
 	if (atomic_dec_and_test(&qhp->refcnt))
@@ -880,7 +883,6 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp,
 				ep = qhp->ep;
 				get_ep(&ep->com);
 			}
-			flush_qp(qhp, &flag);
 			break;
 		case IWCH_QP_STATE_TERMINATE:
 			qhp->attr.state = IWCH_QP_STATE_TERMINATE;
@@ -911,6 +913,7 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp,
 		}
 		switch (attrs->next_state) {
 			case IWCH_QP_STATE_IDLE:
+				flush_qp(qhp, &flag);
 				qhp->attr.state = IWCH_QP_STATE_IDLE;
 				qhp->attr.llp_stream_handle = NULL;
 				put_ep(&qhp->ep->com);
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
index 2515cbd..bc3b37d 100644
--- a/drivers/infiniband/hw/ehca/ehca_hca.c
+++ b/drivers/infiniband/hw/ehca/ehca_hca.c
@@ -101,7 +101,6 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
 	props->max_ee          = limit_uint(rblock->max_rd_ee_context);
 	props->max_rdd         = limit_uint(rblock->max_rd_domain);
 	props->max_fmr         = limit_uint(rblock->max_mr);
-	props->local_ca_ack_delay  = limit_uint(rblock->local_ca_ack_delay);
 	props->max_qp_rd_atom  = limit_uint(rblock->max_rr_qp);
 	props->max_ee_rd_atom  = limit_uint(rblock->max_rr_ee_context);
 	props->max_res_rd_atom = limit_uint(rblock->max_rr_hca);
@@ -115,7 +114,7 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
 	}
 
 	props->max_pkeys           = 16;
-	props->local_ca_ack_delay  = limit_uint(rblock->local_ca_ack_delay);
+	props->local_ca_ack_delay  = min_t(u8, rblock->local_ca_ack_delay, 255);
 	props->max_raw_ipv6_qp     = limit_uint(rblock->max_raw_ipv6_qp);
 	props->max_raw_ethy_qp     = limit_uint(rblock->max_raw_ethy_qp);
 	props->max_mcast_grp       = limit_uint(rblock->max_mcast_grp);
@@ -136,7 +135,7 @@ query_device1:
 	return ret;
 }
 
-static int map_mtu(struct ehca_shca *shca, u32 fw_mtu)
+static enum ib_mtu map_mtu(struct ehca_shca *shca, u32 fw_mtu)
 {
 	switch (fw_mtu) {
 	case 0x1:
@@ -156,7 +155,7 @@ static int map_mtu(struct ehca_shca *shca, u32 fw_mtu)
 	}
 }
 
-static int map_number_of_vls(struct ehca_shca *shca, u32 vl_cap)
+static u8 map_number_of_vls(struct ehca_shca *shca, u32 vl_cap)
 {
 	switch (vl_cap) {
 	case 0x1:
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 2f199c5..4521319 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -246,7 +246,7 @@ err_mtt:
 	if (context)
 		ib_umem_release(cq->umem);
 	else
-		mlx4_ib_free_cq_buf(dev, &cq->buf, entries);
+		mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe);
 
 err_db:
 	if (!context)
@@ -434,7 +434,7 @@ int mlx4_ib_destroy_cq(struct ib_cq *cq)
 		mlx4_ib_db_unmap_user(to_mucontext(cq->uobject->context), &mcq->db);
 		ib_umem_release(mcq->umem);
 	} else {
-		mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe + 1);
+		mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe);
 		mlx4_db_free(dev->dev, &mcq->db);
 	}
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 9044f88..ca126fc 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -334,6 +334,7 @@ struct ipoib_dev_priv {
 #endif
 	int	hca_caps;
 	struct ipoib_ethtool_st ethtool;
+	struct timer_list poll_timer;
 };
 
 struct ipoib_ah {
@@ -404,6 +405,7 @@ extern struct workqueue_struct *ipoib_workqueue;
 
 int ipoib_poll(struct napi_struct *napi, int budget);
 void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
+void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
 
 struct ipoib_ah *ipoib_create_ah(struct net_device *dev,
 				 struct ib_pd *pd, struct ib_ah_attr *attr);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 97b815c..f429bce 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -461,6 +461,26 @@ void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr)
 	netif_rx_schedule(dev, &priv->napi);
 }
 
+static void drain_tx_cq(struct net_device *dev)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->tx_lock, flags);
+	while (poll_tx(priv))
+		; /* nothing */
+
+	if (netif_queue_stopped(dev))
+		mod_timer(&priv->poll_timer, jiffies + 1);
+
+	spin_unlock_irqrestore(&priv->tx_lock, flags);
+}
+
+void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr)
+{
+	drain_tx_cq((struct net_device *)dev_ptr);
+}
+
 static inline int post_send(struct ipoib_dev_priv *priv,
 			    unsigned int wr_id,
 			    struct ib_ah *address, u32 qpn,
@@ -555,12 +575,22 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
 	else
 		priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
 
+	if (++priv->tx_outstanding == ipoib_sendq_size) {
+		ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
+		if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP))
+			ipoib_warn(priv, "request notify on send CQ failed\n");
+		netif_stop_queue(dev);
+	}
+
 	if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1),
 			       address->ah, qpn, tx_req, phead, hlen))) {
 		ipoib_warn(priv, "post_send failed\n");
 		++dev->stats.tx_errors;
+		--priv->tx_outstanding;
 		ipoib_dma_unmap_tx(priv->ca, tx_req);
 		dev_kfree_skb_any(skb);
+		if (netif_queue_stopped(dev))
+			netif_wake_queue(dev);
 	} else {
 		dev->trans_start = jiffies;
 
@@ -568,14 +598,11 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
 		++priv->tx_head;
 		skb_orphan(skb);
 
-		if (++priv->tx_outstanding == ipoib_sendq_size) {
-			ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
-			netif_stop_queue(dev);
-		}
 	}
 
 	if (unlikely(priv->tx_outstanding > MAX_SEND_CQE))
-		poll_tx(priv);
+		while (poll_tx(priv))
+			; /* nothing */
 }
 
 static void __ipoib_reap_ah(struct net_device *dev)
@@ -609,6 +636,11 @@ void ipoib_reap_ah(struct work_struct *work)
 				   round_jiffies_relative(HZ));
 }
 
+static void ipoib_ib_tx_timer_func(unsigned long ctx)
+{
+	drain_tx_cq((struct net_device *)ctx);
+}
+
 int ipoib_ib_dev_open(struct net_device *dev)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -645,6 +677,10 @@ int ipoib_ib_dev_open(struct net_device *dev)
 	queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task,
 			   round_jiffies_relative(HZ));
 
+	init_timer(&priv->poll_timer);
+	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+	priv->poll_timer.data = (unsigned long)dev;
+
 	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 
 	return 0;
@@ -810,6 +846,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush)
 	ipoib_dbg(priv, "All sends and receives done.\n");
 
 timeout:
+	del_timer_sync(&priv->poll_timer);
 	qp_attr.qp_state = IB_QPS_RESET;
 	if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE))
 		ipoib_warn(priv, "Failed to modify QP to RESET state\n");
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
index c1e7ece..8766d29 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
@@ -187,7 +187,8 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
 		goto out_free_mr;
 	}
 
-	priv->send_cq = ib_create_cq(priv->ca, NULL, NULL, dev, ipoib_sendq_size, 0);
+	priv->send_cq = ib_create_cq(priv->ca, ipoib_send_comp_handler, NULL,
+				     dev, ipoib_sendq_size, 0);
 	if (IS_ERR(priv->send_cq)) {
 		printk(KERN_WARNING "%s: failed to create send CQ\n", ca->name);
 		goto out_free_recv_cq;
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index cb46446..03a9abc 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -551,7 +551,7 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages,
 	u64 mtt_seg;
 	int err = -ENOMEM;
 
-	if (page_shift < 12 || page_shift >= 32)
+	if (page_shift < (ffs(dev->caps.page_size_cap) - 1) || page_shift >= 32)
 		return -EINVAL;
 
 	/* All MTTs must fit in the same page */

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

* [GIT PULL] please pull infiniband.git
@ 2008-05-01  3:46 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-05-01  3:46 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a couple of fixes for medium-impact bugs.  If they can go
into -rc1, great; otherwise the world won't end if they end up in -rc2.

Eli Cohen (1):
      IB/ipoib: Fix transmit queue stalling forever

Roland Dreier (1):
      IB/mlx4: Fix off-by-one errors in calls to mlx4_ib_free_cq_buf()

 drivers/infiniband/hw/mlx4/cq.c            |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib.h       |    2 +
 drivers/infiniband/ulp/ipoib/ipoib_ib.c    |   47 +++++++++++++++++++++++++---
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c |    3 +-
 4 files changed, 48 insertions(+), 8 deletions(-)


diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 2f199c5..4521319 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -246,7 +246,7 @@ err_mtt:
 	if (context)
 		ib_umem_release(cq->umem);
 	else
-		mlx4_ib_free_cq_buf(dev, &cq->buf, entries);
+		mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe);
 
 err_db:
 	if (!context)
@@ -434,7 +434,7 @@ int mlx4_ib_destroy_cq(struct ib_cq *cq)
 		mlx4_ib_db_unmap_user(to_mucontext(cq->uobject->context), &mcq->db);
 		ib_umem_release(mcq->umem);
 	} else {
-		mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe + 1);
+		mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe);
 		mlx4_db_free(dev->dev, &mcq->db);
 	}
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 9044f88..ca126fc 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -334,6 +334,7 @@ struct ipoib_dev_priv {
 #endif
 	int	hca_caps;
 	struct ipoib_ethtool_st ethtool;
+	struct timer_list poll_timer;
 };
 
 struct ipoib_ah {
@@ -404,6 +405,7 @@ extern struct workqueue_struct *ipoib_workqueue;
 
 int ipoib_poll(struct napi_struct *napi, int budget);
 void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
+void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
 
 struct ipoib_ah *ipoib_create_ah(struct net_device *dev,
 				 struct ib_pd *pd, struct ib_ah_attr *attr);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 97b815c..f429bce 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -461,6 +461,26 @@ void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr)
 	netif_rx_schedule(dev, &priv->napi);
 }
 
+static void drain_tx_cq(struct net_device *dev)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->tx_lock, flags);
+	while (poll_tx(priv))
+		; /* nothing */
+
+	if (netif_queue_stopped(dev))
+		mod_timer(&priv->poll_timer, jiffies + 1);
+
+	spin_unlock_irqrestore(&priv->tx_lock, flags);
+}
+
+void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr)
+{
+	drain_tx_cq((struct net_device *)dev_ptr);
+}
+
 static inline int post_send(struct ipoib_dev_priv *priv,
 			    unsigned int wr_id,
 			    struct ib_ah *address, u32 qpn,
@@ -555,12 +575,22 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
 	else
 		priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
 
+	if (++priv->tx_outstanding == ipoib_sendq_size) {
+		ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
+		if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP))
+			ipoib_warn(priv, "request notify on send CQ failed\n");
+		netif_stop_queue(dev);
+	}
+
 	if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1),
 			       address->ah, qpn, tx_req, phead, hlen))) {
 		ipoib_warn(priv, "post_send failed\n");
 		++dev->stats.tx_errors;
+		--priv->tx_outstanding;
 		ipoib_dma_unmap_tx(priv->ca, tx_req);
 		dev_kfree_skb_any(skb);
+		if (netif_queue_stopped(dev))
+			netif_wake_queue(dev);
 	} else {
 		dev->trans_start = jiffies;
 
@@ -568,14 +598,11 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
 		++priv->tx_head;
 		skb_orphan(skb);
 
-		if (++priv->tx_outstanding == ipoib_sendq_size) {
-			ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
-			netif_stop_queue(dev);
-		}
 	}
 
 	if (unlikely(priv->tx_outstanding > MAX_SEND_CQE))
-		poll_tx(priv);
+		while (poll_tx(priv))
+			; /* nothing */
 }
 
 static void __ipoib_reap_ah(struct net_device *dev)
@@ -609,6 +636,11 @@ void ipoib_reap_ah(struct work_struct *work)
 				   round_jiffies_relative(HZ));
 }
 
+static void ipoib_ib_tx_timer_func(unsigned long ctx)
+{
+	drain_tx_cq((struct net_device *)ctx);
+}
+
 int ipoib_ib_dev_open(struct net_device *dev)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -645,6 +677,10 @@ int ipoib_ib_dev_open(struct net_device *dev)
 	queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task,
 			   round_jiffies_relative(HZ));
 
+	init_timer(&priv->poll_timer);
+	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+	priv->poll_timer.data = (unsigned long)dev;
+
 	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 
 	return 0;
@@ -810,6 +846,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush)
 	ipoib_dbg(priv, "All sends and receives done.\n");
 
 timeout:
+	del_timer_sync(&priv->poll_timer);
 	qp_attr.qp_state = IB_QPS_RESET;
 	if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE))
 		ipoib_warn(priv, "Failed to modify QP to RESET state\n");
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
index c1e7ece..8766d29 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
@@ -187,7 +187,8 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
 		goto out_free_mr;
 	}
 
-	priv->send_cq = ib_create_cq(priv->ca, NULL, NULL, dev, ipoib_sendq_size, 0);
+	priv->send_cq = ib_create_cq(priv->ca, ipoib_send_comp_handler, NULL,
+				     dev, ipoib_sendq_size, 0);
 	if (IS_ERR(priv->send_cq)) {
 		printk(KERN_WARNING "%s: failed to create send CQ\n", ca->name);
 		goto out_free_recv_cq;

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

* [GIT PULL] please pull infiniband.git
@ 2008-04-29 20:57 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-04-29 20:57 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a last batch of changes before 2.6.26-rc1:

Eli Cohen (2):
      IPoIB: Use separate CQ for UD send completions
      IPoIB: Copy child MTU from parent

Eli Dorfman (2):
      IB/iser: Move high-volume debug output to higher debug level
      IB/iser: Count FMR alignment violations per session

Eric Schneider (1):
      RDMA/nes: Add support for SFP+ PHY

Faisal Latif (1):
      RDMA/nes: Use LRO

Glenn Streiff (1):
      RDMA/nes: Formatting cleanup

Hoang-Nam Nguyen (1):
      IB/ehca: handle negative return value from ibmebus_request_irq() properly

Olaf Kirch (2):
      mlx4_core: Avoid recycling old FMR R_Keys too soon
      IB/mthca: Avoid recycling old FMR R_Keys too soon

Roland Dreier (1):
      IB/mthca: Avoid changing userspace ABI to handle DMA write barrier attribute

Stefan Roscher (1):
      IB/ehca: Allocate event queue size depending on max number of CQs and QPs

Steve Wise (3):
      RDMA/cxgb3: Correctly serialize peer abort path
      RDMA/cxgb3: Set the max_mr_size device attribute correctly
      RDMA/cxgb3: Support peer-2-peer connection setup

Yevgeny Petrilin (1):
      mlx4_core: Add a way to set the "collapsed" CQ flag

 drivers/infiniband/hw/cxgb3/cxio_hal.c       |   18 ++-
 drivers/infiniband/hw/cxgb3/cxio_hal.h       |    1 +
 drivers/infiniband/hw/cxgb3/cxio_wr.h        |   21 ++-
 drivers/infiniband/hw/cxgb3/iwch.c           |    1 +
 drivers/infiniband/hw/cxgb3/iwch.h           |    1 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c        |  167 ++++++++----
 drivers/infiniband/hw/cxgb3/iwch_cm.h        |    2 +
 drivers/infiniband/hw/cxgb3/iwch_provider.c  |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.h  |    3 +
 drivers/infiniband/hw/cxgb3/iwch_qp.c        |   60 ++++-
 drivers/infiniband/hw/ehca/ehca_classes.h    |    5 +
 drivers/infiniband/hw/ehca/ehca_cq.c         |   11 +
 drivers/infiniband/hw/ehca/ehca_eq.c         |   35 ++--
 drivers/infiniband/hw/ehca/ehca_main.c       |   36 +++-
 drivers/infiniband/hw/ehca/ehca_qp.c         |   26 ++-
 drivers/infiniband/hw/mlx4/cq.c              |    2 +-
 drivers/infiniband/hw/mthca/mthca_mr.c       |   13 -
 drivers/infiniband/hw/mthca/mthca_provider.c |   14 +-
 drivers/infiniband/hw/mthca/mthca_provider.h |    1 +
 drivers/infiniband/hw/mthca/mthca_user.h     |   10 +-
 drivers/infiniband/hw/nes/Kconfig            |    1 +
 drivers/infiniband/hw/nes/nes.c              |    4 +
 drivers/infiniband/hw/nes/nes.h              |    5 +-
 drivers/infiniband/hw/nes/nes_cm.c           |    8 +-
 drivers/infiniband/hw/nes/nes_hw.c           |  371 ++++++++++++++++++++------
 drivers/infiniband/hw/nes/nes_hw.h           |   19 +-
 drivers/infiniband/hw/nes/nes_nic.c          |  180 ++++++++-----
 drivers/infiniband/hw/nes/nes_utils.c        |   10 +-
 drivers/infiniband/hw/nes/nes_verbs.c        |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib.h         |    7 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c      |    8 +-
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |   45 ++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |    3 +-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c   |   39 ++-
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c    |    3 +
 drivers/infiniband/ulp/iser/iscsi_iser.c     |    4 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h     |    7 +
 drivers/infiniband/ulp/iser/iser_memory.c    |    9 +-
 drivers/net/cxgb3/version.h                  |    2 +-
 drivers/net/mlx4/cq.c                        |    4 +-
 drivers/net/mlx4/mr.c                        |    6 -
 include/linux/mlx4/device.h                  |    3 +-
 include/scsi/libiscsi.h                      |    1 +
 44 files changed, 845 insertions(+), 327 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-04-22  1:26 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-04-22  1:26 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few fixes for various things, including one build fix
for the ipath driver:

Paul Bolle (1):
      IB/ipath: Fix module parameter description for disable_sma

Roland Dreier (6):
      RDMA/nes: Remove unneeded function declarations
      IB/ipath: Remove reference to dev->class_dev
      IB/ipath: Build IBA7220 code unconditionally
      IB/ipath: Remove dependency on PCI_MSI || HT_IRQ
      IB/ipath: Remove tests of PCI_MSI in ipath_iba7220.c
      IB/ipath: Correct capitalization "IntX" -> "INTx"

 drivers/infiniband/hw/ipath/Kconfig         |    2 +-
 drivers/infiniband/hw/ipath/Makefile        |    6 ++++--
 drivers/infiniband/hw/ipath/ipath_driver.c  |    2 +-
 drivers/infiniband/hw/ipath/ipath_iba7220.c |   23 +++++++++--------------
 drivers/infiniband/hw/ipath/ipath_verbs.c   |    3 +--
 drivers/infiniband/hw/nes/nes.c             |    6 ------
 drivers/infiniband/hw/nes/nes_nic.c         |    9 ---------
 7 files changed, 16 insertions(+), 35 deletions(-)

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

* Re: [GIT PULL] please pull infiniband.git
  2008-04-17 14:53 Roland Dreier
@ 2008-04-19  8:16 ` Ingo Molnar
  0 siblings, 0 replies; 223+ messages in thread
From: Ingo Molnar @ 2008-04-19  8:16 UTC (permalink / raw)
  To: Roland Dreier; +Cc: torvalds, akpm, general, linux-kernel


* Roland Dreier <rdreier@cisco.com> wrote:

>       IB/ipath: Misc changes to prepare for IB7220 introduction

>       IB/ipath: add calls to new 7220 code and enable in build

x86.git auto-testing found that these changes broke the -git build, with 
this config:

  http://redhat.com/~mingo/misc/config-Sat_Apr_19_09_55_05_CEST_2008.bad

the failure is a link failure:

 drivers/built-in.o: In function `ipath_init_one':
 ipath_driver.c:(.devinit.text+0x1e5bc): undefined reference to `ipath_init_iba7220_funcs'

disabling CONFIG_INFINIBAND_IPATH=y works this around.

	Ingo

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

* [GIT PULL] please pull infiniband.git
@ 2008-04-17 14:53 Roland Dreier
  2008-04-19  8:16 ` Ingo Molnar
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2008-04-17 14:53 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first batch of things queued for 2.6.26: sparse
cleanups, new HW support for the ipath driver, IPoIB updates, and
miscellaneous fixes all over.

Arthur Jones (7):
      IB/ipath: Fix sparse warning about pointer signedness
      IB/ipath: Misc sparse warning cleanup
      IB/ipath: Provide I/O bus speeds for diagnostic purposes
      IB/ipath: Fix link up LED display
      IB/ipath: User mode send DMA header file
      IB/ipath: User mode send DMA
      IB/ipath: Misc changes to prepare for IB7220 introduction

Dave Olson (10):
      IB/ipath: Make some constants chip-specific, related cleanup
      IB/ipath: Shared context code needs to be sure device is usable
      IB/ipath: Enable 4KB MTU
      IB/ipath: HW workaround for case where chip can send but not receive
      IB/ipath: Make link state transition code ignore (transient) link recovery
      IB/ipath: Add support for IBTA 1.2 Heartbeat
      IB/ipath: Set LID filtering for HCAs that support it.
      IB/ipath: Enable reduced PIO update for HCAs that support it.
      IB/ipath: Fix check for no interrupts to reliably fallback to INTx
      IB/ipath: add calls to new 7220 code and enable in build

David Dillow (1):
      IB/srp: Enforce protocol limit on srp_sg_tablesize

Dotan Barak (3):
      IB/core: Check optional verbs before using them
      IB/mthca: Update QP state if query QP succeeds
      IB/mlx4: Update QP state if query QP succeeds

Eli Cohen (13):
      IPoIB: Use checksum offload support if available
      IB/mlx4: Add IPoIB checksum offload support
      IB/mthca: Add IPoIB checksum offload support
      IB/core: Add creation flags to struct ib_qp_init_attr
      IB/core: Add IPoIB UD LSO support
      IPoIB: Add LSO support
      IB/mlx4: Add IPoIB LSO support
      IPoIB: Add basic ethtool support
      IB/core: Add support for modify CQ
      IPoIB: Support modifying IPoIB CQ event moderation
      IB/mlx4: Add support for modifying CQ moderation parameters
      IB/mlx4: Fix race when detaching a QP from a multicast group
      IB/mlx4: Fix incorrect comment

Erez Zilber (2):
      IB/iser: Release connection resources on RDMA_CM_EVENT_DEVICE_REMOVAL event
      IB/iser: Don't change itt endianness

Harvey Harrison (1):
      IB: Replace remaining __FUNCTION__ occurrences with __func__

Hoang-Nam Nguyen (1):
      IB/ehca: Remove tgid checking

Jack Morgenstein (3):
      mlx4_core: Increase max number of QPs to 128K
      IB/mthca: Update module version and release date
      IB/mlx4: Update module version and release date

John Gregor (2):
      IB/ipath: Head of Line blocking vs forward progress of user apps
      IB/ipath: Add code for IBA7220 send DMA

Julia Lawall (1):
      RDMA/iwcm: Test rdma_create_id() for IS_ERR rather than 0

Michael Albaugh (5):
      IB/ipath: Prevent link-recovery code from negating admin disable
      IB/ipath: EEPROM support for 7220 devices, robustness improvements, cleanup
      IB/ipath: Allow old and new diagnostic packet formats
      IB/ipath: Isolate 7220-specific content
      IB/ipath: Support for SerDes portion of IBA7220

Ralph Campbell (18):
      IB/ipath: Fix byte order of pioavail in handle_errors()
      IB/ipath: Fix error recovery for send buffer status after chip freeze mode
      IB/ipath: Don't try to handle freeze mode HW errors if diagnostic mode
      IB/ipath: Make debug error message match the constraint that is checked for
      IB/ipath: Add code to support multiple link speeds and widths
      IB/ipath: Remove useless comments
      IB/ipath: Fix sanity checks on QP number of WRs and SGEs
      IB/ipath: Change the module author
      IB/ipath: Remove some useless (void) casts
      IB/ipath: Make send buffers available for kernel if not allocated to user
      IB/ipath: Use PIO buffer for RC ACKs
      IB/ipath: Fix some white space and code style issues
      IB/ipath: Add support for 7220 receive queue changes
      IB/ipath: Fix up error handling
      IB/ipath: Header file changes to support IBA7220
      IB/ipath: HCA-specific code to support IBA7220
      IB/ipath: Add IBA7220-specific SERDES initialization data
      IB/ipath: Update copyright dates for files changed in 2008

Robert P. J. Day (3):
      IB: Use shorter list_splice_init() for brevity
      RDMA/nes: Use more concise list_for_each_entry()
      IB/ipath: Fix time comparison to use time_after_eq()

Roland Dreier (31):
      IB/mthca: Formatting cleanups
      IB/mlx4: Convert "if(foo)" to "if (foo)"
      mlx4_core: Move opening brace of function onto a new line
      RDMA/amso1100: Don't use 0UL as a NULL pointer
      RDMA/cxgb3: IDR IDs are signed
      IB: Make struct ib_uobject.id a signed int
      IB/ipath: Fix sparse warning about shadowed symbol
      IB/mlx4: Endianness annotations
      IB/cm: Endianness annotations
      RDMA/ucma: Endian annotation
      RDMA/nes: Trivial endianness annotations
      RDMA/nes: Delete unused variables
      RDMA/amso1100: Start of endianness annotation
      RDMA/amso1100: Endian annotate mqsq allocator
      mlx4_core: Fix confusion between mlx4_event and mlx4_dev_event enums
      IB/uverbs: Don't store struct file * for event files
      IB/uverbs: Use alloc_file() instead of get_empty_filp()
      RDMA/nes: Remove redundant NULL check in nes_unregister_ofa_device()
      RDMA/nes: Remove unused nes_netdev_exit() function
      RDMA/nes: Use proper format and cast to print dma_addr_t
      RDMA/nes: Make symbols used only in a single source file static
      IB/ehca: Make symbols used only in a single source file static
      IB/mthca: Avoid integer overflow when dealing with profile size
      IB/mthca: Avoid integer overflow when allocating huge ICM table
      IB/ipath: Fix PCI config write size used to clear linkctrl error bits
      RDMA/nes: Remove session_id from nes_cm stuff
      IB/mlx4: Micro-optimize mlx4_ib_post_send()
      IB/core: Add support for "send with invalidate" work requests
      RDMA/amso1100: Add support for "send with invalidate" work requests
      RDMA/nes: Free IRQ before killing tasklet
      IPoIB: Handle case when P_Key is deleted and re-added at same index

Stefan Roscher (1):
      IB/ehca: Support all ibv_devinfo values in query_device() and query_port()

Tom Tucker (1):
      RDMA/amso1100: Add check for NULL reply_msg in c2_intr()

Vladimir Sokolovsky (1):
      IB/mlx4: Add support for resizing CQs

 drivers/infiniband/core/cm.c                   |   63 +-
 drivers/infiniband/core/cma.c                  |    2 +-
 drivers/infiniband/core/fmr_pool.c             |    3 +-
 drivers/infiniband/core/ucma.c                 |    2 +-
 drivers/infiniband/core/uverbs.h               |    4 +-
 drivers/infiniband/core/uverbs_cmd.c           |   14 +-
 drivers/infiniband/core/uverbs_main.c          |   28 +-
 drivers/infiniband/core/verbs.c                |   14 +-
 drivers/infiniband/hw/amso1100/c2.c            |   80 +-
 drivers/infiniband/hw/amso1100/c2.h            |   16 +-
 drivers/infiniband/hw/amso1100/c2_ae.c         |   10 +-
 drivers/infiniband/hw/amso1100/c2_alloc.c      |   12 +-
 drivers/infiniband/hw/amso1100/c2_cq.c         |    4 +-
 drivers/infiniband/hw/amso1100/c2_intr.c       |    6 +-
 drivers/infiniband/hw/amso1100/c2_mm.c         |    2 +-
 drivers/infiniband/hw/amso1100/c2_mq.c         |    4 +-
 drivers/infiniband/hw/amso1100/c2_mq.h         |    2 +-
 drivers/infiniband/hw/amso1100/c2_provider.c   |   85 +-
 drivers/infiniband/hw/amso1100/c2_qp.c         |   30 +-
 drivers/infiniband/hw/amso1100/c2_rnic.c       |   31 +-
 drivers/infiniband/hw/amso1100/c2_vq.c         |    2 +-
 drivers/infiniband/hw/amso1100/c2_wr.h         |  212 +-
 drivers/infiniband/hw/cxgb3/cxio_dbg.c         |   24 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |   84 +-
 drivers/infiniband/hw/cxgb3/cxio_resource.c    |   12 +-
 drivers/infiniband/hw/cxgb3/iwch.c             |    6 +-
 drivers/infiniband/hw/cxgb3/iwch.h             |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |  166 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.h          |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_cq.c          |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_ev.c          |   12 +-
 drivers/infiniband/hw/cxgb3/iwch_mem.c         |    6 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |   79 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.h    |    4 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |   42 +-
 drivers/infiniband/hw/ehca/ehca_av.c           |   31 -
 drivers/infiniband/hw/ehca/ehca_classes.h      |    2 -
 drivers/infiniband/hw/ehca/ehca_cq.c           |   19 -
 drivers/infiniband/hw/ehca/ehca_hca.c          |  129 +-
 drivers/infiniband/hw/ehca/ehca_main.c         |   19 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c         |   42 +-
 drivers/infiniband/hw/ehca/ehca_pd.c           |   11 -
 drivers/infiniband/hw/ehca/ehca_qp.c           |   51 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c         |    2 +-
 drivers/infiniband/hw/ehca/ehca_tools.h        |   16 +-
 drivers/infiniband/hw/ehca/ehca_uverbs.c       |   19 -
 drivers/infiniband/hw/ipath/Makefile           |    3 +
 drivers/infiniband/hw/ipath/ipath_7220.h       |   57 +
 drivers/infiniband/hw/ipath/ipath_common.h     |   54 +-
 drivers/infiniband/hw/ipath/ipath_debug.h      |    2 +
 drivers/infiniband/hw/ipath/ipath_diag.c       |   35 +-
 drivers/infiniband/hw/ipath/ipath_driver.c     | 1041 +++++++---
 drivers/infiniband/hw/ipath/ipath_eeprom.c     |  428 ++++-
 drivers/infiniband/hw/ipath/ipath_file_ops.c   |  176 ++-
 drivers/infiniband/hw/ipath/ipath_iba6110.c    |   51 +-
 drivers/infiniband/hw/ipath/ipath_iba6120.c    |  203 ++-
 drivers/infiniband/hw/ipath/ipath_iba7220.c    | 2571 ++++++++++++++++++++++++
 drivers/infiniband/hw/ipath/ipath_init_chip.c  |  312 ++--
 drivers/infiniband/hw/ipath/ipath_intr.c       |  656 ++++---
 drivers/infiniband/hw/ipath/ipath_kernel.h     |  304 +++-
 drivers/infiniband/hw/ipath/ipath_mad.c        |  110 +-
 drivers/infiniband/hw/ipath/ipath_qp.c         |   59 +-
 drivers/infiniband/hw/ipath/ipath_rc.c         |   67 +-
 drivers/infiniband/hw/ipath/ipath_registers.h  |  168 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c        |   22 +-
 drivers/infiniband/hw/ipath/ipath_sd7220.c     | 1462 ++++++++++++++
 drivers/infiniband/hw/ipath/ipath_sd7220_img.c | 1082 ++++++++++
 drivers/infiniband/hw/ipath/ipath_sdma.c       |  790 ++++++++
 drivers/infiniband/hw/ipath/ipath_srq.c        |    5 +-
 drivers/infiniband/hw/ipath/ipath_stats.c      |   33 +-
 drivers/infiniband/hw/ipath/ipath_sysfs.c      |  104 +-
 drivers/infiniband/hw/ipath/ipath_uc.c         |    8 +-
 drivers/infiniband/hw/ipath/ipath_ud.c         |    7 +-
 drivers/infiniband/hw/ipath/ipath_user_sdma.c  |  879 ++++++++
 drivers/infiniband/hw/ipath/ipath_user_sdma.h  |   54 +
 drivers/infiniband/hw/ipath/ipath_verbs.c      |  413 ++++-
 drivers/infiniband/hw/ipath/ipath_verbs.h      |   32 +-
 drivers/infiniband/hw/mlx4/cq.c                |  319 +++-
 drivers/infiniband/hw/mlx4/mad.c               |    2 +-
 drivers/infiniband/hw/mlx4/main.c              |   25 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h           |   15 +
 drivers/infiniband/hw/mlx4/qp.c                |  117 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c        |    6 +-
 drivers/infiniband/hw/mthca/mthca_cmd.h        |    1 +
 drivers/infiniband/hw/mthca/mthca_cq.c         |   14 +-
 drivers/infiniband/hw/mthca/mthca_dev.h        |   14 +-
 drivers/infiniband/hw/mthca/mthca_eq.c         |    4 +-
 drivers/infiniband/hw/mthca/mthca_mad.c        |    2 +-
 drivers/infiniband/hw/mthca/mthca_main.c       |   15 +-
 drivers/infiniband/hw/mthca/mthca_memfree.c    |    6 +-
 drivers/infiniband/hw/mthca/mthca_profile.c    |    4 +-
 drivers/infiniband/hw/mthca/mthca_profile.h    |    2 +-
 drivers/infiniband/hw/mthca/mthca_provider.c   |    5 +-
 drivers/infiniband/hw/mthca/mthca_qp.c         |   28 +-
 drivers/infiniband/hw/mthca/mthca_wqe.h        |   16 +-
 drivers/infiniband/hw/nes/nes.c                |   15 +-
 drivers/infiniband/hw/nes/nes.h                |   32 +-
 drivers/infiniband/hw/nes/nes_cm.c             |  131 +-
 drivers/infiniband/hw/nes/nes_cm.h             |   35 -
 drivers/infiniband/hw/nes/nes_hw.c             |   49 +-
 drivers/infiniband/hw/nes/nes_nic.c            |   26 +-
 drivers/infiniband/hw/nes/nes_utils.c          |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c          |   29 +-
 drivers/infiniband/ulp/ipoib/Makefile          |    3 +-
 drivers/infiniband/ulp/ipoib/ipoib.h           |   10 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |   15 +-
 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c   |   99 +
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |  126 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   33 +-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |    3 +
 drivers/infiniband/ulp/iser/iser_initiator.c   |    4 +-
 drivers/infiniband/ulp/iser/iser_verbs.c       |    5 +-
 drivers/infiniband/ulp/srp/ib_srp.c            |    7 +-
 drivers/net/mlx4/catas.c                       |    2 +-
 drivers/net/mlx4/cmd.c                         |    3 +-
 drivers/net/mlx4/cq.c                          |   72 +-
 drivers/net/mlx4/eq.c                          |    5 +-
 drivers/net/mlx4/fw.c                          |   13 +
 drivers/net/mlx4/fw.h                          |    1 +
 drivers/net/mlx4/intf.c                        |    8 +-
 drivers/net/mlx4/main.c                        |    6 +-
 drivers/net/mlx4/mcg.c                         |   12 +-
 drivers/net/mlx4/mlx4.h                        |    4 +-
 include/linux/mlx4/cmd.h                       |    2 +-
 include/linux/mlx4/cq.h                        |   19 +-
 include/linux/mlx4/device.h                    |    1 +
 include/linux/mlx4/driver.h                    |    3 +-
 include/linux/mlx4/qp.h                        |   15 +-
 include/rdma/ib_user_verbs.h                   |    5 +-
 include/rdma/ib_verbs.h                        |   35 +-
 net/sunrpc/xprtrdma/verbs.c                    |    1 -
 131 files changed, 11739 insertions(+), 2287 deletions(-)
 create mode 100644 drivers/infiniband/hw/ipath/ipath_7220.h
 create mode 100644 drivers/infiniband/hw/ipath/ipath_iba7220.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_sd7220.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_sd7220_img.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_sdma.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_user_sdma.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_user_sdma.h
 create mode 100644 drivers/infiniband/ulp/ipoib/ipoib_ethtool.c

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

* [GIT PULL] please pull infiniband.git
@ 2008-03-21 21:02 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-03-21 21:02 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Chien Tung (1):
      RDMA/nes: Fix MSS calculation on RDMA path

 drivers/infiniband/hw/nes/nes_cm.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)


diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
index 39adb26..0bef878 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -40,6 +40,7 @@
 #include <linux/tcp.h>
 #include <linux/init.h>
 #include <linux/if_arp.h>
+#include <linux/if_vlan.h>
 #include <linux/notifier.h>
 #include <linux/net.h>
 #include <linux/types.h>
@@ -1072,7 +1073,7 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
 	ts = current_kernel_time();
 	cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec);
 	cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) -
-			sizeof(struct tcphdr) - ETH_HLEN;
+			sizeof(struct tcphdr) - ETH_HLEN - VLAN_HLEN;
 	cm_node->tcp_cntxt.rcv_nxt = 0;
 	/* get a unique session ID , add thread_id to an upcounter to handle race */
 	atomic_inc(&cm_core->node_cnt);

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

* [GIT PULL] please pull infiniband.git
@ 2008-03-13 20:15 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-03-13 20:15 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get some more small post-2.6.25-rc5 fixes, mostly to the
ipath driver but some to IP-over-IB also:

Or Gerlitz (1):
      IPoIB: Don't drop multicast sends when they can be queued

Patrick Marchand Latifi (4):
      IB/ipath: Fix potentially wrong RNR retry counter returned in ipath_query_qp()
      IB/ipath: Fix RC QP initialization
      IB/ipath: Fix error completion put on send CQ instead of recv CQ
      IB/ipath: Reset the retry counter for RDMA_READ_RESPONSE_MIDDLE packets

Ralph Campbell (1):
      IB/ipath: Fix IB compliance problems with link state vs physical state

Roland Dreier (2):
      IPoIB/cm: Set tx_wr.num_sge in connected mode post_send()
      IPoIB: Allocate priv->tx_ring with vmalloc()

 drivers/infiniband/hw/ipath/ipath_common.h     |    2 +-
 drivers/infiniband/hw/ipath/ipath_driver.c     |   28 ++++++++++-------------
 drivers/infiniband/hw/ipath/ipath_kernel.h     |    1 +
 drivers/infiniband/hw/ipath/ipath_mad.c        |    7 ++---
 drivers/infiniband/hw/ipath/ipath_qp.c         |   13 ++++++-----
 drivers/infiniband/hw/ipath/ipath_rc.c         |    4 +++
 drivers/infiniband/hw/ipath/ipath_registers.h  |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |    9 +++++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    9 ++++---
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    2 +-
 10 files changed, 41 insertions(+), 36 deletions(-)


diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h
index 4146210..591901a 100644
--- a/drivers/infiniband/hw/ipath/ipath_common.h
+++ b/drivers/infiniband/hw/ipath/ipath_common.h
@@ -75,7 +75,7 @@
 #define IPATH_IB_LINKDOWN		0
 #define IPATH_IB_LINKARM		1
 #define IPATH_IB_LINKACTIVE		2
-#define IPATH_IB_LINKINIT		3
+#define IPATH_IB_LINKDOWN_ONLY		3
 #define IPATH_IB_LINKDOWN_SLEEP		4
 #define IPATH_IB_LINKDOWN_DISABLE	5
 #define IPATH_IB_LINK_LOOPBACK	6 /* enable local loopback */
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index d5ff6ca..ca4d0ac 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -851,8 +851,7 @@ void ipath_disarm_piobufs(struct ipath_devdata *dd, unsigned first,
  * -ETIMEDOUT state can have multiple states set, for any of several
  * transitions.
  */
-static int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state,
-				int msecs)
+int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state, int msecs)
 {
 	dd->ipath_state_wanted = state;
 	wait_event_interruptible_timeout(ipath_state_wait,
@@ -1656,8 +1655,8 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl)
 static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
 {
 	static const char *what[4] = {
-		[0] = "DOWN",
-		[INFINIPATH_IBCC_LINKCMD_INIT] = "INIT",
+		[0] = "NOP",
+		[INFINIPATH_IBCC_LINKCMD_DOWN] = "DOWN",
 		[INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED",
 		[INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE"
 	};
@@ -1672,9 +1671,9 @@ static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
 			    (dd, dd->ipath_kregs->kr_ibcstatus) >>
 			    INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) &
 			   INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]);
-	/* flush all queued sends when going to DOWN or INIT, to be sure that
+	/* flush all queued sends when going to DOWN to be sure that
 	 * they don't block MAD packets */
-	if (!linkcmd || linkcmd == INFINIPATH_IBCC_LINKCMD_INIT)
+	if (linkcmd == INFINIPATH_IBCC_LINKCMD_DOWN)
 		ipath_cancel_sends(dd, 1);
 
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl,
@@ -1687,6 +1686,13 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate)
 	int ret;
 
 	switch (newstate) {
+	case IPATH_IB_LINKDOWN_ONLY:
+		ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_DOWN <<
+				    INFINIPATH_IBCC_LINKCMD_SHIFT);
+		/* don't wait */
+		ret = 0;
+		goto bail;
+
 	case IPATH_IB_LINKDOWN:
 		ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL <<
 				    INFINIPATH_IBCC_LINKINITCMD_SHIFT);
@@ -1709,16 +1715,6 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate)
 		ret = 0;
 		goto bail;
 
-	case IPATH_IB_LINKINIT:
-		if (dd->ipath_flags & IPATH_LINKINIT) {
-			ret = 0;
-			goto bail;
-		}
-		ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_INIT <<
-				    INFINIPATH_IBCC_LINKCMD_SHIFT);
-		lstate = IPATH_LINKINIT;
-		break;
-
 	case IPATH_IB_LINKARM:
 		if (dd->ipath_flags & IPATH_LINKARMED) {
 			ret = 0;
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index 4cc0f95..ecf3f7f 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -767,6 +767,7 @@ void ipath_kreceive(struct ipath_portdata *);
 int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned);
 int ipath_reset_device(int);
 void ipath_get_faststats(unsigned long);
+int ipath_wait_linkstate(struct ipath_devdata *, u32, int);
 int ipath_set_linkstate(struct ipath_devdata *, u8);
 int ipath_set_mtu(struct ipath_devdata *, u16);
 int ipath_set_lid(struct ipath_devdata *, u32, u8);
diff --git a/drivers/infiniband/hw/ipath/ipath_mad.c b/drivers/infiniband/hw/ipath/ipath_mad.c
index d98d5f1..b34b91d 100644
--- a/drivers/infiniband/hw/ipath/ipath_mad.c
+++ b/drivers/infiniband/hw/ipath/ipath_mad.c
@@ -555,10 +555,7 @@ static int recv_subn_set_portinfo(struct ib_smp *smp,
 		/* FALLTHROUGH */
 	case IB_PORT_DOWN:
 		if (lstate == 0)
-			if (get_linkdowndefaultstate(dd))
-				lstate = IPATH_IB_LINKDOWN_SLEEP;
-			else
-				lstate = IPATH_IB_LINKDOWN;
+			lstate = IPATH_IB_LINKDOWN_ONLY;
 		else if (lstate == 1)
 			lstate = IPATH_IB_LINKDOWN_SLEEP;
 		else if (lstate == 2)
@@ -568,6 +565,8 @@ static int recv_subn_set_portinfo(struct ib_smp *smp,
 		else
 			goto err;
 		ipath_set_linkstate(dd, lstate);
+		ipath_wait_linkstate(dd, IPATH_LINKINIT | IPATH_LINKARMED |
+				IPATH_LINKACTIVE, 1000);
 		break;
 	case IB_PORT_ARMED:
 		ipath_set_linkstate(dd, IPATH_IB_LINKARM);
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c
index 80dc623..087ed31 100644
--- a/drivers/infiniband/hw/ipath/ipath_qp.c
+++ b/drivers/infiniband/hw/ipath/ipath_qp.c
@@ -329,8 +329,9 @@ struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn)
 /**
  * ipath_reset_qp - initialize the QP state to the reset state
  * @qp: the QP to reset
+ * @type: the QP type
  */
-static void ipath_reset_qp(struct ipath_qp *qp)
+static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type)
 {
 	qp->remote_qpn = 0;
 	qp->qkey = 0;
@@ -342,7 +343,7 @@ static void ipath_reset_qp(struct ipath_qp *qp)
 	qp->s_psn = 0;
 	qp->r_psn = 0;
 	qp->r_msn = 0;
-	if (qp->ibqp.qp_type == IB_QPT_RC) {
+	if (type == IB_QPT_RC) {
 		qp->s_state = IB_OPCODE_RC_SEND_LAST;
 		qp->r_state = IB_OPCODE_RC_SEND_LAST;
 	} else {
@@ -414,7 +415,7 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err)
 		wc.wr_id = qp->r_wr_id;
 		wc.opcode = IB_WC_RECV;
 		wc.status = err;
-		ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1);
+		ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1);
 	}
 	wc.status = IB_WC_WR_FLUSH_ERR;
 
@@ -534,7 +535,7 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 
 	switch (new_state) {
 	case IB_QPS_RESET:
-		ipath_reset_qp(qp);
+		ipath_reset_qp(qp, ibqp->qp_type);
 		break;
 
 	case IB_QPS_ERR:
@@ -647,7 +648,7 @@ int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 	attr->port_num = 1;
 	attr->timeout = qp->timeout;
 	attr->retry_cnt = qp->s_retry_cnt;
-	attr->rnr_retry = qp->s_rnr_retry;
+	attr->rnr_retry = qp->s_rnr_retry_cnt;
 	attr->alt_port_num = 0;
 	attr->alt_timeout = 0;
 
@@ -839,7 +840,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
 			goto bail_qp;
 		}
 		qp->ip = NULL;
-		ipath_reset_qp(qp);
+		ipath_reset_qp(qp, init_attr->qp_type);
 		break;
 
 	default:
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c
index 459e46e..40f3e37 100644
--- a/drivers/infiniband/hw/ipath/ipath_rc.c
+++ b/drivers/infiniband/hw/ipath/ipath_rc.c
@@ -1196,6 +1196,10 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev,
 			list_move_tail(&qp->timerwait,
 				       &dev->pending[dev->pending_index]);
 		spin_unlock(&dev->pending_lock);
+
+		if (opcode == OP(RDMA_READ_RESPONSE_MIDDLE))
+			qp->s_retry = qp->s_retry_cnt;
+
 		/*
 		 * Update the RDMA receive state but do the copy w/o
 		 * holding the locks and blocking interrupts.
diff --git a/drivers/infiniband/hw/ipath/ipath_registers.h b/drivers/infiniband/hw/ipath/ipath_registers.h
index 6d2a17f..92ad73a 100644
--- a/drivers/infiniband/hw/ipath/ipath_registers.h
+++ b/drivers/infiniband/hw/ipath/ipath_registers.h
@@ -185,7 +185,7 @@
 #define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3
 #define INFINIPATH_IBCC_LINKINITCMD_SHIFT 16
 #define INFINIPATH_IBCC_LINKCMD_MASK 0x3ULL
-#define INFINIPATH_IBCC_LINKCMD_INIT 1	/* move to 0x11 */
+#define INFINIPATH_IBCC_LINKCMD_DOWN 1	/* move to 0x11 */
 #define INFINIPATH_IBCC_LINKCMD_ARMED 2	/* move to 0x21 */
 #define INFINIPATH_IBCC_LINKCMD_ACTIVE 3	/* move to 0x31 */
 #define INFINIPATH_IBCC_LINKCMD_SHIFT 18
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 52b1beb..2490b2d 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -38,6 +38,7 @@
 #include <net/icmp.h>
 #include <linux/icmpv6.h>
 #include <linux/delay.h>
+#include <linux/vmalloc.h>
 
 #include "ipoib.h"
 
@@ -637,6 +638,7 @@ static inline int post_send(struct ipoib_dev_priv *priv,
 	priv->tx_sge[0].addr          = addr;
 	priv->tx_sge[0].length        = len;
 
+	priv->tx_wr.num_sge	= 1;
 	priv->tx_wr.wr_id	= wr_id | IPOIB_OP_CM;
 
 	return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr);
@@ -1030,13 +1032,13 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
 	struct ipoib_dev_priv *priv = netdev_priv(p->dev);
 	int ret;
 
-	p->tx_ring = kzalloc(ipoib_sendq_size * sizeof *p->tx_ring,
-				GFP_KERNEL);
+	p->tx_ring = vmalloc(ipoib_sendq_size * sizeof *p->tx_ring);
 	if (!p->tx_ring) {
 		ipoib_warn(priv, "failed to allocate tx ring\n");
 		ret = -ENOMEM;
 		goto err_tx;
 	}
+	memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring);
 
 	p->qp = ipoib_cm_create_tx_qp(p->dev, p);
 	if (IS_ERR(p->qp)) {
@@ -1077,6 +1079,7 @@ err_id:
 	ib_destroy_qp(p->qp);
 err_qp:
 	p->qp = NULL;
+	vfree(p->tx_ring);
 err_tx:
 	return ret;
 }
@@ -1127,7 +1130,7 @@ timeout:
 	if (p->qp)
 		ib_destroy_qp(p->qp);
 
-	kfree(p->tx_ring);
+	vfree(p->tx_ring);
 	kfree(p);
 }
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index f96477a..5728204 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -41,6 +41,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/kernel.h>
+#include <linux/vmalloc.h>
 
 #include <linux/if_arp.h>	/* For ARPHRD_xxx */
 
@@ -887,13 +888,13 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
 		goto out;
 	}
 
-	priv->tx_ring = kzalloc(ipoib_sendq_size * sizeof *priv->tx_ring,
-				GFP_KERNEL);
+	priv->tx_ring = vmalloc(ipoib_sendq_size * sizeof *priv->tx_ring);
 	if (!priv->tx_ring) {
 		printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n",
 		       ca->name, ipoib_sendq_size);
 		goto out_rx_ring_cleanup;
 	}
+	memset(priv->tx_ring, 0, ipoib_sendq_size * sizeof *priv->tx_ring);
 
 	/* priv->tx_head, tx_tail & tx_outstanding are already 0 */
 
@@ -903,7 +904,7 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
 	return 0;
 
 out_tx_ring_cleanup:
-	kfree(priv->tx_ring);
+	vfree(priv->tx_ring);
 
 out_rx_ring_cleanup:
 	kfree(priv->rx_ring);
@@ -928,7 +929,7 @@ void ipoib_dev_cleanup(struct net_device *dev)
 	ipoib_ib_dev_cleanup(dev);
 
 	kfree(priv->rx_ring);
-	kfree(priv->tx_ring);
+	vfree(priv->tx_ring);
 
 	priv->rx_ring = NULL;
 	priv->tx_ring = NULL;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 2628339..31a53c5 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -650,7 +650,7 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb)
 	 */
 	spin_lock(&priv->lock);
 
-	if (!test_bit(IPOIB_MCAST_STARTED, &priv->flags)	||
+	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
 	    !priv->broadcast					||
 	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
 		++dev->stats.tx_dropped;

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

* [GIT PULL] please pull infiniband.git
@ 2008-03-11  4:33 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-03-11  4:33 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get some more small post-2.6.25-rc5 fixes:

Arne Redlich (2):
      IB/iser: Fix list iteration bug
      IB/iser: Handle iser_device allocation error gracefully

Arthur Jones (1):
      MAINTAINERS: update ipath owner

Jon Mason (2):
      RDMA/cxgb3: Return correct max_inline_data when creating a QP
      RDMA/cxgb3: Fix iwch_create_cq() off-by-one error

Pete Wyckoff (2):
      Revert "IB/fmr_pool: ib_fmr_pool_flush() should flush all dirty FMRs"
      IB/fmr_pool: Flush all dirty FMRs from ib_fmr_pool_flush()

Sean Hefty (1):
      IB/cm: Flush workqueue when removing device

Steve Wise (1):
      RDMA/iwcm: Don't access a cm_id after dropping reference

 MAINTAINERS                                 |    2 +-
 drivers/infiniband/core/cm.c                |    3 +-
 drivers/infiniband/core/fmr_pool.c          |   38 ++++++++++++---------
 drivers/infiniband/core/iwcm.c              |    5 ++-
 drivers/infiniband/hw/cxgb3/iwch_provider.c |    5 ++-
 drivers/infiniband/ulp/iser/iser_verbs.c    |   47 ++++++++++++++-------------
 6 files changed, 56 insertions(+), 44 deletions(-)


diff --git a/MAINTAINERS b/MAINTAINERS
index fed09b5..f229e16 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2143,7 +2143,7 @@ L:	netdev@vger.kernel.org
 S:	Maintained
 
 IPATH DRIVER:
-P:	Arthur Jones
+P:	Ralph Campbell
 M:	infinipath@qlogic.com
 L:	general@lists.openfabrics.org
 T:	git git://git.qlogic.com/ipath-linux-2.6
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index b10ade9..4df4051 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -3759,6 +3759,7 @@ static void cm_remove_one(struct ib_device *device)
 		port = cm_dev->port[i-1];
 		ib_modify_port(device, port->port_num, 0, &port_modify);
 		ib_unregister_mad_agent(port->mad_agent);
+		flush_workqueue(cm.wq);
 		cm_remove_port_fs(port);
 	}
 	kobject_put(&cm_dev->dev_obj);
@@ -3813,6 +3814,7 @@ static void __exit ib_cm_cleanup(void)
 		cancel_delayed_work(&timewait_info->work.work);
 	spin_unlock_irq(&cm.lock);
 
+	ib_unregister_client(&cm_client);
 	destroy_workqueue(cm.wq);
 
 	list_for_each_entry_safe(timewait_info, tmp, &cm.timewait_list, list) {
@@ -3820,7 +3822,6 @@ static void __exit ib_cm_cleanup(void)
 		kfree(timewait_info);
 	}
 
-	ib_unregister_client(&cm_client);
 	class_unregister(&cm_class);
 	idr_destroy(&cm.local_id_table);
 }
diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c
index 7f00347..06d502c 100644
--- a/drivers/infiniband/core/fmr_pool.c
+++ b/drivers/infiniband/core/fmr_pool.c
@@ -139,7 +139,7 @@ static inline struct ib_pool_fmr *ib_fmr_cache_lookup(struct ib_fmr_pool *pool,
 static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
 {
 	int                 ret;
-	struct ib_pool_fmr *fmr, *next;
+	struct ib_pool_fmr *fmr;
 	LIST_HEAD(unmap_list);
 	LIST_HEAD(fmr_list);
 
@@ -158,20 +158,6 @@ static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
 #endif
 	}
 
-	/*
-	 * The free_list may hold FMRs that have been put there
-	 * because they haven't reached the max_remap count.
-	 * Invalidate their mapping as well.
-	 */
-	list_for_each_entry_safe(fmr, next, &pool->free_list, list) {
-		if (fmr->remap_count == 0)
-			continue;
-		hlist_del_init(&fmr->cache_node);
-		fmr->remap_count = 0;
-		list_add_tail(&fmr->fmr->list, &fmr_list);
-		list_move(&fmr->list, &unmap_list);
-	}
-
 	list_splice(&pool->dirty_list, &unmap_list);
 	INIT_LIST_HEAD(&pool->dirty_list);
 	pool->dirty_len = 0;
@@ -384,6 +370,11 @@ void ib_destroy_fmr_pool(struct ib_fmr_pool *pool)
 
 	i = 0;
 	list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) {
+		if (fmr->remap_count) {
+			INIT_LIST_HEAD(&fmr_list);
+			list_add_tail(&fmr->fmr->list, &fmr_list);
+			ib_unmap_fmr(&fmr_list);
+		}
 		ib_dealloc_fmr(fmr->fmr);
 		list_del(&fmr->list);
 		kfree(fmr);
@@ -407,8 +398,23 @@ EXPORT_SYMBOL(ib_destroy_fmr_pool);
  */
 int ib_flush_fmr_pool(struct ib_fmr_pool *pool)
 {
-	int serial = atomic_inc_return(&pool->req_ser);
+	int serial;
+	struct ib_pool_fmr *fmr, *next;
+
+	/*
+	 * The free_list holds FMRs that may have been used
+	 * but have not been remapped enough times to be dirty.
+	 * Put them on the dirty list now so that the cleanup
+	 * thread will reap them too.
+	 */
+	spin_lock_irq(&pool->pool_lock);
+	list_for_each_entry_safe(fmr, next, &pool->free_list, list) {
+		if (fmr->remap_count > 0)
+			list_move(&fmr->list, &pool->dirty_list);
+	}
+	spin_unlock_irq(&pool->pool_lock);
 
+	serial = atomic_inc_return(&pool->req_ser);
 	wake_up_process(pool->thread);
 
 	if (wait_event_interruptible(pool->force_wait,
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index 223b1aa..81c9195 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -839,6 +839,7 @@ static void cm_work_handler(struct work_struct *_work)
 	unsigned long flags;
 	int empty;
 	int ret = 0;
+	int destroy_id;
 
 	spin_lock_irqsave(&cm_id_priv->lock, flags);
 	empty = list_empty(&cm_id_priv->work_list);
@@ -857,9 +858,9 @@ static void cm_work_handler(struct work_struct *_work)
 			destroy_cm_id(&cm_id_priv->id);
 		}
 		BUG_ON(atomic_read(&cm_id_priv->refcount)==0);
+		destroy_id = test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
 		if (iwcm_deref_id(cm_id_priv)) {
-			if (test_bit(IWCM_F_CALLBACK_DESTROY,
-				     &cm_id_priv->flags)) {
+			if (destroy_id) {
 				BUG_ON(!list_empty(&cm_id_priv->work_list));
 				free_cm_id(cm_id_priv);
 			}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index df1838f..b2ea921 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -189,7 +189,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev, int entries, int ve
 		return ERR_PTR(-ENOMEM);
 	}
 	chp->rhp = rhp;
-	chp->ibcq.cqe = (1 << chp->cq.size_log2) - 1;
+	chp->ibcq.cqe = 1 << chp->cq.size_log2;
 	spin_lock_init(&chp->lock);
 	atomic_set(&chp->refcnt, 1);
 	init_waitqueue_head(&chp->wait);
@@ -819,8 +819,11 @@ static struct ib_qp *iwch_create_qp(struct ib_pd *pd,
 		kfree(qhp);
 		return ERR_PTR(-ENOMEM);
 	}
+
 	attrs->cap.max_recv_wr = rqsize - 1;
 	attrs->cap.max_send_wr = sqsize;
+	attrs->cap.max_inline_data = T3_MAX_INLINE;
+
 	qhp->rhp = rhp;
 	qhp->attr.pd = php->pdid;
 	qhp->attr.scq = ((struct iwch_cq *) attrs->send_cq)->cq.cqid;
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 714b8db..993f0a8 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -237,36 +237,32 @@ static int iser_free_ib_conn_res(struct iser_conn *ib_conn)
 static
 struct iser_device *iser_device_find_by_ib_device(struct rdma_cm_id *cma_id)
 {
-	struct list_head    *p_list;
-	struct iser_device  *device = NULL;
+	struct iser_device *device;
 
 	mutex_lock(&ig.device_list_mutex);
 
-	p_list = ig.device_list.next;
-	while (p_list != &ig.device_list) {
-		device = list_entry(p_list, struct iser_device, ig_list);
+	list_for_each_entry(device, &ig.device_list, ig_list)
 		/* find if there's a match using the node GUID */
 		if (device->ib_device->node_guid == cma_id->device->node_guid)
-			break;
-	}
+			goto inc_refcnt;
 
-	if (device == NULL) {
-		device = kzalloc(sizeof *device, GFP_KERNEL);
-		if (device == NULL)
-			goto out;
-		/* assign this device to the device */
-		device->ib_device = cma_id->device;
-		/* init the device and link it into ig device list */
-		if (iser_create_device_ib_res(device)) {
-			kfree(device);
-			device = NULL;
-			goto out;
-		}
-		list_add(&device->ig_list, &ig.device_list);
+	device = kzalloc(sizeof *device, GFP_KERNEL);
+	if (device == NULL)
+		goto out;
+
+	/* assign this device to the device */
+	device->ib_device = cma_id->device;
+	/* init the device and link it into ig device list */
+	if (iser_create_device_ib_res(device)) {
+		kfree(device);
+		device = NULL;
+		goto out;
 	}
-out:
-	BUG_ON(device == NULL);
+	list_add(&device->ig_list, &ig.device_list);
+
+inc_refcnt:
 	device->refcount++;
+out:
 	mutex_unlock(&ig.device_list_mutex);
 	return device;
 }
@@ -372,6 +368,12 @@ static void iser_addr_handler(struct rdma_cm_id *cma_id)
 	int    ret;
 
 	device = iser_device_find_by_ib_device(cma_id);
+	if (!device) {
+		iser_err("device lookup/creation failed\n");
+		iser_connect_error(cma_id);
+		return;
+	}
+
 	ib_conn = (struct iser_conn *)cma_id->context;
 	ib_conn->device = device;
 
@@ -380,7 +382,6 @@ static void iser_addr_handler(struct rdma_cm_id *cma_id)
 		iser_err("resolve route failed: %d\n", ret);
 		iser_connect_error(cma_id);
 	}
-	return;
 }
 
 static void iser_route_handler(struct rdma_cm_id *cma_id)

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-29 22:06 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-29 22:06 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get some more small post-2.6.25-rc3 fixes:

Arthur Jones (1):
      MAINTAINERS: update ipath owner

Jon Mason (1):
      RDMA/cxgb3: Return correct max_inline_data when creating a QP

Pete Wyckoff (2):
      Revert "IB/fmr_pool: ib_fmr_pool_flush() should flush all dirty FMRs"
      IB/fmr_pool: Flush all dirty FMRs from ib_fmr_pool_flush()

Sean Hefty (1):
      IB/cm: Flush workqueue when removing device

 MAINTAINERS                                 |    2 +-
 drivers/infiniband/core/cm.c                |    3 +-
 drivers/infiniband/core/fmr_pool.c          |   38 +++++++++++++++-----------
 drivers/infiniband/hw/cxgb3/iwch_provider.c |    3 ++
 4 files changed, 28 insertions(+), 18 deletions(-)


diff --git a/MAINTAINERS b/MAINTAINERS
index fed09b5..f229e16 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2143,7 +2143,7 @@ L:	netdev@vger.kernel.org
 S:	Maintained
 
 IPATH DRIVER:
-P:	Arthur Jones
+P:	Ralph Campbell
 M:	infinipath@qlogic.com
 L:	general@lists.openfabrics.org
 T:	git git://git.qlogic.com/ipath-linux-2.6
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index b10ade9..4df4051 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -3759,6 +3759,7 @@ static void cm_remove_one(struct ib_device *device)
 		port = cm_dev->port[i-1];
 		ib_modify_port(device, port->port_num, 0, &port_modify);
 		ib_unregister_mad_agent(port->mad_agent);
+		flush_workqueue(cm.wq);
 		cm_remove_port_fs(port);
 	}
 	kobject_put(&cm_dev->dev_obj);
@@ -3813,6 +3814,7 @@ static void __exit ib_cm_cleanup(void)
 		cancel_delayed_work(&timewait_info->work.work);
 	spin_unlock_irq(&cm.lock);
 
+	ib_unregister_client(&cm_client);
 	destroy_workqueue(cm.wq);
 
 	list_for_each_entry_safe(timewait_info, tmp, &cm.timewait_list, list) {
@@ -3820,7 +3822,6 @@ static void __exit ib_cm_cleanup(void)
 		kfree(timewait_info);
 	}
 
-	ib_unregister_client(&cm_client);
 	class_unregister(&cm_class);
 	idr_destroy(&cm.local_id_table);
 }
diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c
index 7f00347..06d502c 100644
--- a/drivers/infiniband/core/fmr_pool.c
+++ b/drivers/infiniband/core/fmr_pool.c
@@ -139,7 +139,7 @@ static inline struct ib_pool_fmr *ib_fmr_cache_lookup(struct ib_fmr_pool *pool,
 static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
 {
 	int                 ret;
-	struct ib_pool_fmr *fmr, *next;
+	struct ib_pool_fmr *fmr;
 	LIST_HEAD(unmap_list);
 	LIST_HEAD(fmr_list);
 
@@ -158,20 +158,6 @@ static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
 #endif
 	}
 
-	/*
-	 * The free_list may hold FMRs that have been put there
-	 * because they haven't reached the max_remap count.
-	 * Invalidate their mapping as well.
-	 */
-	list_for_each_entry_safe(fmr, next, &pool->free_list, list) {
-		if (fmr->remap_count == 0)
-			continue;
-		hlist_del_init(&fmr->cache_node);
-		fmr->remap_count = 0;
-		list_add_tail(&fmr->fmr->list, &fmr_list);
-		list_move(&fmr->list, &unmap_list);
-	}
-
 	list_splice(&pool->dirty_list, &unmap_list);
 	INIT_LIST_HEAD(&pool->dirty_list);
 	pool->dirty_len = 0;
@@ -384,6 +370,11 @@ void ib_destroy_fmr_pool(struct ib_fmr_pool *pool)
 
 	i = 0;
 	list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) {
+		if (fmr->remap_count) {
+			INIT_LIST_HEAD(&fmr_list);
+			list_add_tail(&fmr->fmr->list, &fmr_list);
+			ib_unmap_fmr(&fmr_list);
+		}
 		ib_dealloc_fmr(fmr->fmr);
 		list_del(&fmr->list);
 		kfree(fmr);
@@ -407,8 +398,23 @@ EXPORT_SYMBOL(ib_destroy_fmr_pool);
  */
 int ib_flush_fmr_pool(struct ib_fmr_pool *pool)
 {
-	int serial = atomic_inc_return(&pool->req_ser);
+	int serial;
+	struct ib_pool_fmr *fmr, *next;
+
+	/*
+	 * The free_list holds FMRs that may have been used
+	 * but have not been remapped enough times to be dirty.
+	 * Put them on the dirty list now so that the cleanup
+	 * thread will reap them too.
+	 */
+	spin_lock_irq(&pool->pool_lock);
+	list_for_each_entry_safe(fmr, next, &pool->free_list, list) {
+		if (fmr->remap_count > 0)
+			list_move(&fmr->list, &pool->dirty_list);
+	}
+	spin_unlock_irq(&pool->pool_lock);
 
+	serial = atomic_inc_return(&pool->req_ser);
 	wake_up_process(pool->thread);
 
 	if (wait_event_interruptible(pool->force_wait,
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index df1838f..ee3d63c 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -819,8 +819,11 @@ static struct ib_qp *iwch_create_qp(struct ib_pd *pd,
 		kfree(qhp);
 		return ERR_PTR(-ENOMEM);
 	}
+
 	attrs->cap.max_recv_wr = rqsize - 1;
 	attrs->cap.max_send_wr = sqsize;
+	attrs->cap.max_inline_data = T3_MAX_INLINE;
+
 	qhp->rhp = rhp;
 	qhp->attr.pd = php->pdid;
 	qhp->attr.scq = ((struct iwch_cq *) attrs->send_cq)->cq.cqid;

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-27  0:27 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-27  0:27 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a couple of small post-2.6.25-rc3 fixes, mostly to the
new nes driver:

Adrian Bunk (3):
      RDMA/nes: Fix off-by-one
      RDMA/nes: Fix a memory leak in schedule_nes_timer()
      RDMA/nes: Fix a check-after-use in nes_probe()

Bryan Rosenburg (1):
      RDMA/cxgb3: Fix shift calc in build_phys_page_list() for 1-entry page lists

Chien Tung (1):
      RDMA/nes: Resurrect error path dead code

Faisal Latif (2):
      RDMA/nes: Fix use-after-free in mini_cm_dec_refcnt_listen()
      RDMA/nes: Fix CRC endianness for RDMA connection establishment on big-endian

Glenn Streiff (1):
      RDMA/nes: Fix use-after-free in nes_create_cq()

John Lacombe (1):
      RDMA/nes: Fix interrupt moderation low threshold

Roland Dreier (1):
      MAINTAINERS: neteffect update

 MAINTAINERS                            |    2 ++
 drivers/infiniband/hw/cxgb3/iwch_mem.c |   10 ++--------
 drivers/infiniband/hw/nes/nes.c        |    2 +-
 drivers/infiniband/hw/nes/nes.h        |   15 +++++++++++++++
 drivers/infiniband/hw/nes/nes_cm.c     |   15 +++++++++------
 drivers/infiniband/hw/nes/nes_hw.c     |   13 +++++--------
 drivers/infiniband/hw/nes/nes_hw.h     |    2 +-
 drivers/infiniband/hw/nes/nes_verbs.c  |   10 ++++------
 8 files changed, 39 insertions(+), 30 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-19 18:51 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-19 18:51 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a couple of small post-2.6.25-rc2 fixes:

Pradeep Satyanarayana (1):
      IPoIB/cm: Fix ipoib_cm_dev_stop() cleanup when drain times out

Roland Dreier (1):
      IB/mthca: Free correct MPT on error exit from mthca_fmr_alloc()

 drivers/infiniband/hw/mthca/mthca_mr.c  |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |   10 ++++++----
 2 files changed, 7 insertions(+), 5 deletions(-)


diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index 3b69855..3538da1 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -686,7 +686,7 @@ err_out_table:
 	mthca_table_put(dev, dev->mr_table.mpt_table, key);
 
 err_out_mpt_free:
-	mthca_free(&dev->mr_table.mpt_alloc, mr->ibmr.lkey);
+	mthca_free(&dev->mr_table.mpt_alloc, key);
 	return err;
 }
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 7dd2ec4..52b1beb 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -824,7 +824,6 @@ void ipoib_cm_dev_stop(struct net_device *dev)
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct ipoib_cm_rx *p;
 	unsigned long begin;
-	LIST_HEAD(list);
 	int ret;
 
 	if (!IPOIB_CM_SUPPORTED(dev->dev_addr) || !priv->cm.id)
@@ -857,9 +856,12 @@ void ipoib_cm_dev_stop(struct net_device *dev)
 			/*
 			 * assume the HW is wedged and just free up everything.
 			 */
-			list_splice_init(&priv->cm.rx_flush_list, &list);
-			list_splice_init(&priv->cm.rx_error_list, &list);
-			list_splice_init(&priv->cm.rx_drain_list, &list);
+			list_splice_init(&priv->cm.rx_flush_list,
+					 &priv->cm.rx_reap_list);
+			list_splice_init(&priv->cm.rx_error_list,
+					 &priv->cm.rx_reap_list);
+			list_splice_init(&priv->cm.rx_drain_list,
+					 &priv->cm.rx_reap_list);
 			break;
 		}
 		spin_unlock_irq(&priv->lock);

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-18 20:35 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-18 20:35 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few post-2.6.25-rc2 fixes, mostly for the new nes driver:

Chien Tung (1):
      RDMA/nes: Fix VLAN support

Glenn Streiff (1):
      RDMA/nes: Fix MAC interrupt erroneously masked on ifdown

Li Zefan (1):
      IB: Fix return value in ib_device_register_sysfs()

Roland Dreier (1):
      RDMA/nes: Fix possible array overrun

 drivers/infiniband/core/sysfs.c       |    4 ++-
 drivers/infiniband/hw/nes/nes_nic.c   |   62 +++++++++++++++++++++++---------
 drivers/infiniband/hw/nes/nes_verbs.c |    2 +-
 3 files changed, 48 insertions(+), 20 deletions(-)


diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
index c864ef7..5a4b2e6 100644
--- a/drivers/infiniband/core/sysfs.c
+++ b/drivers/infiniband/core/sysfs.c
@@ -686,8 +686,10 @@ int ib_device_register_sysfs(struct ib_device *device)
 
 	device->ports_parent = kobject_create_and_add("ports",
 					kobject_get(&class_dev->kobj));
-	if (!device->ports_parent)
+	if (!device->ports_parent) {
+		ret = -ENOMEM;
 		goto err_put;
+	}
 
 	if (device->node_type == RDMA_NODE_IB_SWITCH) {
 		ret = add_port(device, 0);
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c
index b6cc265..eee77da 100644
--- a/drivers/infiniband/hw/nes/nes_nic.c
+++ b/drivers/infiniband/hw/nes/nes_nic.c
@@ -148,14 +148,15 @@ static int nes_netdev_open(struct net_device *netdev)
 	struct nes_device *nesdev = nesvnic->nesdev;
 	int ret;
 	int i;
-	struct nes_vnic *first_nesvnic;
+	struct nes_vnic *first_nesvnic = NULL;
 	u32 nic_active_bit;
 	u32 nic_active;
+	struct list_head *list_pos, *list_temp;
 
 	assert(nesdev != NULL);
 
-	first_nesvnic = list_entry(nesdev->nesadapter->nesvnic_list[nesdev->mac_index].next,
-			struct nes_vnic, list);
+	if (nesvnic->netdev_open == 1)
+		return 0;
 
 	if (netif_msg_ifup(nesvnic))
 		printk(KERN_INFO PFX "%s: enabling interface\n", netdev->name);
@@ -225,7 +226,18 @@ static int nes_netdev_open(struct net_device *netdev)
 	nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
 			nesvnic->nic_cq.cq_number);
 	nes_read32(nesdev->regs+NES_CQE_ALLOC);
-
+	list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
+		first_nesvnic = container_of(list_pos, struct nes_vnic, list);
+		if (first_nesvnic->netdev_open == 1)
+			break;
+	}
+	if (first_nesvnic->netdev_open == 0) {
+		nes_debug(NES_DBG_INIT, "Setting up MAC interrupt mask.\n");
+		nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK + (0x200 * nesdev->mac_index),
+				~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
+				NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
+		first_nesvnic = nesvnic;
+	}
 	if (first_nesvnic->linkup) {
 		/* Enable network packets */
 		nesvnic->linkup = 1;
@@ -248,6 +260,8 @@ static int nes_netdev_stop(struct net_device *netdev)
 	struct nes_device *nesdev = nesvnic->nesdev;
 	u32 nic_active_mask;
 	u32 nic_active;
+	struct nes_vnic *first_nesvnic = NULL;
+	struct list_head *list_pos, *list_temp;
 
 	nes_debug(NES_DBG_SHUTDOWN, "nesvnic=%p, nesdev=%p, netdev=%p %s\n",
 			nesvnic, nesdev, netdev, netdev->name);
@@ -260,9 +274,20 @@ static int nes_netdev_stop(struct net_device *netdev)
 	/* Disable network packets */
 	napi_disable(&nesvnic->napi);
 	netif_stop_queue(netdev);
-	if ((nesdev->netdev[0] == netdev) & (nesvnic->logical_port == nesdev->mac_index)) {
-		nes_write_indexed(nesdev,
-				NES_IDX_MAC_INT_MASK+(0x200*nesdev->mac_index), 0xffffffff);
+	list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
+		first_nesvnic = container_of(list_pos, struct nes_vnic, list);
+		if ((first_nesvnic->netdev_open == 1) && (first_nesvnic != nesvnic))
+			break;
+	}
+
+	if (first_nesvnic->netdev_open == 0)
+		nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK+(0x200*nesdev->mac_index), 0xffffffff);
+	else if ((first_nesvnic != nesvnic) &&
+		 (PCI_FUNC(first_nesvnic->nesdev->pcidev->devfn) != PCI_FUNC(nesvnic->nesdev->pcidev->devfn))) {
+		nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK + (0x200 * nesdev->mac_index), 0xffffffff);
+		nes_write_indexed(first_nesvnic->nesdev, NES_IDX_MAC_INT_MASK + (0x200 * first_nesvnic->nesdev->mac_index),
+				~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
+				NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
 	}
 
 	nic_active_mask = ~((u32)(1 << nesvnic->nic_index));
@@ -859,7 +884,6 @@ void nes_netdev_set_multicast_list(struct net_device *netdev)
 		for (mc_index=0; mc_index < NES_MULTICAST_PF_MAX; mc_index++) {
 			while (multicast_addr && nesvnic->mcrq_mcast_filter && ((mc_nic_index = nesvnic->mcrq_mcast_filter(nesvnic, multicast_addr->dmi_addr)) == 0))
 				multicast_addr = multicast_addr->next;
-
 			if (mc_nic_index < 0)
 				mc_nic_index = nesvnic->nic_index;
 			if (multicast_addr) {
@@ -908,7 +932,7 @@ static int nes_netdev_change_mtu(struct	net_device *netdev,	int	new_mtu)
 		return -EINVAL;
 
 	netdev->mtu	= new_mtu;
-	nesvnic->max_frame_size	= new_mtu+ETH_HLEN;
+	nesvnic->max_frame_size	= new_mtu + VLAN_ETH_HLEN;
 
 	if (netdev->mtu	> 1500)	{
 		jumbomode=1;
@@ -1470,10 +1494,15 @@ static void nes_netdev_vlan_rx_register(struct net_device *netdev, struct vlan_g
 {
 	struct nes_vnic *nesvnic = netdev_priv(netdev);
 	struct nes_device *nesdev = nesvnic->nesdev;
+	struct nes_adapter *nesadapter = nesdev->nesadapter;
 	u32 u32temp;
+	unsigned long flags;
 
+	spin_lock_irqsave(&nesadapter->phy_lock, flags);
 	nesvnic->vlan_grp = grp;
 
+	nes_debug(NES_DBG_NETDEV, "%s: %s\n", __func__, netdev->name);
+
 	/* Enable/Disable VLAN Stripping */
 	u32temp = nes_read_indexed(nesdev, NES_IDX_PCIX_DIAG);
 	if (grp)
@@ -1482,6 +1511,7 @@ static void nes_netdev_vlan_rx_register(struct net_device *netdev, struct vlan_g
 		u32temp	|= 0x02000000;
 
 	nes_write_indexed(nesdev, NES_IDX_PCIX_DIAG, u32temp);
+	spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
 }
 
 
@@ -1540,7 +1570,7 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
 	nesvnic->msg_enable = netif_msg_init(debug, default_msg);
 	nesvnic->netdev_index = nesdev->netdev_count;
 	nesvnic->perfect_filter_index = nesdev->nesadapter->netdev_count;
-	nesvnic->max_frame_size = netdev->mtu+netdev->hard_header_len;
+	nesvnic->max_frame_size = netdev->mtu + netdev->hard_header_len + VLAN_HLEN;
 
 	curr_qp_map = nic_qp_mapping_per_function[PCI_FUNC(nesdev->pcidev->devfn)];
 	nesvnic->nic.qp_id = curr_qp_map[nesdev->netdev_count].qpid;
@@ -1610,7 +1640,7 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
 	list_add_tail(&nesvnic->list, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]);
 
 	if ((nesdev->netdev_count == 0) &&
-			(PCI_FUNC(nesdev->pcidev->devfn) == nesdev->mac_index)) {
+	    (PCI_FUNC(nesdev->pcidev->devfn) == nesdev->mac_index)) {
 		nes_debug(NES_DBG_INIT, "Setting up PHY interrupt mask. Using register index 0x%04X\n",
 				NES_IDX_PHY_PCS_CONTROL_STATUS0+(0x200*(nesvnic->logical_port&1)));
 		u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
@@ -1648,18 +1678,14 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
 				nesvnic->linkup = 1;
 			}
 		}
-		nes_debug(NES_DBG_INIT, "Setting up MAC interrupt mask.\n");
 		/* clear the MAC interrupt status, assumes direct logical to physical mapping */
-		u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS+(0x200*nesvnic->logical_port));
+		u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index));
 		nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp);
-		nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS+(0x200*nesvnic->logical_port), u32temp);
+		nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp);
 
-		if (nesdev->nesadapter->phy_type[nesvnic->logical_port] != NES_PHY_TYPE_IRIS)
+		if (nesdev->nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_IRIS)
 			nes_init_phy(nesdev);
 
-		nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK+(0x200*nesvnic->logical_port),
-				~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
-				NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
 	}
 
 	return netdev;
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index ffd4b42..4dafbe1 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -1337,7 +1337,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
 								   NES_MAX_USER_WQ_REGIONS, nes_ucontext->first_free_wq);
 					/* nes_debug(NES_DBG_QP, "find_first_zero_biton wqs returned %u\n",
 							nespd->mmap_db_index); */
-					if (nesqp->mmap_sq_db_index > NES_MAX_USER_WQ_REGIONS) {
+					if (nesqp->mmap_sq_db_index >= NES_MAX_USER_WQ_REGIONS) {
 						nes_debug(NES_DBG_QP,
 							  "db index > max user regions, failing create QP\n");
 						nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-14 23:31 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-14 23:31 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few post-2.6.25-rc1 fixes:

Eli Cohen (1):
      IPoIB: Remove unused struct ipoib_cm_tx.ibwc member

Jack Morgenstein (3):
      IPoIB: On P_Key change event, reset state properly
      IB/mlx4: mlx4_ib_fmr_alloc() should call mlx4_fmr_enable()
      mlx4_core: Move table_find from fmr_alloc to fmr_enable

Marcin Slusarz (1):
      IB/mthca: Convert to use be16_add_cpu()

Roland Dreier (3):
      IB/mthca: Add missing sg_init_table() in mthca_map_user_db()
      IB/cm: Remove debug printk()s that snuck upstream
      IB/cm: Fix infiniband_cm class kobject ref counting

Sean Hefty (1):
      RDMA/cma: Do not issue MRA if user rejects connection request

Steve Wise (1):
      RDMA/cxgb3: Fail loopback connections

 drivers/infiniband/core/cm.c                |   26 ++++++++------------------
 drivers/infiniband/core/cma.c               |   10 +++++++++-
 drivers/infiniband/hw/cxgb3/iwch_cm.c       |   17 +++++++++++++++++
 drivers/infiniband/hw/mlx4/mr.c             |    2 +-
 drivers/infiniband/hw/mthca/mthca_cq.c      |    2 +-
 drivers/infiniband/hw/mthca/mthca_memfree.c |    1 +
 drivers/infiniband/ulp/ipoib/ipoib.h        |    1 -
 drivers/infiniband/ulp/ipoib/ipoib_ib.c     |    1 +
 drivers/net/mlx4/mr.c                       |   21 +++++++++++++--------
 9 files changed, 51 insertions(+), 30 deletions(-)


diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 638b727..b10ade9 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -3587,8 +3587,6 @@ static void cm_release_port_obj(struct kobject *obj)
 {
 	struct cm_port *cm_port;
 
-	printk(KERN_ERR "free cm port\n");
-
 	cm_port = container_of(obj, struct cm_port, port_obj);
 	kfree(cm_port);
 }
@@ -3601,8 +3599,6 @@ static void cm_release_dev_obj(struct kobject *obj)
 {
 	struct cm_device *cm_dev;
 
-	printk(KERN_ERR "free cm dev\n");
-
 	cm_dev = container_of(obj, struct cm_device, dev_obj);
 	kfree(cm_dev);
 }
@@ -3616,18 +3612,12 @@ struct class cm_class = {
 };
 EXPORT_SYMBOL(cm_class);
 
-static void cm_remove_fs_obj(struct kobject *obj)
-{
-	kobject_put(obj->parent);
-	kobject_put(obj);
-}
-
 static int cm_create_port_fs(struct cm_port *port)
 {
 	int i, ret;
 
 	ret = kobject_init_and_add(&port->port_obj, &cm_port_obj_type,
-				   kobject_get(&port->cm_dev->dev_obj),
+				   &port->cm_dev->dev_obj,
 				   "%d", port->port_num);
 	if (ret) {
 		kfree(port);
@@ -3637,7 +3627,7 @@ static int cm_create_port_fs(struct cm_port *port)
 	for (i = 0; i < CM_COUNTER_GROUPS; i++) {
 		ret = kobject_init_and_add(&port->counter_group[i].obj,
 					   &cm_counter_obj_type,
-					   kobject_get(&port->port_obj),
+					   &port->port_obj,
 					   "%s", counter_group_names[i]);
 		if (ret)
 			goto error;
@@ -3647,8 +3637,8 @@ static int cm_create_port_fs(struct cm_port *port)
 
 error:
 	while (i--)
-		cm_remove_fs_obj(&port->counter_group[i].obj);
-	cm_remove_fs_obj(&port->port_obj);
+		kobject_put(&port->counter_group[i].obj);
+	kobject_put(&port->port_obj);
 	return ret;
 
 }
@@ -3658,9 +3648,9 @@ static void cm_remove_port_fs(struct cm_port *port)
 	int i;
 
 	for (i = 0; i < CM_COUNTER_GROUPS; i++)
-		cm_remove_fs_obj(&port->counter_group[i].obj);
+		kobject_put(&port->counter_group[i].obj);
 
-	cm_remove_fs_obj(&port->port_obj);
+	kobject_put(&port->port_obj);
 }
 
 static void cm_add_one(struct ib_device *device)
@@ -3744,7 +3734,7 @@ error1:
 		ib_unregister_mad_agent(port->mad_agent);
 		cm_remove_port_fs(port);
 	}
-	cm_remove_fs_obj(&cm_dev->dev_obj);
+	kobject_put(&cm_dev->dev_obj);
 }
 
 static void cm_remove_one(struct ib_device *device)
@@ -3771,7 +3761,7 @@ static void cm_remove_one(struct ib_device *device)
 		ib_unregister_mad_agent(port->mad_agent);
 		cm_remove_port_fs(port);
 	}
-	cm_remove_fs_obj(&cm_dev->dev_obj);
+	kobject_put(&cm_dev->dev_obj);
 }
 
 static int __init ib_cm_init(void)
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 1eff1b2..34507da 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1107,7 +1107,6 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 		event.param.ud.private_data_len =
 				IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset;
 	} else {
-		ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
 		conn_id = cma_new_conn_id(&listen_id->id, ib_event);
 		cma_set_req_event_data(&event, &ib_event->param.req_rcvd,
 				       ib_event->private_data, offset);
@@ -1130,6 +1129,15 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 
 	ret = conn_id->id.event_handler(&conn_id->id, &event);
 	if (!ret) {
+		/*
+		 * Acquire mutex to prevent user executing rdma_destroy_id()
+		 * while we're accessing the cm_id.
+		 */
+		mutex_lock(&lock);
+		if (cma_comp(conn_id, CMA_CONNECT) &&
+		    !cma_is_ud_ps(conn_id->id.ps))
+			ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
+		mutex_unlock(&lock);
 		cma_enable_remove(conn_id);
 		goto out;
 	}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index e9a08fa..320f2b6 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -35,6 +35,7 @@
 #include <linux/skbuff.h>
 #include <linux/timer.h>
 #include <linux/notifier.h>
+#include <linux/inetdevice.h>
 
 #include <net/neighbour.h>
 #include <net/netevent.h>
@@ -1784,6 +1785,17 @@ err:
 	return err;
 }
 
+static int is_loopback_dst(struct iw_cm_id *cm_id)
+{
+	struct net_device *dev;
+
+	dev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr);
+	if (!dev)
+		return 0;
+	dev_put(dev);
+	return 1;
+}
+
 int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
 {
 	int err = 0;
@@ -1791,6 +1803,11 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
 	struct iwch_ep *ep;
 	struct rtable *rt;
 
+	if (is_loopback_dst(cm_id)) {
+		err = -ENOSYS;
+		goto out;
+	}
+
 	ep = alloc_ep(sizeof(*ep), GFP_KERNEL);
 	if (!ep) {
 		printk(KERN_ERR MOD "%s - cannot alloc ep.\n", __FUNCTION__);
diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c
index 7dc91a3..fe2c2e9 100644
--- a/drivers/infiniband/hw/mlx4/mr.c
+++ b/drivers/infiniband/hw/mlx4/mr.c
@@ -199,7 +199,7 @@ struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int acc,
 	if (err)
 		goto err_free;
 
-	err = mlx4_mr_enable(to_mdev(pd->device)->dev, &fmr->mfmr.mr);
+	err = mlx4_fmr_enable(to_mdev(pd->device)->dev, &fmr->mfmr);
 	if (err)
 		goto err_mr;
 
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index 6bd9f13..1e1e336 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -473,7 +473,7 @@ static void handle_error_cqe(struct mthca_dev *dev, struct mthca_cq *cq,
 	if (!(new_wqe & cpu_to_be32(0x3f)) || (!cqe->db_cnt && dbd))
 		return;
 
-	cqe->db_cnt   = cpu_to_be16(be16_to_cpu(cqe->db_cnt) - dbd);
+	be16_add_cpu(&cqe->db_cnt, -dbd);
 	cqe->wqe      = new_wqe;
 	cqe->syndrome = SYNDROME_WR_FLUSH_ERR;
 
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c
index 1f4d27d..252db08 100644
--- a/drivers/infiniband/hw/mthca/mthca_memfree.c
+++ b/drivers/infiniband/hw/mthca/mthca_memfree.c
@@ -542,6 +542,7 @@ struct mthca_user_db_table *mthca_init_user_db_tab(struct mthca_dev *dev)
 	for (i = 0; i < npages; ++i) {
 		db_tab->page[i].refcount = 0;
 		db_tab->page[i].uvirt    = 0;
+		sg_init_table(&db_tab->page[i].mem, 1);
 	}
 
 	return db_tab;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index f9b7caa..054fab8 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -209,7 +209,6 @@ struct ipoib_cm_tx {
 	unsigned	     tx_tail;
 	unsigned long	     flags;
 	u32		     mtu;
-	struct ib_wc	     ibwc[IPOIB_NUM_WC];
 };
 
 struct ipoib_cm_rx_buf {
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 9d3e778..08c4396 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -780,6 +780,7 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, int pkey_event)
 		if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &new_index)) {
 			clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
 			ipoib_ib_dev_down(dev, 0);
+			ipoib_ib_dev_stop(dev, 0);
 			ipoib_pkey_dev_delay_open(dev);
 			return;
 		}
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index 679dfdb..79b317b 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -578,13 +578,6 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages,
 		goto err_free;
 	}
 
-	fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table,
-				    key_to_hw_index(fmr->mr.key), NULL);
-	if (!fmr->mpt) {
-		err = -ENOMEM;
-		goto err_free;
-	}
-
 	return 0;
 
 err_free:
@@ -595,7 +588,19 @@ EXPORT_SYMBOL_GPL(mlx4_fmr_alloc);
 
 int mlx4_fmr_enable(struct mlx4_dev *dev, struct mlx4_fmr *fmr)
 {
-	return mlx4_mr_enable(dev, &fmr->mr);
+	struct mlx4_priv *priv = mlx4_priv(dev);
+	int err;
+
+	err = mlx4_mr_enable(dev, &fmr->mr);
+	if (err)
+		return err;
+
+	fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table,
+				    key_to_hw_index(fmr->mr.key), NULL);
+	if (!fmr->mpt)
+		return -ENOMEM;
+
+	return 0;
 }
 EXPORT_SYMBOL_GPL(mlx4_fmr_enable);
 

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-11 22:25 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-11 22:25 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one build fix:

Olof Johansson (1):
      mlx4_core: Fix build break (missing include)

 drivers/net/mlx4/alloc.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


diff --git a/drivers/net/mlx4/alloc.c b/drivers/net/mlx4/alloc.c
index 521dc03..75ef9d0 100644
--- a/drivers/net/mlx4/alloc.c
+++ b/drivers/net/mlx4/alloc.c
@@ -34,6 +34,7 @@
 #include <linux/slab.h>
 #include <linux/bitmap.h>
 #include <linux/dma-mapping.h>
+#include <linux/vmalloc.h>
 
 #include "mlx4.h"
 

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-08 23:16 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-08 23:16 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the last batch of InfiniBand/RDMA merges for 2.6.25,
mostly preparation for enabling stateless offloads for IP-over-InfiniBand.

Eli Cohen (3):
      IPoIB: Add high DMA feature flag
      IPoIB: Add send gather support
      IB/core: Add IP checksum offload support

Jack Morgenstein (2):
      mlx4_core: For 64-bit systems, vmap() kernel queue buffers
      IB/mlx4: Use multiple WQ blocks to post smaller send WQEs

Roland Dreier (3):
      IB/mlx4: Consolidate code to get an entry from a struct mlx4_buf
      mlx4_core: Clean up struct mlx4_buf
      IB/core: Remove unused struct ib_device.flags member

 drivers/infiniband/hw/mlx4/cq.c            |   20 ++--
 drivers/infiniband/hw/mlx4/mlx4_ib.h       |    2 +
 drivers/infiniband/hw/mlx4/qp.c            |  216 +++++++++++++++++++++++-----
 drivers/infiniband/hw/mlx4/srq.c           |    8 +-
 drivers/infiniband/ulp/ipoib/ipoib.h       |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c    |   10 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c    |   89 +++++++++---
 drivers/infiniband/ulp/ipoib/ipoib_main.c  |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c |   10 +-
 drivers/net/mlx4/alloc.c                   |   48 ++++--
 drivers/net/mlx4/mr.c                      |    4 +-
 include/linux/mlx4/device.h                |   19 ++-
 include/linux/mlx4/qp.h                    |    4 +
 include/rdma/ib_verbs.h                    |   16 ++-
 14 files changed, 342 insertions(+), 112 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2008-02-05  4:49 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-02-05  4:49 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general, gstreiff

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a second batch of InfiniBand/RDMA batches.  In addition
to the usual motley crew of changes, this pull includes a new driver
for NetEffect RNICs in drivers/infiniband/hw/nes.  The code could use
some further cleaning, but I don't think it's worth holding off on the
merge.

David Dillow (1):
      IB/srp: Retry stale connections

Eli Cohen (2):
      IB/mthca: Remove checks for srq->first_free < 0
      IB/ib_mthca: Pre-link receive WQEs in Tavor mode

Glenn Streiff (1):
      RDMA/nes: Add a driver for NetEffect RNICs

Hoang-Nam Nguyen (1):
      IB/ehca: Add PMA support

Jack Morgenstein (2):
      IB/mthca: Don't read reserved fields in mthca_QUERY_ADAPTER()
      mlx4_core: Don't read reserved fields in mlx4_QUERY_ADAPTER()

Joachim Fenkes (2):
      IB/ehca: Prevent sending UD packets to QP0
      IB/ehca: Update sma_attr also in case of disruptive config change

Olaf Kirch (1):
      IB/mthca: Return proper error codes from mthca_fmr_alloc()

Or Gerlitz (3):
      IPoIB: Handle bonding failover race for connected neighbours too
      IPoIB: Remove a misleading debug print
      IB/fmr_pool: Allocate page list for pool FMRs only when caching enabled

Roland Dreier (4):
      mlx4_core: Fix more section mismatches
      IB/mthca: Fix and simplify page size calculation in mthca_reg_phys_mr()
      IB/mlx4: Actually print out the driver version
      IB: Avoid marking __devinitdata as const

Sean Hefty (1):
      IB/cm: Add interim support for routed paths

 MAINTAINERS                                  |   10 +
 drivers/infiniband/Kconfig                   |    2 +-
 drivers/infiniband/Makefile                  |    1 +
 drivers/infiniband/core/cm.c                 |   89 +-
 drivers/infiniband/core/fmr_pool.c           |    7 +-
 drivers/infiniband/hw/ehca/ehca_classes.h    |    1 +
 drivers/infiniband/hw/ehca/ehca_irq.c        |    2 +
 drivers/infiniband/hw/ehca/ehca_iverbs.h     |    5 +
 drivers/infiniband/hw/ehca/ehca_main.c       |    2 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c       |    4 +
 drivers/infiniband/hw/ehca/ehca_sqp.c        |   91 +
 drivers/infiniband/hw/mlx4/main.c            |   10 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c      |   11 +-
 drivers/infiniband/hw/mthca/mthca_main.c     |    5 +-
 drivers/infiniband/hw/mthca/mthca_mr.c       |    8 +-
 drivers/infiniband/hw/mthca/mthca_provider.c |   22 +-
 drivers/infiniband/hw/mthca/mthca_qp.c       |   13 +-
 drivers/infiniband/hw/mthca/mthca_srq.c      |   47 +-
 drivers/infiniband/hw/nes/Kconfig            |   16 +
 drivers/infiniband/hw/nes/Makefile           |    3 +
 drivers/infiniband/hw/nes/nes.c              | 1152 ++++++++
 drivers/infiniband/hw/nes/nes.h              |  560 ++++
 drivers/infiniband/hw/nes/nes_cm.c           | 3088 ++++++++++++++++++++
 drivers/infiniband/hw/nes/nes_cm.h           |  433 +++
 drivers/infiniband/hw/nes/nes_context.h      |  193 ++
 drivers/infiniband/hw/nes/nes_hw.c           | 3080 ++++++++++++++++++++
 drivers/infiniband/hw/nes/nes_hw.h           | 1206 ++++++++
 drivers/infiniband/hw/nes/nes_nic.c          | 1703 +++++++++++
 drivers/infiniband/hw/nes/nes_user.h         |  112 +
 drivers/infiniband/hw/nes/nes_utils.c        |  917 ++++++
 drivers/infiniband/hw/nes/nes_verbs.c        | 3917 ++++++++++++++++++++++++++
 drivers/infiniband/hw/nes/nes_verbs.h        |  169 ++
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |   19 +-
 drivers/infiniband/ulp/srp/ib_srp.c          |   53 +-
 drivers/infiniband/ulp/srp/ib_srp.h          |    1 +
 drivers/net/mlx4/fw.c                        |    6 -
 drivers/net/mlx4/fw.h                        |    3 -
 drivers/net/mlx4/main.c                      |   11 +-
 drivers/net/mlx4/mr.c                        |    2 +-
 39 files changed, 16848 insertions(+), 126 deletions(-)
 create mode 100644 drivers/infiniband/hw/nes/Kconfig
 create mode 100644 drivers/infiniband/hw/nes/Makefile
 create mode 100644 drivers/infiniband/hw/nes/nes.c
 create mode 100644 drivers/infiniband/hw/nes/nes.h
 create mode 100644 drivers/infiniband/hw/nes/nes_cm.c
 create mode 100644 drivers/infiniband/hw/nes/nes_cm.h
 create mode 100644 drivers/infiniband/hw/nes/nes_context.h
 create mode 100644 drivers/infiniband/hw/nes/nes_hw.c
 create mode 100644 drivers/infiniband/hw/nes/nes_hw.h
 create mode 100644 drivers/infiniband/hw/nes/nes_nic.c
 create mode 100644 drivers/infiniband/hw/nes/nes_user.h
 create mode 100644 drivers/infiniband/hw/nes/nes_utils.c
 create mode 100644 drivers/infiniband/hw/nes/nes_verbs.c
 create mode 100644 drivers/infiniband/hw/nes/nes_verbs.h

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

* [GIT PULL] please pull infiniband.git
@ 2008-01-16 22:46 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-01-16 22:46 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the commit below, which moves a little code around to
make a couple of major MPI implementations work on ipath devices:

 drivers/infiniband/hw/ipath/ipath_ud.c |   44 ++++++++++++++++----------------
 1 files changed, 22 insertions(+), 22 deletions(-)

commit 0a69631b2869093d7306e8f66cca8eb0a05aa919
Author: Ralph Campbell <ralph.campbell@qlogic.com>
Date:   Tue Jan 15 15:58:13 2008 -0800

    IB/ipath: Fix receiving UD messages with immediate data
    
    This fixes a small bug in ipath_ud_rcv()'s handling of UD messages
    with immediate data.  We need to test whether immediate data is
    present and update the header size accordingly *before* testing the
    packet size from the header against the actual received length.
    Otherwise the wrong header size will be used and all messages with
    immediate data will be dropped.
    
    This bug keeps MVAPICH-UD and HP MPI from working at all on ipath devices.
    
    Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>
---
diff --git a/drivers/infiniband/hw/ipath/ipath_ud.c b/drivers/infiniband/hw/ipath/ipath_ud.c
index 16a2a93..b3df6f3 100644
--- a/drivers/infiniband/hw/ipath/ipath_ud.c
+++ b/drivers/infiniband/hw/ipath/ipath_ud.c
@@ -455,6 +455,28 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
 		}
 	}
 
+	/*
+	 * The opcode is in the low byte when its in network order
+	 * (top byte when in host order).
+	 */
+	opcode = be32_to_cpu(ohdr->bth[0]) >> 24;
+	if (qp->ibqp.qp_num > 1 &&
+	    opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) {
+		if (header_in_data) {
+			wc.imm_data = *(__be32 *) data;
+			data += sizeof(__be32);
+		} else
+			wc.imm_data = ohdr->u.ud.imm_data;
+		wc.wc_flags = IB_WC_WITH_IMM;
+		hdrsize += sizeof(u32);
+	} else if (opcode == IB_OPCODE_UD_SEND_ONLY) {
+		wc.imm_data = 0;
+		wc.wc_flags = 0;
+	} else {
+		dev->n_pkt_drops++;
+		goto bail;
+	}
+
 	/* Get the number of bytes the message was padded by. */
 	pad = (be32_to_cpu(ohdr->bth[0]) >> 20) & 3;
 	if (unlikely(tlen < (hdrsize + pad + 4))) {
@@ -482,28 +504,6 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
 	wc.byte_len = tlen + sizeof(struct ib_grh);
 
 	/*
-	 * The opcode is in the low byte when its in network order
-	 * (top byte when in host order).
-	 */
-	opcode = be32_to_cpu(ohdr->bth[0]) >> 24;
-	if (qp->ibqp.qp_num > 1 &&
-	    opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) {
-		if (header_in_data) {
-			wc.imm_data = *(__be32 *) data;
-			data += sizeof(__be32);
-		} else
-			wc.imm_data = ohdr->u.ud.imm_data;
-		wc.wc_flags = IB_WC_WITH_IMM;
-		hdrsize += sizeof(u32);
-	} else if (opcode == IB_OPCODE_UD_SEND_ONLY) {
-		wc.imm_data = 0;
-		wc.wc_flags = 0;
-	} else {
-		dev->n_pkt_drops++;
-		goto bail;
-	}
-
-	/*
 	 * Get the next work request entry to find where to put the data.
 	 */
 	if (qp->r_reuse_sge)

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

* [GIT PULL] please pull infiniband.git
@ 2008-01-08 20:25 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2008-01-08 20:25 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few one-line fixes: change a maintainer email address
that is going away soon, fix a bug that would make the second port on
some HCAs useless, and fix SRP the right way now that the root cause
is fixed via James's tree.

(And just to counter James's suggestion that the SRP user base is
comparable to voyager's: these SRP fixes are coming from a real
production user, and that user is @ornl.gov, which means that SRP is
actually being used to do something involving things like atomic bombs
or sharks with laser beams)

Dave Dillow (1):
      IB/srp: Release transport before removing host

Dotan Barak (1):
      IB/mlx4: Fix value of pkey_index in QP1 completions

Sean Hefty (1):
      MAINTAINERS: Update Sean Hefty's email address

 MAINTAINERS                         |    2 +-
 drivers/infiniband/hw/mlx4/cq.c     |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c |    2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)


diff --git a/MAINTAINERS b/MAINTAINERS
index 79c711e..56e6159 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1919,7 +1919,7 @@ INFINIBAND SUBSYSTEM
 P:	Roland Dreier
 M:	rolandd@cisco.com
 P:	Sean Hefty
-M:	mshefty@ichips.intel.com
+M:	sean.hefty@intel.com
 P:	Hal Rosenstock
 M:	hal.rosenstock@gmail.com 
 L:	general@lists.openfabrics.org
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 8bf44da..9d32c49 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -430,7 +430,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
 		wc->dlid_path_bits = (be32_to_cpu(cqe->g_mlpath_rqpn) >> 24) & 0x7f;
 		wc->wc_flags      |= be32_to_cpu(cqe->g_mlpath_rqpn) & 0x80000000 ?
 			IB_WC_GRH : 0;
-		wc->pkey_index     = be32_to_cpu(cqe->immed_rss_invalid) >> 16;
+		wc->pkey_index     = be32_to_cpu(cqe->immed_rss_invalid) & 0x7f;
 	}
 
 	return 0;
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 77e8b90..bdb6f85 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -2053,8 +2053,8 @@ static void srp_remove_one(struct ib_device *device)
 
 		list_for_each_entry_safe(target, tmp_target,
 					 &host->target_list, list) {
-			scsi_remove_host(target->scsi_host);
 			srp_remove_host(target->scsi_host);
+			scsi_remove_host(target->scsi_host);
 			srp_disconnect_target(target);
 			ib_destroy_cm_id(target->cm_id);
 			srp_free_target_ib(target);

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

* [GIT PULL] please pull infiniband.git
@ 2007-12-13 17:39 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-12-13 17:39 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will pull a few small ehca driver fixes for 2.6.24:

Joachim Fenkes (3):
      IB/ehca: Return correct number of SGEs for SRQ
      IB/ehca: Serialize HCA-related hCalls if necessary
      IB/ehca: Fix lock flag variable location, bump version number

 drivers/infiniband/hw/ehca/ehca_classes.h |    1 +
 drivers/infiniband/hw/ehca/ehca_main.c    |   15 ++++++++++++++-
 drivers/infiniband/hw/ehca/ehca_qp.c      |    4 ++--
 drivers/infiniband/hw/ehca/hcp_if.c       |   27 ++++++++++-----------------
 drivers/infiniband/hw/ehca/hipz_hw.h      |    1 +
 5 files changed, 28 insertions(+), 20 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 87f12d4..74d2b72 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -322,6 +322,7 @@ extern int ehca_static_rate;
 extern int ehca_port_act_time;
 extern int ehca_use_hp_mr;
 extern int ehca_scaling_code;
+extern int ehca_lock_hcalls;
 
 struct ipzu_queue_resp {
 	u32 qe_size;      /* queue entry size */
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 90d4334..6a56d86 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -43,13 +43,14 @@
 #ifdef CONFIG_PPC_64K_PAGES
 #include <linux/slab.h>
 #endif
+
 #include "ehca_classes.h"
 #include "ehca_iverbs.h"
 #include "ehca_mrmw.h"
 #include "ehca_tools.h"
 #include "hcp_if.h"
 
-#define HCAD_VERSION "0024"
+#define HCAD_VERSION "0025"
 
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
@@ -66,6 +67,7 @@ int ehca_poll_all_eqs  = 1;
 int ehca_static_rate   = -1;
 int ehca_scaling_code  = 0;
 int ehca_mr_largepage  = 1;
+int ehca_lock_hcalls   = -1;
 
 module_param_named(open_aqp1,     ehca_open_aqp1,     int, S_IRUGO);
 module_param_named(debug_level,   ehca_debug_level,   int, S_IRUGO);
@@ -77,6 +79,7 @@ module_param_named(poll_all_eqs,  ehca_poll_all_eqs,  int, S_IRUGO);
 module_param_named(static_rate,   ehca_static_rate,   int, S_IRUGO);
 module_param_named(scaling_code,  ehca_scaling_code,  int, S_IRUGO);
 module_param_named(mr_largepage,  ehca_mr_largepage,  int, S_IRUGO);
+module_param_named(lock_hcalls,   ehca_lock_hcalls,   bool, S_IRUGO);
 
 MODULE_PARM_DESC(open_aqp1,
 		 "AQP1 on startup (0: no (default), 1: yes)");
@@ -102,6 +105,9 @@ MODULE_PARM_DESC(scaling_code,
 MODULE_PARM_DESC(mr_largepage,
 		 "use large page for MR (0: use PAGE_SIZE (default), "
 		 "1: use large page depending on MR size");
+MODULE_PARM_DESC(lock_hcalls,
+		 "serialize all hCalls made by the driver "
+		 "(default: autodetect)");
 
 DEFINE_RWLOCK(ehca_qp_idr_lock);
 DEFINE_RWLOCK(ehca_cq_idr_lock);
@@ -258,6 +264,7 @@ static struct cap_descr {
 	{ HCA_CAP_UD_LL_QP, "HCA_CAP_UD_LL_QP" },
 	{ HCA_CAP_RESIZE_MR, "HCA_CAP_RESIZE_MR" },
 	{ HCA_CAP_MINI_QP, "HCA_CAP_MINI_QP" },
+	{ HCA_CAP_H_ALLOC_RES_SYNC, "HCA_CAP_H_ALLOC_RES_SYNC" },
 };
 
 static int ehca_sense_attributes(struct ehca_shca *shca)
@@ -333,6 +340,12 @@ static int ehca_sense_attributes(struct ehca_shca *shca)
 		if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap))
 			ehca_gen_dbg("   %s", hca_cap_descr[i].descr);
 
+	/* Autodetect hCall locking -- the "H_ALLOC_RESOURCE synced" flag is
+	 * a firmware property, so it's valid across all adapters
+	 */
+	if (ehca_lock_hcalls == -1)
+		ehca_lock_hcalls = !(shca->hca_cap & HCA_CAP_H_ALLOC_RES_SYNC);
+
 	/* translate supported MR page sizes; always support 4K */
 	shca->hca_cap_mr_pgsize = EHCA_PAGESIZE;
 	if (ehca_mr_largepage) { /* support extra sizes only if enabled */
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index dd12668..eff5fb5 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -838,7 +838,7 @@ struct ib_srq *ehca_create_srq(struct ib_pd *pd,
 
 	/* copy back return values */
 	srq_init_attr->attr.max_wr = qp_init_attr.cap.max_recv_wr;
-	srq_init_attr->attr.max_sge = qp_init_attr.cap.max_recv_sge;
+	srq_init_attr->attr.max_sge = 3;
 
 	/* drive SRQ into RTR state */
 	mqpcb = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
@@ -1750,7 +1750,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 = qpcb->actual_nr_sges_in_rq_wqe;
+	srq_attr->max_sge = 3;
 	srq_attr->srq_limit = EHCA_BMASK_GET(
 		MQPCB_CURR_SRQ_LIMIT, qpcb->curr_srq_limit);
 
diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c
index c16a213..7029aa6 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.c
+++ b/drivers/infiniband/hw/ehca/hcp_if.c
@@ -120,26 +120,21 @@ static long ehca_plpar_hcall_norets(unsigned long opcode,
 				    unsigned long arg7)
 {
 	long ret;
-	int i, sleep_msecs, do_lock;
-	unsigned long flags;
+	int i, sleep_msecs;
+	unsigned long flags = 0;
 
 	ehca_gen_dbg("opcode=%lx " HCALL7_REGS_FORMAT,
 		     opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
 
-	/* lock H_FREE_RESOURCE(MR) against itself and H_ALLOC_RESOURCE(MR) */
-	if ((opcode == H_FREE_RESOURCE) && (arg7 == 5)) {
-		arg7 = 0; /* better not upset firmware */
-		do_lock = 1;
-	}
-
 	for (i = 0; i < 5; i++) {
-		if (do_lock)
+		/* serialize hCalls to work around firmware issue */
+		if (ehca_lock_hcalls)
 			spin_lock_irqsave(&hcall_lock, flags);
 
 		ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4,
 					 arg5, arg6, arg7);
 
-		if (do_lock)
+		if (ehca_lock_hcalls)
 			spin_unlock_irqrestore(&hcall_lock, flags);
 
 		if (H_IS_LONG_BUSY(ret)) {
@@ -174,24 +169,22 @@ static long ehca_plpar_hcall9(unsigned long opcode,
 			      unsigned long arg9)
 {
 	long ret;
-	int i, sleep_msecs, do_lock;
+	int i, sleep_msecs;
 	unsigned long flags = 0;
 
 	ehca_gen_dbg("INPUT -- opcode=%lx " HCALL9_REGS_FORMAT, opcode,
 		     arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
 
-	/* lock H_ALLOC_RESOURCE(MR) against itself and H_FREE_RESOURCE(MR) */
-	do_lock = ((opcode == H_ALLOC_RESOURCE) && (arg2 == 5));
-
 	for (i = 0; i < 5; i++) {
-		if (do_lock)
+		/* serialize hCalls to work around firmware issue */
+		if (ehca_lock_hcalls)
 			spin_lock_irqsave(&hcall_lock, flags);
 
 		ret = plpar_hcall9(opcode, outs,
 				   arg1, arg2, arg3, arg4, arg5,
 				   arg6, arg7, arg8, arg9);
 
-		if (do_lock)
+		if (ehca_lock_hcalls)
 			spin_unlock_irqrestore(&hcall_lock, flags);
 
 		if (H_IS_LONG_BUSY(ret)) {
@@ -821,7 +814,7 @@ u64 hipz_h_free_resource_mr(const struct ipz_adapter_handle adapter_handle,
 	return ehca_plpar_hcall_norets(H_FREE_RESOURCE,
 				       adapter_handle.handle,    /* r4 */
 				       mr->ipz_mr_handle.handle, /* r5 */
-				       0, 0, 0, 0, 5);
+				       0, 0, 0, 0, 0);
 }
 
 u64 hipz_h_reregister_pmr(const struct ipz_adapter_handle adapter_handle,
diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h
index 485b840..bf996c7 100644
--- a/drivers/infiniband/hw/ehca/hipz_hw.h
+++ b/drivers/infiniband/hw/ehca/hipz_hw.h
@@ -378,6 +378,7 @@ struct hipz_query_hca {
 #define HCA_CAP_UD_LL_QP              EHCA_BMASK_IBM(16, 16)
 #define HCA_CAP_RESIZE_MR             EHCA_BMASK_IBM(17, 17)
 #define HCA_CAP_MINI_QP               EHCA_BMASK_IBM(18, 18)
+#define HCA_CAP_H_ALLOC_RES_SYNC      EHCA_BMASK_IBM(19, 19)
 
 /* query port response block */
 struct hipz_query_port {

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

* [GIT PULL] please pull infiniband.git
@ 2007-12-01  4:03 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-12-01  4:03 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get two small fixes for 2.6.24:

Jack Morgenstein (1):
      IPoIB: Fix oops if xmit is called when priv->broadcast is NULL

Joachim Fenkes (1):
      IB/ehca: Fix static rate if path faster than link

 drivers/infiniband/hw/ehca/ehca_av.c      |    8 ++++++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c |    3 +++
 2 files changed, 9 insertions(+), 2 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_av.c b/drivers/infiniband/hw/ehca/ehca_av.c
index 453eb99..f7782c8 100644
--- a/drivers/infiniband/hw/ehca/ehca_av.c
+++ b/drivers/infiniband/hw/ehca/ehca_av.c
@@ -76,8 +76,12 @@ int ehca_calc_ipd(struct ehca_shca *shca, int port,
 
 	link = ib_width_enum_to_int(pa.active_width) * pa.active_speed;
 
-	/* IPD = round((link / path) - 1) */
-	*ipd = ((link + (path >> 1)) / path) - 1;
+	if (path >= link)
+		/* no need to throttle if path faster than link */
+		*ipd = 0;
+	else
+		/* IPD = round((link / path) - 1) */
+		*ipd = ((link + (path >> 1)) / path) - 1;
 
 	return 0;
 }
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index a03a65e..c9f6077 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -460,6 +460,9 @@ static struct ipoib_path *path_rec_create(struct net_device *dev, void *gid)
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct ipoib_path *path;
 
+	if (!priv->broadcast)
+		return NULL;
+
 	path = kzalloc(sizeof *path, GFP_ATOMIC);
 	if (!path)
 		return NULL;

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

* [GIT PULL] please pull infiniband.git
@ 2007-11-27  6:21 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-11-27  6:21 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will pull some small fixes for 2.6.24:

Erez Zilber (1):
      IB/iser: Add missing counter increment in iser_data_buf_aligned_len()

Jack Morgenstein (1):
      mlx4_core: Fix state check in mlx4_qp_modify()

Joachim Fenkes (1):
      IB/ehca: Fix static rate regression

Ralph Campbell (4):
      IB/ipath: Fix offset returned to ibv_resize_cq()
      IB/ipath: Fix error path in QP creation
      IB/ipath: Fix offset returned to ibv_modify_srq()
      IB/ipath: Normalize error return codes for posting work requests

 drivers/infiniband/hw/ehca/ehca_qp.c      |    4 +-
 drivers/infiniband/hw/ipath/ipath_cq.c    |   19 +++++++++---
 drivers/infiniband/hw/ipath/ipath_qp.c    |   15 ++++++----
 drivers/infiniband/hw/ipath/ipath_srq.c   |   44 +++++++++++++++++------------
 drivers/infiniband/hw/ipath/ipath_verbs.c |    8 +++--
 drivers/infiniband/ulp/iser/iser_memory.c |    6 ++-
 drivers/net/mlx4/qp.c                     |    2 +-
 7 files changed, 61 insertions(+), 37 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index 2e3e654..dd12668 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -1203,7 +1203,7 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 		mqpcb->service_level = attr->ah_attr.sl;
 		update_mask |= EHCA_BMASK_SET(MQPCB_MASK_SERVICE_LEVEL, 1);
 
-		if (ehca_calc_ipd(shca, my_qp->init_attr.port_num,
+		if (ehca_calc_ipd(shca, mqpcb->prim_phys_port,
 				  attr->ah_attr.static_rate,
 				  &mqpcb->max_static_rate)) {
 			ret = -EINVAL;
@@ -1302,7 +1302,7 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 		mqpcb->source_path_bits_al = attr->alt_ah_attr.src_path_bits;
 		mqpcb->service_level_al = attr->alt_ah_attr.sl;
 
-		if (ehca_calc_ipd(shca, my_qp->init_attr.port_num,
+		if (ehca_calc_ipd(shca, mqpcb->alt_phys_port,
 				  attr->alt_ah_attr.static_rate,
 				  &mqpcb->max_static_rate_al)) {
 			ret = -EINVAL;
diff --git a/drivers/infiniband/hw/ipath/ipath_cq.c b/drivers/infiniband/hw/ipath/ipath_cq.c
index 08d8ae1..d1380c7 100644
--- a/drivers/infiniband/hw/ipath/ipath_cq.c
+++ b/drivers/infiniband/hw/ipath/ipath_cq.c
@@ -395,12 +395,9 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 		goto bail;
 	}
 
-	/*
-	 * Return the address of the WC as the offset to mmap.
-	 * See ipath_mmap() for details.
-	 */
+	/* Check that we can write the offset to mmap. */
 	if (udata && udata->outlen >= sizeof(__u64)) {
-		__u64 offset = (__u64) wc;
+		__u64 offset = 0;
 
 		ret = ib_copy_to_udata(udata, &offset, sizeof(offset));
 		if (ret)
@@ -450,6 +447,18 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 		struct ipath_mmap_info *ip = cq->ip;
 
 		ipath_update_mmap_info(dev, ip, sz, wc);
+
+		/*
+		 * Return the offset to mmap.
+		 * See ipath_mmap() for details.
+		 */
+		if (udata && udata->outlen >= sizeof(__u64)) {
+			ret = ib_copy_to_udata(udata, &ip->offset,
+					       sizeof(ip->offset));
+			if (ret)
+				goto bail;
+		}
+
 		spin_lock_irq(&dev->pending_lock);
 		if (list_empty(&ip->pending_mmaps))
 			list_add(&ip->pending_mmaps, &dev->pending_mmaps);
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c
index 6a41fdb..b997ff8 100644
--- a/drivers/infiniband/hw/ipath/ipath_qp.c
+++ b/drivers/infiniband/hw/ipath/ipath_qp.c
@@ -835,7 +835,8 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
 				      init_attr->qp_type);
 		if (err) {
 			ret = ERR_PTR(err);
-			goto bail_rwq;
+			vfree(qp->r_rq.wq);
+			goto bail_qp;
 		}
 		qp->ip = NULL;
 		ipath_reset_qp(qp);
@@ -863,7 +864,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
 					       sizeof(offset));
 			if (err) {
 				ret = ERR_PTR(err);
-				goto bail_rwq;
+				goto bail_ip;
 			}
 		} else {
 			u32 s = sizeof(struct ipath_rwq) +
@@ -875,7 +876,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
 						   qp->r_rq.wq);
 			if (!qp->ip) {
 				ret = ERR_PTR(-ENOMEM);
-				goto bail_rwq;
+				goto bail_ip;
 			}
 
 			err = ib_copy_to_udata(udata, &(qp->ip->offset),
@@ -907,9 +908,11 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
 	goto bail;
 
 bail_ip:
-	kfree(qp->ip);
-bail_rwq:
-	vfree(qp->r_rq.wq);
+	if (qp->ip)
+		kref_put(&qp->ip->ref, ipath_release_mmap_info);
+	else
+		vfree(qp->r_rq.wq);
+	ipath_free_qp(&dev->qp_table, qp);
 bail_qp:
 	kfree(qp);
 bail_swq:
diff --git a/drivers/infiniband/hw/ipath/ipath_srq.c b/drivers/infiniband/hw/ipath/ipath_srq.c
index 40c36ec..2fef36f 100644
--- a/drivers/infiniband/hw/ipath/ipath_srq.c
+++ b/drivers/infiniband/hw/ipath/ipath_srq.c
@@ -59,7 +59,7 @@ int ipath_post_srq_receive(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
 
 		if ((unsigned) wr->num_sge > srq->rq.max_sge) {
 			*bad_wr = wr;
-			ret = -ENOMEM;
+			ret = -EINVAL;
 			goto bail;
 		}
 
@@ -211,11 +211,11 @@ int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 		     struct ib_udata *udata)
 {
 	struct ipath_srq *srq = to_isrq(ibsrq);
+	struct ipath_rwq *wq;
 	int ret = 0;
 
 	if (attr_mask & IB_SRQ_MAX_WR) {
 		struct ipath_rwq *owq;
-		struct ipath_rwq *wq;
 		struct ipath_rwqe *p;
 		u32 sz, size, n, head, tail;
 
@@ -236,27 +236,20 @@ int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 			goto bail;
 		}
 
-		/*
-		 * Return the address of the RWQ as the offset to mmap.
-		 * See ipath_mmap() for details.
-		 */
+		/* Check that we can write the offset to mmap. */
 		if (udata && udata->inlen >= sizeof(__u64)) {
 			__u64 offset_addr;
-			__u64 offset = (__u64) wq;
+			__u64 offset = 0;
 
 			ret = ib_copy_from_udata(&offset_addr, udata,
 						 sizeof(offset_addr));
-			if (ret) {
-				vfree(wq);
-				goto bail;
-			}
+			if (ret)
+				goto bail_free;
 			udata->outbuf = (void __user *) offset_addr;
 			ret = ib_copy_to_udata(udata, &offset,
 					       sizeof(offset));
-			if (ret) {
-				vfree(wq);
-				goto bail;
-			}
+			if (ret)
+				goto bail_free;
 		}
 
 		spin_lock_irq(&srq->rq.lock);
@@ -277,10 +270,8 @@ int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 		else
 			n -= tail;
 		if (size <= n) {
-			spin_unlock_irq(&srq->rq.lock);
-			vfree(wq);
 			ret = -EINVAL;
-			goto bail;
+			goto bail_unlock;
 		}
 		n = 0;
 		p = wq->wq;
@@ -314,6 +305,18 @@ int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 			u32 s = sizeof(struct ipath_rwq) + size * sz;
 
 			ipath_update_mmap_info(dev, ip, s, wq);
+
+			/*
+			 * Return the offset to mmap.
+			 * See ipath_mmap() for details.
+			 */
+			if (udata && udata->inlen >= sizeof(__u64)) {
+				ret = ib_copy_to_udata(udata, &ip->offset,
+						       sizeof(ip->offset));
+				if (ret)
+					goto bail;
+			}
+
 			spin_lock_irq(&dev->pending_lock);
 			if (list_empty(&ip->pending_mmaps))
 				list_add(&ip->pending_mmaps,
@@ -328,7 +331,12 @@ int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 			srq->limit = attr->srq_limit;
 		spin_unlock_irq(&srq->rq.lock);
 	}
+	goto bail;
 
+bail_unlock:
+	spin_unlock_irq(&srq->rq.lock);
+bail_free:
+	vfree(wq);
 bail:
 	return ret;
 }
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
index 74f77e7..c4c9984 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
@@ -302,8 +302,10 @@ static int ipath_post_one_send(struct ipath_qp *qp, struct ib_send_wr *wr)
 	next = qp->s_head + 1;
 	if (next >= qp->s_size)
 		next = 0;
-	if (next == qp->s_last)
-		goto bail_inval;
+	if (next == qp->s_last) {
+		ret = -ENOMEM;
+		goto bail;
+	}
 
 	wqe = get_swqe_ptr(qp, qp->s_head);
 	wqe->wr = *wr;
@@ -404,7 +406,7 @@ static int ipath_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 
 		if ((unsigned) wr->num_sge > qp->r_rq.max_sge) {
 			*bad_wr = wr;
-			ret = -ENOMEM;
+			ret = -EINVAL;
 			goto bail;
 		}
 
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index d687980..4a17743 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -310,13 +310,15 @@ static unsigned int iser_data_buf_aligned_len(struct iser_data_buf *data,
 		if (i + 1 < data->dma_nents) {
 			next_addr = ib_sg_dma_address(ibdev, sg_next(sg));
 			/* are i, i+1 fragments of the same page? */
-			if (end_addr == next_addr)
+			if (end_addr == next_addr) {
+				cnt++;
 				continue;
-			else if (!IS_4K_ALIGNED(end_addr)) {
+			} else if (!IS_4K_ALIGNED(end_addr)) {
 				ret_len = cnt + 1;
 				break;
 			}
 		}
+		cnt++;
 	}
 	if (i == data->dma_nents)
 		ret_len = cnt;	/* loop ended */
diff --git a/drivers/net/mlx4/qp.c b/drivers/net/mlx4/qp.c
index 42b4763..fa24e65 100644
--- a/drivers/net/mlx4/qp.c
+++ b/drivers/net/mlx4/qp.c
@@ -113,7 +113,7 @@ int mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
 	struct mlx4_cmd_mailbox *mailbox;
 	int ret = 0;
 
-	if (cur_state >= MLX4_QP_NUM_STATE || cur_state >= MLX4_QP_NUM_STATE ||
+	if (cur_state >= MLX4_QP_NUM_STATE || new_state >= MLX4_QP_NUM_STATE ||
 	    !op[cur_state][new_state])
 		return -EINVAL;
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-11-14 16:23 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-11-14 16:23 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will pull some low-level driver fixes for 2.6.24:

Ali Ayoub (1):
      mlx4_core: Fix possible bad free in mlx4_buf_free()

Jack Morgenstein (1):
      mlx4_core: Fix thinko in QP destroy (incorrect bitmap_free)

Joachim Fenkes (2):
      IB/ehca: Return physical link information in query_port()
      IB/ehca: Fix static rate calculation

Ralph Campbell (2):
      IB/ipath: Fix memory leak in ipath_resize_cq() if copy_to_user() fails
      IB/ipath: Fix race with ACK retry timeout list management

Steve Wise (1):
      RDMA/cxgb3: Set the max_qp_init_rd_atom attribute in query_device

 drivers/infiniband/hw/cxgb3/iwch_provider.c |    1 +
 drivers/infiniband/hw/ehca/ehca_av.c        |   48 ++++++++++++++++++++++-----
 drivers/infiniband/hw/ehca/ehca_classes.h   |    1 -
 drivers/infiniband/hw/ehca/ehca_hca.c       |   20 ++++++++---
 drivers/infiniband/hw/ehca/ehca_iverbs.h    |    3 ++
 drivers/infiniband/hw/ehca/ehca_main.c      |    3 --
 drivers/infiniband/hw/ehca/ehca_qp.c        |   29 +++++++---------
 drivers/infiniband/hw/ehca/hipz_hw.h        |    6 +++-
 drivers/infiniband/hw/ipath/ipath_cq.c      |   11 ++++--
 drivers/infiniband/hw/ipath/ipath_rc.c      |    5 ++-
 drivers/net/mlx4/alloc.c                    |    7 ++--
 drivers/net/mlx4/qp.c                       |    2 +-
 12 files changed, 89 insertions(+), 47 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index f0c7775..b5436ca 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -1000,6 +1000,7 @@ static int iwch_query_device(struct ib_device *ibdev,
 	props->max_sge = dev->attr.max_sge_per_wr;
 	props->max_sge_rd = 1;
 	props->max_qp_rd_atom = dev->attr.max_rdma_reads_per_qp;
+	props->max_qp_init_rd_atom = dev->attr.max_rdma_reads_per_qp;
 	props->max_cq = dev->attr.max_cqs;
 	props->max_cqe = dev->attr.max_cqes_per_cq;
 	props->max_mr = dev->attr.max_mem_regs;
diff --git a/drivers/infiniband/hw/ehca/ehca_av.c b/drivers/infiniband/hw/ehca/ehca_av.c
index 97d1086..453eb99 100644
--- a/drivers/infiniband/hw/ehca/ehca_av.c
+++ b/drivers/infiniband/hw/ehca/ehca_av.c
@@ -50,6 +50,38 @@
 
 static struct kmem_cache *av_cache;
 
+int ehca_calc_ipd(struct ehca_shca *shca, int port,
+		  enum ib_rate path_rate, u32 *ipd)
+{
+	int path = ib_rate_to_mult(path_rate);
+	int link, ret;
+	struct ib_port_attr pa;
+
+	if (path_rate == IB_RATE_PORT_CURRENT) {
+		*ipd = 0;
+		return 0;
+	}
+
+	if (unlikely(path < 0)) {
+		ehca_err(&shca->ib_device, "Invalid static rate! path_rate=%x",
+			 path_rate);
+		return -EINVAL;
+	}
+
+	ret = ehca_query_port(&shca->ib_device, port, &pa);
+	if (unlikely(ret < 0)) {
+		ehca_err(&shca->ib_device, "Failed to query port  ret=%i", ret);
+		return ret;
+	}
+
+	link = ib_width_enum_to_int(pa.active_width) * pa.active_speed;
+
+	/* IPD = round((link / path) - 1) */
+	*ipd = ((link + (path >> 1)) / path) - 1;
+
+	return 0;
+}
+
 struct ib_ah *ehca_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
 {
 	int ret;
@@ -69,15 +101,13 @@ struct ib_ah *ehca_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
 	av->av.slid_path_bits = ah_attr->src_path_bits;
 
 	if (ehca_static_rate < 0) {
-		int ah_mult = ib_rate_to_mult(ah_attr->static_rate);
-		int ehca_mult =
-			ib_rate_to_mult(shca->sport[ah_attr->port_num].rate );
-
-		if (ah_mult >= ehca_mult)
-			av->av.ipd = 0;
-		else
-			av->av.ipd = (ah_mult > 0) ?
-				((ehca_mult - 1) / ah_mult) : 0;
+		u32 ipd;
+		if (ehca_calc_ipd(shca, ah_attr->port_num,
+				  ah_attr->static_rate, &ipd)) {
+			ret = -EINVAL;
+			goto create_ah_exit1;
+		}
+		av->av.ipd = ipd;
 	} else
 		av->av.ipd = ehca_static_rate;
 
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 2d660ae..87f12d4 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -95,7 +95,6 @@ struct ehca_sma_attr {
 struct ehca_sport {
 	struct ib_cq *ibcq_aqp1;
 	struct ib_qp *ibqp_aqp1;
-	enum ib_rate  rate;
 	enum ib_port_state port_state;
 	struct ehca_sma_attr saved_attr;
 };
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
index 15806d1..5bd7b59 100644
--- a/drivers/infiniband/hw/ehca/ehca_hca.c
+++ b/drivers/infiniband/hw/ehca/ehca_hca.c
@@ -151,7 +151,6 @@ int ehca_query_port(struct ib_device *ibdev,
 	}
 
 	memset(props, 0, sizeof(struct ib_port_attr));
-	props->state = rblock->state;
 
 	switch (rblock->max_mtu) {
 	case 0x1:
@@ -188,11 +187,20 @@ int ehca_query_port(struct ib_device *ibdev,
 	props->subnet_timeout  = rblock->subnet_timeout;
 	props->init_type_reply = rblock->init_type_reply;
 
-	props->active_width    = IB_WIDTH_12X;
-	props->active_speed    = 0x1;
-
-	/* at the moment (logical) link state is always LINK_UP */
-	props->phys_state      = 0x5;
+	if (rblock->state && rblock->phys_width) {
+		props->phys_state      = rblock->phys_pstate;
+		props->state           = rblock->phys_state;
+		props->active_width    = rblock->phys_width;
+		props->active_speed    = rblock->phys_speed;
+	} else {
+		/* old firmware releases don't report physical
+		 * port info, so use default values
+		 */
+		props->phys_state      = 5;
+		props->state           = rblock->state;
+		props->active_width    = IB_WIDTH_12X;
+		props->active_speed    = 0x1;
+	}
 
 query_port1:
 	ehca_free_fw_ctrlblock(rblock);
diff --git a/drivers/infiniband/hw/ehca/ehca_iverbs.h b/drivers/infiniband/hw/ehca/ehca_iverbs.h
index dce503b..5485799 100644
--- a/drivers/infiniband/hw/ehca/ehca_iverbs.h
+++ b/drivers/infiniband/hw/ehca/ehca_iverbs.h
@@ -189,6 +189,9 @@ int ehca_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
 
 void ehca_poll_eqs(unsigned long data);
 
+int ehca_calc_ipd(struct ehca_shca *shca, int port,
+		  enum ib_rate path_rate, u32 *ipd);
+
 #ifdef CONFIG_PPC_64K_PAGES
 void *ehca_alloc_fw_ctrlblock(gfp_t flags);
 void ehca_free_fw_ctrlblock(void *ptr);
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index c6cd38c..90d4334 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -327,9 +327,6 @@ static int ehca_sense_attributes(struct ehca_shca *shca)
 		shca->hw_level = ehca_hw_level;
 	ehca_gen_dbg(" ... hardware level=%x", shca->hw_level);
 
-	shca->sport[0].rate = IB_RATE_30_GBPS;
-	shca->sport[1].rate = IB_RATE_30_GBPS;
-
 	shca->hca_cap = rblock->hca_cap_indicators;
 	ehca_gen_dbg(" ... HCA capabilities:");
 	for (i = 0; i < ARRAY_SIZE(hca_cap_descr); i++)
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index de18264..2e3e654 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -1196,10 +1196,6 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 		update_mask |= EHCA_BMASK_SET(MQPCB_MASK_QKEY, 1);
 	}
 	if (attr_mask & IB_QP_AV) {
-		int ah_mult = ib_rate_to_mult(attr->ah_attr.static_rate);
-		int ehca_mult = ib_rate_to_mult(shca->sport[my_qp->
-						init_attr.port_num].rate);
-
 		mqpcb->dlid = attr->ah_attr.dlid;
 		update_mask |= EHCA_BMASK_SET(MQPCB_MASK_DLID, 1);
 		mqpcb->source_path_bits = attr->ah_attr.src_path_bits;
@@ -1207,11 +1203,12 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 		mqpcb->service_level = attr->ah_attr.sl;
 		update_mask |= EHCA_BMASK_SET(MQPCB_MASK_SERVICE_LEVEL, 1);
 
-		if (ah_mult < ehca_mult)
-			mqpcb->max_static_rate = (ah_mult > 0) ?
-			((ehca_mult - 1) / ah_mult) : 0;
-		else
-			mqpcb->max_static_rate = 0;
+		if (ehca_calc_ipd(shca, my_qp->init_attr.port_num,
+				  attr->ah_attr.static_rate,
+				  &mqpcb->max_static_rate)) {
+			ret = -EINVAL;
+			goto modify_qp_exit2;
+		}
 		update_mask |= EHCA_BMASK_SET(MQPCB_MASK_MAX_STATIC_RATE, 1);
 
 		/*
@@ -1280,10 +1277,6 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 			(MQPCB_MASK_RDMA_ATOMIC_OUTST_DEST_QP, 1);
 	}
 	if (attr_mask & IB_QP_ALT_PATH) {
-		int ah_mult = ib_rate_to_mult(attr->alt_ah_attr.static_rate);
-		int ehca_mult = ib_rate_to_mult(
-			shca->sport[my_qp->init_attr.port_num].rate);
-
 		if (attr->alt_port_num < 1
 		    || attr->alt_port_num > shca->num_ports) {
 			ret = -EINVAL;
@@ -1309,10 +1302,12 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 		mqpcb->source_path_bits_al = attr->alt_ah_attr.src_path_bits;
 		mqpcb->service_level_al = attr->alt_ah_attr.sl;
 
-		if (ah_mult > 0 && ah_mult < ehca_mult)
-			mqpcb->max_static_rate_al = (ehca_mult - 1) / ah_mult;
-		else
-			mqpcb->max_static_rate_al = 0;
+		if (ehca_calc_ipd(shca, my_qp->init_attr.port_num,
+				  attr->alt_ah_attr.static_rate,
+				  &mqpcb->max_static_rate_al)) {
+			ret = -EINVAL;
+			goto modify_qp_exit2;
+		}
 
 		/* OpenIB doesn't support alternate retry counts - copy them */
 		mqpcb->retry_count_al = mqpcb->retry_count;
diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h
index d9739e5..485b840 100644
--- a/drivers/infiniband/hw/ehca/hipz_hw.h
+++ b/drivers/infiniband/hw/ehca/hipz_hw.h
@@ -402,7 +402,11 @@ struct hipz_query_port {
 	u64 max_msg_sz;
 	u32 max_mtu;
 	u32 vl_cap;
-	u8  reserved2[1900];
+	u32 phys_pstate;
+	u32 phys_state;
+	u32 phys_speed;
+	u32 phys_width;
+	u8  reserved2[1884];
 	u64 guid_entries[255];
 } __attribute__ ((packed));
 
diff --git a/drivers/infiniband/hw/ipath/ipath_cq.c b/drivers/infiniband/hw/ipath/ipath_cq.c
index 645ed71..08d8ae1 100644
--- a/drivers/infiniband/hw/ipath/ipath_cq.c
+++ b/drivers/infiniband/hw/ipath/ipath_cq.c
@@ -404,7 +404,7 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 
 		ret = ib_copy_to_udata(udata, &offset, sizeof(offset));
 		if (ret)
-			goto bail;
+			goto bail_free;
 	}
 
 	spin_lock_irq(&cq->lock);
@@ -424,10 +424,8 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 	else
 		n = head - tail;
 	if (unlikely((u32)cqe < n)) {
-		spin_unlock_irq(&cq->lock);
-		vfree(wc);
 		ret = -EOVERFLOW;
-		goto bail;
+		goto bail_unlock;
 	}
 	for (n = 0; tail != head; n++) {
 		if (cq->ip)
@@ -459,7 +457,12 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 	}
 
 	ret = 0;
+	goto bail;
 
+bail_unlock:
+	spin_unlock_irq(&cq->lock);
+bail_free:
+	vfree(wc);
 bail:
 	return ret;
 }
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c
index 5c29b2b..120a61b 100644
--- a/drivers/infiniband/hw/ipath/ipath_rc.c
+++ b/drivers/infiniband/hw/ipath/ipath_rc.c
@@ -959,8 +959,9 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode,
 		/* If this is a partial ACK, reset the retransmit timer. */
 		if (qp->s_last != qp->s_tail) {
 			spin_lock(&dev->pending_lock);
-			list_add_tail(&qp->timerwait,
-				      &dev->pending[dev->pending_index]);
+			if (list_empty(&qp->timerwait))
+				list_add_tail(&qp->timerwait,
+					&dev->pending[dev->pending_index]);
 			spin_unlock(&dev->pending_lock);
 			/*
 			 * If we get a partial ACK for a resent operation,
diff --git a/drivers/net/mlx4/alloc.c b/drivers/net/mlx4/alloc.c
index f8d63d3..b226e01 100644
--- a/drivers/net/mlx4/alloc.c
+++ b/drivers/net/mlx4/alloc.c
@@ -171,9 +171,10 @@ void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf)
 				  buf->u.direct.map);
 	else {
 		for (i = 0; i < buf->nbufs; ++i)
-			dma_free_coherent(&dev->pdev->dev, PAGE_SIZE,
-					  buf->u.page_list[i].buf,
-					  buf->u.page_list[i].map);
+			if (buf->u.page_list[i].buf)
+				dma_free_coherent(&dev->pdev->dev, PAGE_SIZE,
+						  buf->u.page_list[i].buf,
+						  buf->u.page_list[i].map);
 		kfree(buf->u.page_list);
 	}
 }
diff --git a/drivers/net/mlx4/qp.c b/drivers/net/mlx4/qp.c
index cc4b1be..42b4763 100644
--- a/drivers/net/mlx4/qp.c
+++ b/drivers/net/mlx4/qp.c
@@ -240,7 +240,7 @@ void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp)
 	mlx4_table_put(dev, &qp_table->auxc_table, qp->qpn);
 	mlx4_table_put(dev, &qp_table->qp_table, qp->qpn);
 
-	if (qp->qpn < dev->caps.sqp_start + 8)
+	if (qp->qpn >= dev->caps.sqp_start + 8)
 		mlx4_bitmap_free(&qp_table->bitmap, qp->qpn);
 }
 EXPORT_SYMBOL_GPL(mlx4_qp_free);

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

* [GIT PULL] please pull infiniband.git
@ 2007-10-30 22:17 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-10-30 22:17 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will pull some fixes for 2.6.24:

Anton Blanchard (1):
      IB/fmr_pool: Stop ib_fmr threads from contributing to load average

Dave Olson (1):
      IB/ipath: Fix incorrect use of sizeof on msg buffer (function argument)

Michael Albaugh (1):
      IB/ipath: Limit length checksummed in eeprom

Ralph Campbell (1):
      IB/ipath: Fix a race where s_last is updated without lock held

Roland Dreier (2):
      IPoIB/cm: Fix receive QP cleanup
      IB/mlx4: Lock SQ lock in mlx4_ib_post_send()

 drivers/infiniband/core/fmr_pool.c         |    8 ++++----
 drivers/infiniband/hw/ipath/ipath_eeprom.c |   10 +++++++++-
 drivers/infiniband/hw/ipath/ipath_intr.c   |   18 +++++++++---------
 drivers/infiniband/hw/ipath/ipath_ruc.c    |   14 +++++++++-----
 drivers/infiniband/hw/mlx4/qp.c            |    4 ++--
 drivers/infiniband/ulp/ipoib/ipoib_cm.c    |    2 +-
 6 files changed, 34 insertions(+), 22 deletions(-)


diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c
index d7f6452..e8d5f6b 100644
--- a/drivers/infiniband/core/fmr_pool.c
+++ b/drivers/infiniband/core/fmr_pool.c
@@ -291,10 +291,10 @@ struct ib_fmr_pool *ib_create_fmr_pool(struct ib_pd             *pd,
 	atomic_set(&pool->flush_ser, 0);
 	init_waitqueue_head(&pool->force_wait);
 
-	pool->thread = kthread_create(ib_fmr_cleanup_thread,
-				      pool,
-				      "ib_fmr(%s)",
-				      device->name);
+	pool->thread = kthread_run(ib_fmr_cleanup_thread,
+				   pool,
+				   "ib_fmr(%s)",
+				   device->name);
 	if (IS_ERR(pool->thread)) {
 		printk(KERN_WARNING PFX "couldn't start cleanup thread\n");
 		ret = PTR_ERR(pool->thread);
diff --git a/drivers/infiniband/hw/ipath/ipath_eeprom.c b/drivers/infiniband/hw/ipath/ipath_eeprom.c
index bcfa3cc..e7c25db 100644
--- a/drivers/infiniband/hw/ipath/ipath_eeprom.c
+++ b/drivers/infiniband/hw/ipath/ipath_eeprom.c
@@ -538,7 +538,15 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust)
 	u8 *ip = (u8 *) ifp;
 	u8 csum = 0, len;
 
-	for (len = 0; len < ifp->if_length; len++)
+	/*
+	 * Limit length checksummed to max length of actual data.
+	 * Checksum of erased eeprom will still be bad, but we avoid
+	 * reading past the end of the buffer we were passed.
+	 */
+	len = ifp->if_length;
+	if (len > sizeof(struct ipath_flash))
+		len = sizeof(struct ipath_flash);
+	while (len--)
 		csum += *ip++;
 	csum -= ifp->if_csum;
 	csum = ~csum;
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c
index 6a5dd5c..c61f9da 100644
--- a/drivers/infiniband/hw/ipath/ipath_intr.c
+++ b/drivers/infiniband/hw/ipath/ipath_intr.c
@@ -453,7 +453,7 @@ skip_ibchange:
 }
 
 static void handle_supp_msgs(struct ipath_devdata *dd,
-			     unsigned supp_msgs, char msg[512])
+			     unsigned supp_msgs, char *msg, int msgsz)
 {
 	/*
 	 * Print the message unless it's ibc status change only, which
@@ -461,9 +461,9 @@ static void handle_supp_msgs(struct ipath_devdata *dd,
 	 */
 	if (dd->ipath_lasterror & ~INFINIPATH_E_IBSTATUSCHANGED) {
 		int iserr;
-		iserr = ipath_decode_err(msg, sizeof msg,
-				dd->ipath_lasterror &
-				~INFINIPATH_E_IBSTATUSCHANGED);
+		iserr = ipath_decode_err(msg, msgsz,
+					 dd->ipath_lasterror &
+					 ~INFINIPATH_E_IBSTATUSCHANGED);
 		if (dd->ipath_lasterror &
 			~(INFINIPATH_E_RRCVEGRFULL |
 			INFINIPATH_E_RRCVHDRFULL | INFINIPATH_E_PKTERRS))
@@ -492,8 +492,8 @@ static void handle_supp_msgs(struct ipath_devdata *dd,
 }
 
 static unsigned handle_frequent_errors(struct ipath_devdata *dd,
-				       ipath_err_t errs, char msg[512],
-				       int *noprint)
+				       ipath_err_t errs, char *msg,
+				       int msgsz, int *noprint)
 {
 	unsigned long nc;
 	static unsigned long nextmsg_time;
@@ -512,7 +512,7 @@ static unsigned handle_frequent_errors(struct ipath_devdata *dd,
 				nextmsg_time = nc + HZ * 3;
 		}
 		else if (supp_msgs) {
-			handle_supp_msgs(dd, supp_msgs, msg);
+			handle_supp_msgs(dd, supp_msgs, msg, msgsz);
 			supp_msgs = 0;
 			nmsgs = 0;
 		}
@@ -525,14 +525,14 @@ static unsigned handle_frequent_errors(struct ipath_devdata *dd,
 
 static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs)
 {
-	char msg[512];
+	char msg[128];
 	u64 ignore_this_time = 0;
 	int i, iserr = 0;
 	int chkerrpkts = 0, noprint = 0;
 	unsigned supp_msgs;
 	int log_idx;
 
-	supp_msgs = handle_frequent_errors(dd, errs, msg, &noprint);
+	supp_msgs = handle_frequent_errors(dd, errs, msg, sizeof msg, &noprint);
 
 	/* don't report errors that are masked */
 	errs &= ~dd->ipath_maskederrs;
diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c
index 4b6b7ee..54c61a9 100644
--- a/drivers/infiniband/hw/ipath/ipath_ruc.c
+++ b/drivers/infiniband/hw/ipath/ipath_ruc.c
@@ -630,11 +630,8 @@ bail:;
 void ipath_send_complete(struct ipath_qp *qp, struct ipath_swqe *wqe,
 			 enum ib_wc_status status)
 {
-	u32 last = qp->s_last;
-
-	if (++last == qp->s_size)
-		last = 0;
-	qp->s_last = last;
+	unsigned long flags;
+	u32 last;
 
 	/* See ch. 11.2.4.1 and 10.7.3.1 */
 	if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) ||
@@ -658,4 +655,11 @@ void ipath_send_complete(struct ipath_qp *qp, struct ipath_swqe *wqe,
 		wc.port_num = 0;
 		ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0);
 	}
+
+	spin_lock_irqsave(&qp->s_lock, flags);
+	last = qp->s_last;
+	if (++last >= qp->s_size)
+		last = 0;
+	qp->s_last = last;
+	spin_unlock_irqrestore(&qp->s_lock, flags);
 }
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 6b33224..8cba9c5 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1282,7 +1282,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 	int size;
 	int i;
 
-	spin_lock_irqsave(&qp->rq.lock, flags);
+	spin_lock_irqsave(&qp->sq.lock, flags);
 
 	ind = qp->sq.head;
 
@@ -1448,7 +1448,7 @@ out:
 			       (qp->sq.wqe_cnt - 1));
 	}
 
-	spin_unlock_irqrestore(&qp->rq.lock, flags);
+	spin_unlock_irqrestore(&qp->sq.lock, flags);
 
 	return err;
 }
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 8761077..059cf92 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -60,7 +60,7 @@ static struct ib_qp_attr ipoib_cm_err_attr = {
 	.qp_state = IB_QPS_ERR
 };
 
-#define IPOIB_CM_RX_DRAIN_WRID 0x7fffffff
+#define IPOIB_CM_RX_DRAIN_WRID 0xffffffff
 
 static struct ib_send_wr ipoib_cm_rx_drain_wr = {
 	.wr_id = IPOIB_CM_RX_DRAIN_WRID,

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

* [GIT PULL] please pull infiniband.git
@ 2007-10-23 16:30 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-10-23 16:30 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

this will get some more fixes/changes for 2.6.24.  I have one more
IPoIB feature (support for CM without SRQs) I hope to send later
today, but we'll see...

Anton Blanchard (1):
      IPoIB: Use round_jiffies() for ah_reap_task

Jack Morgenstein (2):
      IB/mlx4: Sanity check userspace send queue sizes
      mlx4_core: Increase command timeout for INIT_HCA to 10 seconds

Joachim Fenkes (5):
      IB/ehca: Supply QP token for SRQ base QPs
      IB/ehca: Fix masking error in {,re}reg_phys_mr()
      IB/ehca: Fix ehca_encode_hwpage_size() and alloc_fmr()
      IB/ehca: Change meaning of hca_cap_mr_pgsize
      IB/ehca: Enable large page MRs by default

Michael S. Tsirkin (1):
      IPoIB/cm: Use common CQ for CM send completions

Roland Dreier (4):
      mlx4_core: Kill mlx4_write64_raw()
      IB/mthca: Avoid alignment traps when writing doorbells
      IPoIB: Rewrite "if (!likely(...))" as "if (unlikely(!(...)))"
      IB/uverbs: Fix checking of userspace object ownership

Sean Hefty (2):
      RDMA/cma: Add locking around QP accesses
      RDMA/cma: Fix deadlock destroying listen requests

 drivers/infiniband/core/cma.c                |  160 +++++++++++++------------
 drivers/infiniband/core/uverbs_cmd.c         |    8 +-
 drivers/infiniband/hw/ehca/ehca_classes.h    |    1 -
 drivers/infiniband/hw/ehca/ehca_hca.c        |    1 +
 drivers/infiniband/hw/ehca/ehca_main.c       |   20 +++-
 drivers/infiniband/hw/ehca/ehca_mrmw.c       |   57 ++++-----
 drivers/infiniband/hw/ehca/ehca_qp.c         |    4 +-
 drivers/infiniband/hw/mlx4/qp.c              |   16 +++-
 drivers/infiniband/hw/mthca/mthca_cq.c       |   53 +++------
 drivers/infiniband/hw/mthca/mthca_doorbell.h |   13 ++-
 drivers/infiniband/hw/mthca/mthca_eq.c       |   21 +---
 drivers/infiniband/hw/mthca/mthca_qp.c       |   45 +++-----
 drivers/infiniband/hw/mthca/mthca_srq.c      |   11 +--
 drivers/infiniband/ulp/ipoib/ipoib.h         |   15 ++-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c      |  114 ++++++++-----------
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |   52 +++++----
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |    4 +-
 drivers/net/mlx4/fw.c                        |    2 +-
 include/linux/mlx4/doorbell.h                |   11 --
 19 files changed, 284 insertions(+), 324 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 93644f8..ee946cc 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -114,13 +114,16 @@ struct rdma_id_private {
 
 	struct rdma_bind_list	*bind_list;
 	struct hlist_node	node;
-	struct list_head	list;
-	struct list_head	listen_list;
+	struct list_head	list; /* listen_any_list or cma_device.list */
+	struct list_head	listen_list; /* per device listens */
 	struct cma_device	*cma_dev;
 	struct list_head	mc_list;
 
+	int			internal_id;
 	enum cma_state		state;
 	spinlock_t		lock;
+	struct mutex		qp_mutex;
+
 	struct completion	comp;
 	atomic_t		refcount;
 	wait_queue_head_t	wait_remove;
@@ -389,6 +392,7 @@ struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
 	id_priv->id.event_handler = event_handler;
 	id_priv->id.ps = ps;
 	spin_lock_init(&id_priv->lock);
+	mutex_init(&id_priv->qp_mutex);
 	init_completion(&id_priv->comp);
 	atomic_set(&id_priv->refcount, 1);
 	init_waitqueue_head(&id_priv->wait_remove);
@@ -474,61 +478,86 @@ EXPORT_SYMBOL(rdma_create_qp);
 
 void rdma_destroy_qp(struct rdma_cm_id *id)
 {
-	ib_destroy_qp(id->qp);
+	struct rdma_id_private *id_priv;
+
+	id_priv = container_of(id, struct rdma_id_private, id);
+	mutex_lock(&id_priv->qp_mutex);
+	ib_destroy_qp(id_priv->id.qp);
+	id_priv->id.qp = NULL;
+	mutex_unlock(&id_priv->qp_mutex);
 }
 EXPORT_SYMBOL(rdma_destroy_qp);
 
-static int cma_modify_qp_rtr(struct rdma_cm_id *id)
+static int cma_modify_qp_rtr(struct rdma_id_private *id_priv)
 {
 	struct ib_qp_attr qp_attr;
 	int qp_attr_mask, ret;
 
-	if (!id->qp)
-		return 0;
+	mutex_lock(&id_priv->qp_mutex);
+	if (!id_priv->id.qp) {
+		ret = 0;
+		goto out;
+	}
 
 	/* Need to update QP attributes from default values. */
 	qp_attr.qp_state = IB_QPS_INIT;
-	ret = rdma_init_qp_attr(id, &qp_attr, &qp_attr_mask);
+	ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 	if (ret)
-		return ret;
+		goto out;
 
-	ret = ib_modify_qp(id->qp, &qp_attr, qp_attr_mask);
+	ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
 	if (ret)
-		return ret;
+		goto out;
 
 	qp_attr.qp_state = IB_QPS_RTR;
-	ret = rdma_init_qp_attr(id, &qp_attr, &qp_attr_mask);
+	ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 	if (ret)
-		return ret;
+		goto out;
 
-	return ib_modify_qp(id->qp, &qp_attr, qp_attr_mask);
+	ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
+out:
+	mutex_unlock(&id_priv->qp_mutex);
+	return ret;
 }
 
-static int cma_modify_qp_rts(struct rdma_cm_id *id)
+static int cma_modify_qp_rts(struct rdma_id_private *id_priv)
 {
 	struct ib_qp_attr qp_attr;
 	int qp_attr_mask, ret;
 
-	if (!id->qp)
-		return 0;
+	mutex_lock(&id_priv->qp_mutex);
+	if (!id_priv->id.qp) {
+		ret = 0;
+		goto out;
+	}
 
 	qp_attr.qp_state = IB_QPS_RTS;
-	ret = rdma_init_qp_attr(id, &qp_attr, &qp_attr_mask);
+	ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 	if (ret)
-		return ret;
+		goto out;
 
-	return ib_modify_qp(id->qp, &qp_attr, qp_attr_mask);
+	ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
+out:
+	mutex_unlock(&id_priv->qp_mutex);
+	return ret;
 }
 
-static int cma_modify_qp_err(struct rdma_cm_id *id)
+static int cma_modify_qp_err(struct rdma_id_private *id_priv)
 {
 	struct ib_qp_attr qp_attr;
+	int ret;
 
-	if (!id->qp)
-		return 0;
+	mutex_lock(&id_priv->qp_mutex);
+	if (!id_priv->id.qp) {
+		ret = 0;
+		goto out;
+	}
 
 	qp_attr.qp_state = IB_QPS_ERR;
-	return ib_modify_qp(id->qp, &qp_attr, IB_QP_STATE);
+	ret = ib_modify_qp(id_priv->id.qp, &qp_attr, IB_QP_STATE);
+out:
+	mutex_unlock(&id_priv->qp_mutex);
+	return ret;
 }
 
 static int cma_ib_init_qp_attr(struct rdma_id_private *id_priv,
@@ -717,50 +746,27 @@ static void cma_cancel_route(struct rdma_id_private *id_priv)
 	}
 }
 
-static inline int cma_internal_listen(struct rdma_id_private *id_priv)
-{
-	return (id_priv->state == CMA_LISTEN) && id_priv->cma_dev &&
-	       cma_any_addr(&id_priv->id.route.addr.src_addr);
-}
-
-static void cma_destroy_listen(struct rdma_id_private *id_priv)
-{
-	cma_exch(id_priv, CMA_DESTROYING);
-
-	if (id_priv->cma_dev) {
-		switch (rdma_node_get_transport(id_priv->id.device->node_type)) {
-		case RDMA_TRANSPORT_IB:
-			if (id_priv->cm_id.ib && !IS_ERR(id_priv->cm_id.ib))
-				ib_destroy_cm_id(id_priv->cm_id.ib);
-			break;
-		case RDMA_TRANSPORT_IWARP:
-			if (id_priv->cm_id.iw && !IS_ERR(id_priv->cm_id.iw))
-				iw_destroy_cm_id(id_priv->cm_id.iw);
-			break;
-		default:
-			break;
-		}
-		cma_detach_from_dev(id_priv);
-	}
-	list_del(&id_priv->listen_list);
-
-	cma_deref_id(id_priv);
-	wait_for_completion(&id_priv->comp);
-
-	kfree(id_priv);
-}
-
 static void cma_cancel_listens(struct rdma_id_private *id_priv)
 {
 	struct rdma_id_private *dev_id_priv;
 
+	/*
+	 * Remove from listen_any_list to prevent added devices from spawning
+	 * additional listen requests.
+	 */
 	mutex_lock(&lock);
 	list_del(&id_priv->list);
 
 	while (!list_empty(&id_priv->listen_list)) {
 		dev_id_priv = list_entry(id_priv->listen_list.next,
 					 struct rdma_id_private, listen_list);
-		cma_destroy_listen(dev_id_priv);
+		/* sync with device removal to avoid duplicate destruction */
+		list_del_init(&dev_id_priv->list);
+		list_del(&dev_id_priv->listen_list);
+		mutex_unlock(&lock);
+
+		rdma_destroy_id(&dev_id_priv->id);
+		mutex_lock(&lock);
 	}
 	mutex_unlock(&lock);
 }
@@ -848,6 +854,9 @@ void rdma_destroy_id(struct rdma_cm_id *id)
 	cma_deref_id(id_priv);
 	wait_for_completion(&id_priv->comp);
 
+	if (id_priv->internal_id)
+		cma_deref_id(id_priv->id.context);
+
 	kfree(id_priv->id.route.path_rec);
 	kfree(id_priv);
 }
@@ -857,11 +866,11 @@ static int cma_rep_recv(struct rdma_id_private *id_priv)
 {
 	int ret;
 
-	ret = cma_modify_qp_rtr(&id_priv->id);
+	ret = cma_modify_qp_rtr(id_priv);
 	if (ret)
 		goto reject;
 
-	ret = cma_modify_qp_rts(&id_priv->id);
+	ret = cma_modify_qp_rts(id_priv);
 	if (ret)
 		goto reject;
 
@@ -871,7 +880,7 @@ static int cma_rep_recv(struct rdma_id_private *id_priv)
 
 	return 0;
 reject:
-	cma_modify_qp_err(&id_priv->id);
+	cma_modify_qp_err(id_priv);
 	ib_send_cm_rej(id_priv->cm_id.ib, IB_CM_REJ_CONSUMER_DEFINED,
 		       NULL, 0, NULL, 0);
 	return ret;
@@ -947,7 +956,7 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 		/* ignore event */
 		goto out;
 	case IB_CM_REJ_RECEIVED:
-		cma_modify_qp_err(&id_priv->id);
+		cma_modify_qp_err(id_priv);
 		event.status = ib_event->param.rej_rcvd.reason;
 		event.event = RDMA_CM_EVENT_REJECTED;
 		event.param.conn.private_data = ib_event->private_data;
@@ -1404,14 +1413,13 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
 
 	cma_attach_to_dev(dev_id_priv, cma_dev);
 	list_add_tail(&dev_id_priv->listen_list, &id_priv->listen_list);
+	atomic_inc(&id_priv->refcount);
+	dev_id_priv->internal_id = 1;
 
 	ret = rdma_listen(id, id_priv->backlog);
 	if (ret)
-		goto err;
-
-	return;
-err:
-	cma_destroy_listen(dev_id_priv);
+		printk(KERN_WARNING "RDMA CMA: cma_listen_on_dev, error %d, "
+		       "listening on device %s", ret, cma_dev->device->name);
 }
 
 static void cma_listen_on_all(struct rdma_id_private *id_priv)
@@ -2264,7 +2272,7 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
 	sin = (struct sockaddr_in*) &id_priv->id.route.addr.dst_addr;
 	cm_id->remote_addr = *sin;
 
-	ret = cma_modify_qp_rtr(&id_priv->id);
+	ret = cma_modify_qp_rtr(id_priv);
 	if (ret)
 		goto out;
 
@@ -2331,7 +2339,7 @@ static int cma_accept_ib(struct rdma_id_private *id_priv,
 	int qp_attr_mask, ret;
 
 	if (id_priv->id.qp) {
-		ret = cma_modify_qp_rtr(&id_priv->id);
+		ret = cma_modify_qp_rtr(id_priv);
 		if (ret)
 			goto out;
 
@@ -2370,7 +2378,7 @@ static int cma_accept_iw(struct rdma_id_private *id_priv,
 	struct iw_cm_conn_param iw_param;
 	int ret;
 
-	ret = cma_modify_qp_rtr(&id_priv->id);
+	ret = cma_modify_qp_rtr(id_priv);
 	if (ret)
 		return ret;
 
@@ -2442,7 +2450,7 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
 
 	return 0;
 reject:
-	cma_modify_qp_err(id);
+	cma_modify_qp_err(id_priv);
 	rdma_reject(id, NULL, 0);
 	return ret;
 }
@@ -2512,7 +2520,7 @@ int rdma_disconnect(struct rdma_cm_id *id)
 
 	switch (rdma_node_get_transport(id->device->node_type)) {
 	case RDMA_TRANSPORT_IB:
-		ret = cma_modify_qp_err(id);
+		ret = cma_modify_qp_err(id_priv);
 		if (ret)
 			goto out;
 		/* Initiate or respond to a disconnect. */
@@ -2543,9 +2551,11 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)
 	    cma_disable_remove(id_priv, CMA_ADDR_RESOLVED))
 		return 0;
 
+	mutex_lock(&id_priv->qp_mutex);
 	if (!status && id_priv->id.qp)
 		status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid,
 					 multicast->rec.mlid);
+	mutex_unlock(&id_priv->qp_mutex);
 
 	memset(&event, 0, sizeof event);
 	event.status = status;
@@ -2757,16 +2767,12 @@ static void cma_process_remove(struct cma_device *cma_dev)
 		id_priv = list_entry(cma_dev->id_list.next,
 				     struct rdma_id_private, list);
 
-		if (cma_internal_listen(id_priv)) {
-			cma_destroy_listen(id_priv);
-			continue;
-		}
-
+		list_del(&id_priv->listen_list);
 		list_del_init(&id_priv->list);
 		atomic_inc(&id_priv->refcount);
 		mutex_unlock(&lock);
 
-		ret = cma_remove_id_dev(id_priv);
+		ret = id_priv->internal_id ? 1 : cma_remove_id_dev(id_priv);
 		cma_deref_id(id_priv);
 		if (ret)
 			rdma_destroy_id(&id_priv->id);
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 01d7008..495c803 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -147,8 +147,12 @@ static struct ib_uobject *__idr_get_uobj(struct idr *idr, int id,
 
 	spin_lock(&ib_uverbs_idr_lock);
 	uobj = idr_find(idr, id);
-	if (uobj)
-		kref_get(&uobj->ref);
+	if (uobj) {
+		if (uobj->context == context)
+			kref_get(&uobj->ref);
+		else
+			uobj = NULL;
+	}
 	spin_unlock(&ib_uverbs_idr_lock);
 
 	return uobj;
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 0f7a55d..365bc5d 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -323,7 +323,6 @@ extern int ehca_static_rate;
 extern int ehca_port_act_time;
 extern int ehca_use_hp_mr;
 extern int ehca_scaling_code;
-extern int ehca_mr_largepage;
 
 struct ipzu_queue_resp {
 	u32 qe_size;      /* queue entry size */
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
index 4aa3ffa..15806d1 100644
--- a/drivers/infiniband/hw/ehca/ehca_hca.c
+++ b/drivers/infiniband/hw/ehca/ehca_hca.c
@@ -77,6 +77,7 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
 	}
 
 	memset(props, 0, sizeof(struct ib_device_attr));
+	props->page_size_cap   = shca->hca_cap_mr_pgsize;
 	props->fw_ver          = rblock->hw_ver;
 	props->max_mr_size     = rblock->max_mr_size;
 	props->vendor_id       = rblock->vendor_id >> 8;
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 403467f..2f51c13 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -65,7 +65,7 @@ int ehca_port_act_time = 30;
 int ehca_poll_all_eqs  = 1;
 int ehca_static_rate   = -1;
 int ehca_scaling_code  = 0;
-int ehca_mr_largepage  = 0;
+int ehca_mr_largepage  = 1;
 
 module_param_named(open_aqp1,     ehca_open_aqp1,     int, S_IRUGO);
 module_param_named(debug_level,   ehca_debug_level,   int, S_IRUGO);
@@ -260,13 +260,20 @@ static struct cap_descr {
 	{ HCA_CAP_MINI_QP, "HCA_CAP_MINI_QP" },
 };
 
-int ehca_sense_attributes(struct ehca_shca *shca)
+static int ehca_sense_attributes(struct ehca_shca *shca)
 {
 	int i, ret = 0;
 	u64 h_ret;
 	struct hipz_query_hca *rblock;
 	struct hipz_query_port *port;
 
+	static const u32 pgsize_map[] = {
+		HCA_CAP_MR_PGSIZE_4K,  0x1000,
+		HCA_CAP_MR_PGSIZE_64K, 0x10000,
+		HCA_CAP_MR_PGSIZE_1M,  0x100000,
+		HCA_CAP_MR_PGSIZE_16M, 0x1000000,
+	};
+
 	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_gen_err("Cannot allocate rblock memory.");
@@ -329,8 +336,15 @@ int ehca_sense_attributes(struct ehca_shca *shca)
 		if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap))
 			ehca_gen_dbg("   %s", hca_cap_descr[i].descr);
 
-	shca->hca_cap_mr_pgsize = rblock->memory_page_size_supported;
+	/* translate supported MR page sizes; always support 4K */
+	shca->hca_cap_mr_pgsize = EHCA_PAGESIZE;
+	if (ehca_mr_largepage) { /* support extra sizes only if enabled */
+		for (i = 0; i < ARRAY_SIZE(pgsize_map); i += 2)
+			if (rblock->memory_page_size_supported & pgsize_map[i])
+				shca->hca_cap_mr_pgsize |= pgsize_map[i + 1];
+	}
 
+	/* query max MTU from first port -- it's the same for all ports */
 	port = (struct hipz_query_port *)rblock;
 	h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port);
 	if (h_ret != H_SUCCESS) {
diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c b/drivers/infiniband/hw/ehca/ehca_mrmw.c
index da88738..bb97915 100644
--- a/drivers/infiniband/hw/ehca/ehca_mrmw.c
+++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c
@@ -72,24 +72,14 @@ enum ehca_mr_pgsize {
 
 static u32 ehca_encode_hwpage_size(u32 pgsize)
 {
-	u32 idx = 0;
-	pgsize >>= 12;
-	/*
-	 * map mr page size into hw code:
-	 * 0, 1, 2, 3 for 4K, 64K, 1M, 64M
-	 */
-	while (!(pgsize & 1)) {
-		idx++;
-		pgsize >>= 4;
-	}
-	return idx;
+	int log = ilog2(pgsize);
+	WARN_ON(log < 12 || log > 24 || log & 3);
+	return (log - 12) / 4;
 }
 
 static u64 ehca_get_max_hwpage_size(struct ehca_shca *shca)
 {
-	if (shca->hca_cap_mr_pgsize & HCA_CAP_MR_PGSIZE_16M)
-		return EHCA_MR_PGSIZE16M;
-	return EHCA_MR_PGSIZE4K;
+	return 1UL << ilog2(shca->hca_cap_mr_pgsize);
 }
 
 static struct ehca_mr *ehca_mr_new(void)
@@ -259,7 +249,7 @@ struct ib_mr *ehca_reg_phys_mr(struct ib_pd *pd,
 		pginfo.u.phy.num_phys_buf = num_phys_buf;
 		pginfo.u.phy.phys_buf_array = phys_buf_array;
 		pginfo.next_hwpage =
-			((u64)iova_start & ~(hw_pgsize - 1)) / hw_pgsize;
+			((u64)iova_start & ~PAGE_MASK) / hw_pgsize;
 
 		ret = ehca_reg_mr(shca, e_mr, iova_start, size, mr_access_flags,
 				  e_pd, &pginfo, &e_mr->ib.ib_mr.lkey,
@@ -296,7 +286,7 @@ struct ib_mr *ehca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 		container_of(pd->device, struct ehca_shca, ib_device);
 	struct ehca_pd *e_pd = container_of(pd, struct ehca_pd, ib_pd);
 	struct ehca_mr_pginfo pginfo;
-	int ret;
+	int ret, page_shift;
 	u32 num_kpages;
 	u32 num_hwpages;
 	u64 hwpage_size;
@@ -351,19 +341,20 @@ struct ib_mr *ehca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 	/* determine number of MR pages */
 	num_kpages = NUM_CHUNKS((virt % PAGE_SIZE) + length, PAGE_SIZE);
 	/* select proper hw_pgsize */
-	if (ehca_mr_largepage &&
-	    (shca->hca_cap_mr_pgsize & HCA_CAP_MR_PGSIZE_16M)) {
-		int page_shift = PAGE_SHIFT;
-		if (e_mr->umem->hugetlb) {
-			/* determine page_shift, clamp between 4K and 16M */
-			page_shift = (fls64(length - 1) + 3) & ~3;
-			page_shift = min(max(page_shift, EHCA_MR_PGSHIFT4K),
-					 EHCA_MR_PGSHIFT16M);
-		}
-		hwpage_size = 1UL << page_shift;
-	} else
-		hwpage_size = EHCA_MR_PGSIZE4K; /* ehca1 only supports 4k */
-	ehca_dbg(pd->device, "hwpage_size=%lx", hwpage_size);
+	page_shift = PAGE_SHIFT;
+	if (e_mr->umem->hugetlb) {
+		/* determine page_shift, clamp between 4K and 16M */
+		page_shift = (fls64(length - 1) + 3) & ~3;
+		page_shift = min(max(page_shift, EHCA_MR_PGSHIFT4K),
+				 EHCA_MR_PGSHIFT16M);
+	}
+	hwpage_size = 1UL << page_shift;
+
+	/* now that we have the desired page size, shift until it's
+	 * supported, too. 4K is always supported, so this terminates.
+	 */
+	while (!(hwpage_size & shca->hca_cap_mr_pgsize))
+		hwpage_size >>= 4;
 
 reg_user_mr_fallback:
 	num_hwpages = NUM_CHUNKS((virt % hwpage_size) + length, hwpage_size);
@@ -547,7 +538,7 @@ int ehca_rereg_phys_mr(struct ib_mr *mr,
 		pginfo.u.phy.num_phys_buf = num_phys_buf;
 		pginfo.u.phy.phys_buf_array = phys_buf_array;
 		pginfo.next_hwpage =
-			((u64)iova_start & ~(hw_pgsize - 1)) / hw_pgsize;
+			((u64)iova_start & ~PAGE_MASK) / hw_pgsize;
 	}
 	if (mr_rereg_mask & IB_MR_REREG_ACCESS)
 		new_acl = mr_access_flags;
@@ -809,8 +800,9 @@ struct ib_fmr *ehca_alloc_fmr(struct ib_pd *pd,
 		ib_fmr = ERR_PTR(-EINVAL);
 		goto alloc_fmr_exit0;
 	}
-	hw_pgsize = ehca_get_max_hwpage_size(shca);
-	if ((1 << fmr_attr->page_shift) != hw_pgsize) {
+
+	hw_pgsize = 1 << fmr_attr->page_shift;
+	if (!(hw_pgsize & shca->hca_cap_mr_pgsize)) {
 		ehca_err(pd->device, "unsupported fmr_attr->page_shift=%x",
 			 fmr_attr->page_shift);
 		ib_fmr = ERR_PTR(-EINVAL);
@@ -826,6 +818,7 @@ struct ib_fmr *ehca_alloc_fmr(struct ib_pd *pd,
 
 	/* register MR on HCA */
 	memset(&pginfo, 0, sizeof(pginfo));
+	pginfo.hwpage_size = hw_pgsize;
 	/*
 	 * pginfo.num_hwpages==0, ie register_rpages() will not be called
 	 * but deferred to map_phys_fmr()
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index e2bd62b..de18264 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -451,7 +451,6 @@ static struct ehca_qp *internal_create_qp(
 		has_srq = 1;
 		parms.ext_type = EQPT_SRQBASE;
 		parms.srq_qpn = my_srq->real_qp_num;
-		parms.srq_token = my_srq->token;
 	}
 
 	if (is_llqp && has_srq) {
@@ -583,6 +582,9 @@ static struct ehca_qp *internal_create_qp(
 		goto create_qp_exit1;
 	}
 
+	if (has_srq)
+		parms.srq_token = my_qp->token;
+
 	parms.servicetype = ibqptype2servicetype(qp_type);
 	if (parms.servicetype < 0) {
 		ret = -EINVAL;
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 31a480e..6b33224 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -63,6 +63,10 @@ struct mlx4_ib_sqp {
 	u8			header_buf[MLX4_IB_UD_HEADER_SIZE];
 };
 
+enum {
+	MLX4_IB_MIN_SQ_STRIDE = 6
+};
+
 static const __be32 mlx4_ib_opcode[] = {
 	[IB_WR_SEND]			= __constant_cpu_to_be32(MLX4_OPCODE_SEND),
 	[IB_WR_SEND_WITH_IMM]		= __constant_cpu_to_be32(MLX4_OPCODE_SEND_IMM),
@@ -285,9 +289,17 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 	return 0;
 }
 
-static int set_user_sq_size(struct mlx4_ib_qp *qp,
+static int set_user_sq_size(struct mlx4_ib_dev *dev,
+			    struct mlx4_ib_qp *qp,
 			    struct mlx4_ib_create_qp *ucmd)
 {
+	/* Sanity check SQ size before proceeding */
+	if ((1 << ucmd->log_sq_bb_count) > dev->dev->caps.max_wqes	 ||
+	    ucmd->log_sq_stride >
+		ilog2(roundup_pow_of_two(dev->dev->caps.max_sq_desc_sz)) ||
+	    ucmd->log_sq_stride < MLX4_IB_MIN_SQ_STRIDE)
+		return -EINVAL;
+
 	qp->sq.wqe_cnt   = 1 << ucmd->log_sq_bb_count;
 	qp->sq.wqe_shift = ucmd->log_sq_stride;
 
@@ -330,7 +342,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 
 		qp->sq_no_prefetch = ucmd.sq_no_prefetch;
 
-		err = set_user_sq_size(qp, &ucmd);
+		err = set_user_sq_size(dev, qp, &ucmd);
 		if (err)
 			goto err;
 
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index be6e1e0..6bd9f13 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -204,16 +204,11 @@ static void dump_cqe(struct mthca_dev *dev, void *cqe_ptr)
 static inline void update_cons_index(struct mthca_dev *dev, struct mthca_cq *cq,
 				     int incr)
 {
-	__be32 doorbell[2];
-
 	if (mthca_is_memfree(dev)) {
 		*cq->set_ci_db = cpu_to_be32(cq->cons_index);
 		wmb();
 	} else {
-		doorbell[0] = cpu_to_be32(MTHCA_TAVOR_CQ_DB_INC_CI | cq->cqn);
-		doorbell[1] = cpu_to_be32(incr - 1);
-
-		mthca_write64(doorbell,
+		mthca_write64(MTHCA_TAVOR_CQ_DB_INC_CI | cq->cqn, incr - 1,
 			      dev->kar + MTHCA_CQ_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 		/*
@@ -731,17 +726,12 @@ repoll:
 
 int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags)
 {
-	__be32 doorbell[2];
+	u32 dbhi = ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
+		    MTHCA_TAVOR_CQ_DB_REQ_NOT_SOL :
+		    MTHCA_TAVOR_CQ_DB_REQ_NOT) |
+		to_mcq(cq)->cqn;
 
-	doorbell[0] = cpu_to_be32(((flags & IB_CQ_SOLICITED_MASK) ==
-				   IB_CQ_SOLICITED ?
-				   MTHCA_TAVOR_CQ_DB_REQ_NOT_SOL :
-				   MTHCA_TAVOR_CQ_DB_REQ_NOT)      |
-				  to_mcq(cq)->cqn);
-	doorbell[1] = (__force __be32) 0xffffffff;
-
-	mthca_write64(doorbell,
-		      to_mdev(cq->device)->kar + MTHCA_CQ_DOORBELL,
+	mthca_write64(dbhi, 0xffffffff, to_mdev(cq->device)->kar + MTHCA_CQ_DOORBELL,
 		      MTHCA_GET_DOORBELL_LOCK(&to_mdev(cq->device)->doorbell_lock));
 
 	return 0;
@@ -750,19 +740,16 @@ int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags)
 int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
 {
 	struct mthca_cq *cq = to_mcq(ibcq);
-	__be32 doorbell[2];
-	u32 sn;
-	__be32 ci;
-
-	sn = cq->arm_sn & 3;
-	ci = cpu_to_be32(cq->cons_index);
+	__be32 db_rec[2];
+	u32 dbhi;
+	u32 sn = cq->arm_sn & 3;
 
-	doorbell[0] = ci;
-	doorbell[1] = cpu_to_be32((cq->cqn << 8) | (2 << 5) | (sn << 3) |
-				  ((flags & IB_CQ_SOLICITED_MASK) ==
-				   IB_CQ_SOLICITED ? 1 : 2));
+	db_rec[0] = cpu_to_be32(cq->cons_index);
+	db_rec[1] = cpu_to_be32((cq->cqn << 8) | (2 << 5) | (sn << 3) |
+				((flags & IB_CQ_SOLICITED_MASK) ==
+				 IB_CQ_SOLICITED ? 1 : 2));
 
-	mthca_write_db_rec(doorbell, cq->arm_db);
+	mthca_write_db_rec(db_rec, cq->arm_db);
 
 	/*
 	 * Make sure that the doorbell record in host memory is
@@ -770,14 +757,12 @@ int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
 	 */
 	wmb();
 
-	doorbell[0] = cpu_to_be32((sn << 28)                       |
-				  ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
-				   MTHCA_ARBEL_CQ_DB_REQ_NOT_SOL :
-				   MTHCA_ARBEL_CQ_DB_REQ_NOT)      |
-				  cq->cqn);
-	doorbell[1] = ci;
+	dbhi = (sn << 28) |
+		((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
+		 MTHCA_ARBEL_CQ_DB_REQ_NOT_SOL :
+		 MTHCA_ARBEL_CQ_DB_REQ_NOT) | cq->cqn;
 
-	mthca_write64(doorbell,
+	mthca_write64(dbhi, cq->cons_index,
 		      to_mdev(ibcq->device)->kar + MTHCA_CQ_DOORBELL,
 		      MTHCA_GET_DOORBELL_LOCK(&to_mdev(ibcq->device)->doorbell_lock));
 
diff --git a/drivers/infiniband/hw/mthca/mthca_doorbell.h b/drivers/infiniband/hw/mthca/mthca_doorbell.h
index dd9a44d..b374dc3 100644
--- a/drivers/infiniband/hw/mthca/mthca_doorbell.h
+++ b/drivers/infiniband/hw/mthca/mthca_doorbell.h
@@ -58,10 +58,10 @@ static inline void mthca_write64_raw(__be64 val, void __iomem *dest)
 	__raw_writeq((__force u64) val, dest);
 }
 
-static inline void mthca_write64(__be32 val[2], void __iomem *dest,
+static inline void mthca_write64(u32 hi, u32 lo, void __iomem *dest,
 				 spinlock_t *doorbell_lock)
 {
-	__raw_writeq(*(u64 *) val, dest);
+	__raw_writeq((__force u64) cpu_to_be64((u64) hi << 32 | lo), dest);
 }
 
 static inline void mthca_write_db_rec(__be32 val[2], __be32 *db)
@@ -87,14 +87,17 @@ static inline void mthca_write64_raw(__be64 val, void __iomem *dest)
 	__raw_writel(((__force u32 *) &val)[1], dest + 4);
 }
 
-static inline void mthca_write64(__be32 val[2], void __iomem *dest,
+static inline void mthca_write64(u32 hi, u32 lo, void __iomem *dest,
 				 spinlock_t *doorbell_lock)
 {
 	unsigned long flags;
 
+	hi = (__force u32) cpu_to_be32(hi);
+	lo = (__force u32) cpu_to_be32(lo);
+
 	spin_lock_irqsave(doorbell_lock, flags);
-	__raw_writel((__force u32) val[0], dest);
-	__raw_writel((__force u32) val[1], dest + 4);
+	__raw_writel(hi, dest);
+	__raw_writel(lo, dest + 4);
 	spin_unlock_irqrestore(doorbell_lock, flags);
 }
 
diff --git a/drivers/infiniband/hw/mthca/mthca_eq.c b/drivers/infiniband/hw/mthca/mthca_eq.c
index 8592b26..b29de51 100644
--- a/drivers/infiniband/hw/mthca/mthca_eq.c
+++ b/drivers/infiniband/hw/mthca/mthca_eq.c
@@ -173,11 +173,6 @@ static inline u64 async_mask(struct mthca_dev *dev)
 
 static inline void tavor_set_eq_ci(struct mthca_dev *dev, struct mthca_eq *eq, u32 ci)
 {
-	__be32 doorbell[2];
-
-	doorbell[0] = cpu_to_be32(MTHCA_EQ_DB_SET_CI | eq->eqn);
-	doorbell[1] = cpu_to_be32(ci & (eq->nent - 1));
-
 	/*
 	 * This barrier makes sure that all updates to ownership bits
 	 * done by set_eqe_hw() hit memory before the consumer index
@@ -187,7 +182,7 @@ static inline void tavor_set_eq_ci(struct mthca_dev *dev, struct mthca_eq *eq, u
 	 * having set_eqe_hw() overwrite the owner field.
 	 */
 	wmb();
-	mthca_write64(doorbell,
+	mthca_write64(MTHCA_EQ_DB_SET_CI | eq->eqn, ci & (eq->nent - 1),
 		      dev->kar + MTHCA_EQ_DOORBELL,
 		      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 }
@@ -212,12 +207,7 @@ static inline void set_eq_ci(struct mthca_dev *dev, struct mthca_eq *eq, u32 ci)
 
 static inline void tavor_eq_req_not(struct mthca_dev *dev, int eqn)
 {
-	__be32 doorbell[2];
-
-	doorbell[0] = cpu_to_be32(MTHCA_EQ_DB_REQ_NOT | eqn);
-	doorbell[1] = 0;
-
-	mthca_write64(doorbell,
+	mthca_write64(MTHCA_EQ_DB_REQ_NOT | eqn, 0,
 		      dev->kar + MTHCA_EQ_DOORBELL,
 		      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 }
@@ -230,12 +220,7 @@ static inline void arbel_eq_req_not(struct mthca_dev *dev, u32 eqn_mask)
 static inline void disarm_cq(struct mthca_dev *dev, int eqn, int cqn)
 {
 	if (!mthca_is_memfree(dev)) {
-		__be32 doorbell[2];
-
-		doorbell[0] = cpu_to_be32(MTHCA_EQ_DB_DISARM_CQ | eqn);
-		doorbell[1] = cpu_to_be32(cqn);
-
-		mthca_write64(doorbell,
+		mthca_write64(MTHCA_EQ_DB_DISARM_CQ | eqn, cqn,
 			      dev->kar + MTHCA_EQ_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 	}
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index df01b20..0e5461c 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -1799,15 +1799,11 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 
 out:
 	if (likely(nreq)) {
-		__be32 doorbell[2];
-
-		doorbell[0] = cpu_to_be32(((qp->sq.next_ind << qp->sq.wqe_shift) +
-					   qp->send_wqe_offset) | f0 | op0);
-		doorbell[1] = cpu_to_be32((qp->qpn << 8) | size0);
-
 		wmb();
 
-		mthca_write64(doorbell,
+		mthca_write64(((qp->sq.next_ind << qp->sq.wqe_shift) +
+			       qp->send_wqe_offset) | f0 | op0,
+			      (qp->qpn << 8) | size0,
 			      dev->kar + MTHCA_SEND_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 		/*
@@ -1829,7 +1825,6 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 {
 	struct mthca_dev *dev = to_mdev(ibqp->device);
 	struct mthca_qp *qp = to_mqp(ibqp);
-	__be32 doorbell[2];
 	unsigned long flags;
 	int err = 0;
 	int nreq;
@@ -1907,13 +1902,10 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 		if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
 			nreq = 0;
 
-			doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
-			doorbell[1] = cpu_to_be32(qp->qpn << 8);
-
 			wmb();
 
-			mthca_write64(doorbell,
-				      dev->kar + MTHCA_RECEIVE_DOORBELL,
+			mthca_write64((qp->rq.next_ind << qp->rq.wqe_shift) | size0,
+				      qp->qpn << 8, dev->kar + MTHCA_RECEIVE_DOORBELL,
 				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 
 			qp->rq.next_ind = ind;
@@ -1923,13 +1915,10 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 
 out:
 	if (likely(nreq)) {
-		doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
-		doorbell[1] = cpu_to_be32((qp->qpn << 8) | nreq);
-
 		wmb();
 
-		mthca_write64(doorbell,
-			      dev->kar + MTHCA_RECEIVE_DOORBELL,
+		mthca_write64((qp->rq.next_ind << qp->rq.wqe_shift) | size0,
+			      qp->qpn << 8 | nreq, dev->kar + MTHCA_RECEIVE_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 	}
 
@@ -1951,7 +1940,7 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 {
 	struct mthca_dev *dev = to_mdev(ibqp->device);
 	struct mthca_qp *qp = to_mqp(ibqp);
-	__be32 doorbell[2];
+	u32 dbhi;
 	void *wqe;
 	void *prev_wqe;
 	unsigned long flags;
@@ -1981,10 +1970,8 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 		if (unlikely(nreq == MTHCA_ARBEL_MAX_WQES_PER_SEND_DB)) {
 			nreq = 0;
 
-			doorbell[0] = cpu_to_be32((MTHCA_ARBEL_MAX_WQES_PER_SEND_DB << 24) |
-						  ((qp->sq.head & 0xffff) << 8) |
-						  f0 | op0);
-			doorbell[1] = cpu_to_be32((qp->qpn << 8) | size0);
+			dbhi = (MTHCA_ARBEL_MAX_WQES_PER_SEND_DB << 24) |
+				((qp->sq.head & 0xffff) << 8) | f0 | op0;
 
 			qp->sq.head += MTHCA_ARBEL_MAX_WQES_PER_SEND_DB;
 
@@ -2000,7 +1987,8 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 			 * write MMIO send doorbell.
 			 */
 			wmb();
-			mthca_write64(doorbell,
+
+			mthca_write64(dbhi, (qp->qpn << 8) | size0,
 				      dev->kar + MTHCA_SEND_DOORBELL,
 				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 		}
@@ -2154,10 +2142,7 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 
 out:
 	if (likely(nreq)) {
-		doorbell[0] = cpu_to_be32((nreq << 24)                  |
-					  ((qp->sq.head & 0xffff) << 8) |
-					  f0 | op0);
-		doorbell[1] = cpu_to_be32((qp->qpn << 8) | size0);
+		dbhi = (nreq << 24) | ((qp->sq.head & 0xffff) << 8) | f0 | op0;
 
 		qp->sq.head += nreq;
 
@@ -2173,8 +2158,8 @@ out:
 		 * write MMIO send doorbell.
 		 */
 		wmb();
-		mthca_write64(doorbell,
-			      dev->kar + MTHCA_SEND_DOORBELL,
+
+		mthca_write64(dbhi, (qp->qpn << 8) | size0, dev->kar + MTHCA_SEND_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 	}
 
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c
index 3f58c11..553d681 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -491,7 +491,6 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
 {
 	struct mthca_dev *dev = to_mdev(ibsrq->device);
 	struct mthca_srq *srq = to_msrq(ibsrq);
-	__be32 doorbell[2];
 	unsigned long flags;
 	int err = 0;
 	int first_ind;
@@ -563,16 +562,13 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
 		if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
 			nreq = 0;
 
-			doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
-			doorbell[1] = cpu_to_be32(srq->srqn << 8);
-
 			/*
 			 * Make sure that descriptors are written
 			 * before doorbell is rung.
 			 */
 			wmb();
 
-			mthca_write64(doorbell,
+			mthca_write64(first_ind << srq->wqe_shift, srq->srqn << 8,
 				      dev->kar + MTHCA_RECEIVE_DOORBELL,
 				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 
@@ -581,16 +577,13 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
 	}
 
 	if (likely(nreq)) {
-		doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
-		doorbell[1] = cpu_to_be32((srq->srqn << 8) | nreq);
-
 		/*
 		 * Make sure that descriptors are written before
 		 * doorbell is rung.
 		 */
 		wmb();
 
-		mthca_write64(doorbell,
+		mthca_write64(first_ind << srq->wqe_shift, (srq->srqn << 8) | nreq,
 			      dev->kar + MTHCA_RECEIVE_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 	}
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 6545fa7..0a00ea0 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -84,9 +84,8 @@ enum {
 	IPOIB_MCAST_RUN 	  = 6,
 	IPOIB_STOP_REAPER         = 7,
 	IPOIB_MCAST_STARTED       = 8,
-	IPOIB_FLAG_NETIF_STOPPED  = 9,
-	IPOIB_FLAG_ADMIN_CM 	  = 10,
-	IPOIB_FLAG_UMCAST	  = 11,
+	IPOIB_FLAG_ADMIN_CM 	  = 9,
+	IPOIB_FLAG_UMCAST	  = 10,
 
 	IPOIB_MAX_BACKOFF_SECONDS = 16,
 
@@ -98,9 +97,9 @@ enum {
 
 #define	IPOIB_OP_RECV   (1ul << 31)
 #ifdef CONFIG_INFINIBAND_IPOIB_CM
-#define	IPOIB_CM_OP_SRQ (1ul << 30)
+#define	IPOIB_OP_CM     (1ul << 30)
 #else
-#define	IPOIB_CM_OP_SRQ (0)
+#define	IPOIB_OP_CM     (0)
 #endif
 
 /* structs */
@@ -197,7 +196,6 @@ struct ipoib_cm_rx {
 
 struct ipoib_cm_tx {
 	struct ib_cm_id     *id;
-	struct ib_cq        *cq;
 	struct ib_qp        *qp;
 	struct list_head     list;
 	struct net_device   *dev;
@@ -294,6 +292,7 @@ struct ipoib_dev_priv {
 	unsigned             tx_tail;
 	struct ib_sge        tx_sge;
 	struct ib_send_wr    tx_wr;
+	unsigned             tx_outstanding;
 
 	struct ib_wc ibwc[IPOIB_NUM_WC];
 
@@ -502,6 +501,7 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx);
 void ipoib_cm_skb_too_long(struct net_device* dev, struct sk_buff *skb,
 			   unsigned int mtu);
 void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc);
+void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc);
 #else
 
 struct ipoib_cm_tx;
@@ -590,6 +590,9 @@ static inline void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *w
 {
 }
 
+static inline void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
+{
+}
 #endif
 
 #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 0a0dcb8..8761077 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -87,7 +87,7 @@ static int ipoib_cm_post_receive(struct net_device *dev, int id)
 	struct ib_recv_wr *bad_wr;
 	int i, ret;
 
-	priv->cm.rx_wr.wr_id = id | IPOIB_CM_OP_SRQ;
+	priv->cm.rx_wr.wr_id = id | IPOIB_OP_CM | IPOIB_OP_RECV;
 
 	for (i = 0; i < IPOIB_CM_RX_SG; ++i)
 		priv->cm.rx_sge[i].addr = priv->cm.srq_ring[id].mapping[i];
@@ -401,7 +401,7 @@ static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
 void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
-	unsigned int wr_id = wc->wr_id & ~IPOIB_CM_OP_SRQ;
+	unsigned int wr_id = wc->wr_id & ~(IPOIB_OP_CM | IPOIB_OP_RECV);
 	struct sk_buff *skb, *newskb;
 	struct ipoib_cm_rx *p;
 	unsigned long flags;
@@ -412,7 +412,7 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
 		       wr_id, wc->status);
 
 	if (unlikely(wr_id >= ipoib_recvq_size)) {
-		if (wr_id == (IPOIB_CM_RX_DRAIN_WRID & ~IPOIB_CM_OP_SRQ)) {
+		if (wr_id == (IPOIB_CM_RX_DRAIN_WRID & ~(IPOIB_OP_CM | IPOIB_OP_RECV))) {
 			spin_lock_irqsave(&priv->lock, flags);
 			list_splice_init(&priv->cm.rx_drain_list, &priv->cm.rx_reap_list);
 			ipoib_cm_start_rx_drain(priv);
@@ -434,7 +434,7 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
 		goto repost;
 	}
 
-	if (!likely(wr_id & IPOIB_CM_RX_UPDATE_MASK)) {
+	if (unlikely(!(wr_id & IPOIB_CM_RX_UPDATE_MASK))) {
 		p = wc->qp->qp_context;
 		if (p && time_after_eq(jiffies, p->jiffies + IPOIB_CM_RX_UPDATE_TIME)) {
 			spin_lock_irqsave(&priv->lock, flags);
@@ -498,7 +498,7 @@ static inline int post_send(struct ipoib_dev_priv *priv,
 	priv->tx_sge.addr             = addr;
 	priv->tx_sge.length           = len;
 
-	priv->tx_wr.wr_id 	      = wr_id;
+	priv->tx_wr.wr_id 	      = wr_id | IPOIB_OP_CM;
 
 	return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr);
 }
@@ -549,20 +549,19 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
 		dev->trans_start = jiffies;
 		++tx->tx_head;
 
-		if (tx->tx_head - tx->tx_tail == ipoib_sendq_size) {
+		if (++priv->tx_outstanding == ipoib_sendq_size) {
 			ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",
 				  tx->qp->qp_num);
 			netif_stop_queue(dev);
-			set_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags);
 		}
 	}
 }
 
-static void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ipoib_cm_tx *tx,
-				  struct ib_wc *wc)
+void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
-	unsigned int wr_id = wc->wr_id;
+	struct ipoib_cm_tx *tx = wc->qp->qp_context;
+	unsigned int wr_id = wc->wr_id & ~IPOIB_OP_CM;
 	struct ipoib_tx_buf *tx_req;
 	unsigned long flags;
 
@@ -587,11 +586,10 @@ static void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ipoib_cm_tx *tx
 
 	spin_lock_irqsave(&priv->tx_lock, flags);
 	++tx->tx_tail;
-	if (unlikely(test_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags)) &&
-	    tx->tx_head - tx->tx_tail <= ipoib_sendq_size >> 1) {
-		clear_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags);
+	if (unlikely(--priv->tx_outstanding == ipoib_sendq_size >> 1) &&
+	    netif_queue_stopped(dev) &&
+	    test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
 		netif_wake_queue(dev);
-	}
 
 	if (wc->status != IB_WC_SUCCESS &&
 	    wc->status != IB_WC_WR_FLUSH_ERR) {
@@ -614,11 +612,6 @@ static void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ipoib_cm_tx *tx
 			tx->neigh = NULL;
 		}
 
-		/* queue would be re-started anyway when TX is destroyed,
-		 * but it makes sense to do it ASAP here. */
-		if (test_and_clear_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags))
-			netif_wake_queue(dev);
-
 		if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {
 			list_move(&tx->list, &priv->cm.reap_list);
 			queue_work(ipoib_workqueue, &priv->cm.reap_task);
@@ -632,19 +625,6 @@ static void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ipoib_cm_tx *tx
 	spin_unlock_irqrestore(&priv->tx_lock, flags);
 }
 
-static void ipoib_cm_tx_completion(struct ib_cq *cq, void *tx_ptr)
-{
-	struct ipoib_cm_tx *tx = tx_ptr;
-	int n, i;
-
-	ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
-	do {
-		n = ib_poll_cq(cq, IPOIB_NUM_WC, tx->ibwc);
-		for (i = 0; i < n; ++i)
-			ipoib_cm_handle_tx_wc(tx->dev, tx, tx->ibwc + i);
-	} while (n == IPOIB_NUM_WC);
-}
-
 int ipoib_cm_dev_open(struct net_device *dev)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -807,17 +787,18 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
 	return 0;
 }
 
-static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ib_cq *cq)
+static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_cm_tx *tx)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct ib_qp_init_attr attr = {
-		.send_cq		= cq,
+		.send_cq		= priv->cq,
 		.recv_cq		= priv->cq,
 		.srq			= priv->cm.srq,
 		.cap.max_send_wr	= ipoib_sendq_size,
 		.cap.max_send_sge	= 1,
 		.sq_sig_type		= IB_SIGNAL_ALL_WR,
 		.qp_type		= IB_QPT_RC,
+		.qp_context		= tx
         };
 
 	return ib_create_qp(priv->pd, &attr);
@@ -899,21 +880,7 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
 		goto err_tx;
 	}
 
-	p->cq = ib_create_cq(priv->ca, ipoib_cm_tx_completion, NULL, p,
-			     ipoib_sendq_size + 1, 0);
-	if (IS_ERR(p->cq)) {
-		ret = PTR_ERR(p->cq);
-		ipoib_warn(priv, "failed to allocate tx cq: %d\n", ret);
-		goto err_cq;
-	}
-
-	ret = ib_req_notify_cq(p->cq, IB_CQ_NEXT_COMP);
-	if (ret) {
-		ipoib_warn(priv, "failed to request completion notification: %d\n", ret);
-		goto err_req_notify;
-	}
-
-	p->qp = ipoib_cm_create_tx_qp(p->dev, p->cq);
+	p->qp = ipoib_cm_create_tx_qp(p->dev, p);
 	if (IS_ERR(p->qp)) {
 		ret = PTR_ERR(p->qp);
 		ipoib_warn(priv, "failed to allocate tx qp: %d\n", ret);
@@ -950,12 +917,8 @@ err_modify:
 err_id:
 	p->id = NULL;
 	ib_destroy_qp(p->qp);
-err_req_notify:
 err_qp:
 	p->qp = NULL;
-	ib_destroy_cq(p->cq);
-err_cq:
-	p->cq = NULL;
 err_tx:
 	return ret;
 }
@@ -964,6 +927,8 @@ static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(p->dev);
 	struct ipoib_tx_buf *tx_req;
+	unsigned long flags;
+	unsigned long begin;
 
 	ipoib_dbg(priv, "Destroy active connection 0x%x head 0x%x tail 0x%x\n",
 		  p->qp ? p->qp->qp_num : 0, p->tx_head, p->tx_tail);
@@ -971,27 +936,40 @@ static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p)
 	if (p->id)
 		ib_destroy_cm_id(p->id);
 
-	if (p->qp)
-		ib_destroy_qp(p->qp);
-
-	if (p->cq)
-		ib_destroy_cq(p->cq);
-
-	if (test_bit(IPOIB_FLAG_NETIF_STOPPED, &p->flags))
-		netif_wake_queue(p->dev);
-
 	if (p->tx_ring) {
+		/* Wait for all sends to complete */
+		begin = jiffies;
 		while ((int) p->tx_tail - (int) p->tx_head < 0) {
-			tx_req = &p->tx_ring[p->tx_tail & (ipoib_sendq_size - 1)];
-			ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len,
-					 DMA_TO_DEVICE);
-			dev_kfree_skb_any(tx_req->skb);
-			++p->tx_tail;
+			if (time_after(jiffies, begin + 5 * HZ)) {
+				ipoib_warn(priv, "timing out; %d sends not completed\n",
+					   p->tx_head - p->tx_tail);
+				goto timeout;
+			}
+
+			msleep(1);
 		}
+	}
 
-		kfree(p->tx_ring);
+timeout:
+
+	while ((int) p->tx_tail - (int) p->tx_head < 0) {
+		tx_req = &p->tx_ring[p->tx_tail & (ipoib_sendq_size - 1)];
+		ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len,
+				    DMA_TO_DEVICE);
+		dev_kfree_skb_any(tx_req->skb);
+		++p->tx_tail;
+		spin_lock_irqsave(&priv->tx_lock, flags);
+		if (unlikely(--priv->tx_outstanding == ipoib_sendq_size >> 1) &&
+		    netif_queue_stopped(p->dev) &&
+		    test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
+			netif_wake_queue(p->dev);
+		spin_unlock_irqrestore(&priv->tx_lock, flags);
 	}
 
+	if (p->qp)
+		ib_destroy_qp(p->qp);
+
+	kfree(p->tx_ring);
 	kfree(p);
 }
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 1a77e79..5063dd5 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -267,11 +267,10 @@ static void ipoib_ib_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
 
 	spin_lock_irqsave(&priv->tx_lock, flags);
 	++priv->tx_tail;
-	if (unlikely(test_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags)) &&
-	    priv->tx_head - priv->tx_tail <= ipoib_sendq_size >> 1) {
-		clear_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags);
+	if (unlikely(--priv->tx_outstanding == ipoib_sendq_size >> 1) &&
+	    netif_queue_stopped(dev) &&
+	    test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
 		netif_wake_queue(dev);
-	}
 	spin_unlock_irqrestore(&priv->tx_lock, flags);
 
 	if (wc->status != IB_WC_SUCCESS &&
@@ -301,14 +300,18 @@ poll_more:
 		for (i = 0; i < n; i++) {
 			struct ib_wc *wc = priv->ibwc + i;
 
-			if (wc->wr_id & IPOIB_CM_OP_SRQ) {
-				++done;
-				ipoib_cm_handle_rx_wc(dev, wc);
-			} else if (wc->wr_id & IPOIB_OP_RECV) {
+			if (wc->wr_id & IPOIB_OP_RECV) {
 				++done;
-				ipoib_ib_handle_rx_wc(dev, wc);
-			} else
-				ipoib_ib_handle_tx_wc(dev, wc);
+				if (wc->wr_id & IPOIB_OP_CM)
+					ipoib_cm_handle_rx_wc(dev, wc);
+				else
+					ipoib_ib_handle_rx_wc(dev, wc);
+			} else {
+				if (wc->wr_id & IPOIB_OP_CM)
+					ipoib_cm_handle_tx_wc(dev, wc);
+				else
+					ipoib_ib_handle_tx_wc(dev, wc);
+			}
 		}
 
 		if (n != t)
@@ -401,10 +404,9 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
 		address->last_send = priv->tx_head;
 		++priv->tx_head;
 
-		if (priv->tx_head - priv->tx_tail == ipoib_sendq_size) {
+		if (++priv->tx_outstanding == ipoib_sendq_size) {
 			ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
 			netif_stop_queue(dev);
-			set_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags);
 		}
 	}
 }
@@ -436,7 +438,8 @@ void ipoib_reap_ah(struct work_struct *work)
 	__ipoib_reap_ah(dev);
 
 	if (!test_bit(IPOIB_STOP_REAPER, &priv->flags))
-		queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
+		queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task,
+				   round_jiffies_relative(HZ));
 }
 
 int ipoib_ib_dev_open(struct net_device *dev)
@@ -472,7 +475,8 @@ int ipoib_ib_dev_open(struct net_device *dev)
 	}
 
 	clear_bit(IPOIB_STOP_REAPER, &priv->flags);
-	queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
+	queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task,
+			   round_jiffies_relative(HZ));
 
 	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 
@@ -561,12 +565,17 @@ void ipoib_drain_cq(struct net_device *dev)
 			if (priv->ibwc[i].status == IB_WC_SUCCESS)
 				priv->ibwc[i].status = IB_WC_WR_FLUSH_ERR;
 
-			if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ)
-				ipoib_cm_handle_rx_wc(dev, priv->ibwc + i);
-			else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV)
-				ipoib_ib_handle_rx_wc(dev, priv->ibwc + i);
-			else
-				ipoib_ib_handle_tx_wc(dev, priv->ibwc + i);
+			if (priv->ibwc[i].wr_id & IPOIB_OP_RECV) {
+				if (priv->ibwc[i].wr_id & IPOIB_OP_CM)
+					ipoib_cm_handle_rx_wc(dev, priv->ibwc + i);
+				else
+					ipoib_ib_handle_rx_wc(dev, priv->ibwc + i);
+			} else {
+				if (priv->ibwc[i].wr_id & IPOIB_OP_CM)
+					ipoib_cm_handle_tx_wc(dev, priv->ibwc + i);
+				else
+					ipoib_ib_handle_tx_wc(dev, priv->ibwc + i);
+			}
 		}
 	} while (n == IPOIB_NUM_WC);
 }
@@ -612,6 +621,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush)
 						    DMA_TO_DEVICE);
 				dev_kfree_skb_any(tx_req->skb);
 				++priv->tx_tail;
+				--priv->tx_outstanding;
 			}
 
 			for (i = 0; i < ipoib_recvq_size; ++i) {
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index e072f3c..ace2345 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -148,8 +148,6 @@ static int ipoib_stop(struct net_device *dev)
 
 	netif_stop_queue(dev);
 
-	clear_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags);
-
 	/*
 	 * Now flush workqueue to make sure a scheduled task doesn't
 	 * bring our internal state back up.
@@ -895,7 +893,7 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
 		goto out_rx_ring_cleanup;
 	}
 
-	/* priv->tx_head & tx_tail are already 0 */
+	/* priv->tx_head, tx_tail & tx_outstanding are already 0 */
 
 	if (ipoib_ib_dev_init(dev, ca, port))
 		goto out_tx_ring_cleanup;
diff --git a/drivers/net/mlx4/fw.c b/drivers/net/mlx4/fw.c
index 6471d33..5064873 100644
--- a/drivers/net/mlx4/fw.c
+++ b/drivers/net/mlx4/fw.c
@@ -736,7 +736,7 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
 	MLX4_PUT(inbox, (u8) (PAGE_SHIFT - 12), INIT_HCA_UAR_PAGE_SZ_OFFSET);
 	MLX4_PUT(inbox, param->log_uar_sz,      INIT_HCA_LOG_UAR_SZ_OFFSET);
 
-	err = mlx4_cmd(dev, mailbox->dma, 0, 0, MLX4_CMD_INIT_HCA, 1000);
+	err = mlx4_cmd(dev, mailbox->dma, 0, 0, MLX4_CMD_INIT_HCA, 10000);
 
 	if (err)
 		mlx4_err(dev, "INIT_HCA returns %d\n", err);
diff --git a/include/linux/mlx4/doorbell.h b/include/linux/mlx4/doorbell.h
index 3f2da44..f31bba2 100644
--- a/include/linux/mlx4/doorbell.h
+++ b/include/linux/mlx4/doorbell.h
@@ -52,11 +52,6 @@
 #define MLX4_INIT_DOORBELL_LOCK(ptr)    do { } while (0)
 #define MLX4_GET_DOORBELL_LOCK(ptr)      (NULL)
 
-static inline void mlx4_write64_raw(__be64 val, void __iomem *dest)
-{
-	__raw_writeq((__force u64) val, dest);
-}
-
 static inline void mlx4_write64(__be32 val[2], void __iomem *dest,
 				spinlock_t *doorbell_lock)
 {
@@ -75,12 +70,6 @@ static inline void mlx4_write64(__be32 val[2], void __iomem *dest,
 #define MLX4_INIT_DOORBELL_LOCK(ptr)     spin_lock_init(ptr)
 #define MLX4_GET_DOORBELL_LOCK(ptr)      (ptr)
 
-static inline void mlx4_write64_raw(__be64 val, void __iomem *dest)
-{
-	__raw_writel(((__force u32 *) &val)[0], dest);
-	__raw_writel(((__force u32 *) &val)[1], dest + 4);
-}
-
 static inline void mlx4_write64(__be32 val[2], void __iomem *dest,
 				spinlock_t *doorbell_lock)
 {

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

* [GIT PULL] please pull infiniband.git
@ 2007-09-23 20:06 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-09-23 20:06 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get one fix for a data corruption bug in 2.6.23-rc7:

Jack Morgenstein (1):
      IB/mlx4: Fix data corruption triggered by wrong headroom marking order

 drivers/infiniband/hw/mlx4/qp.c |   62 ++++++++++++++++++++++++++++++--------
 1 files changed, 49 insertions(+), 13 deletions(-)


diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index ba0428d..85c51bd 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1211,12 +1211,42 @@ static void set_datagram_seg(struct mlx4_wqe_datagram_seg *dseg,
 	dseg->qkey = cpu_to_be32(wr->wr.ud.remote_qkey);
 }
 
-static void set_data_seg(struct mlx4_wqe_data_seg *dseg,
-			 struct ib_sge *sg)
+static void set_mlx_icrc_seg(void *dseg)
+{
+	u32 *t = dseg;
+	struct mlx4_wqe_inline_seg *iseg = dseg;
+
+	t[1] = 0;
+
+	/*
+	 * Need a barrier here before writing the byte_count field to
+	 * make sure that all the data is visible before the
+	 * byte_count field is set.  Otherwise, if the segment begins
+	 * a new cacheline, the HCA prefetcher could grab the 64-byte
+	 * chunk and get a valid (!= * 0xffffffff) byte count but
+	 * stale data, and end up sending the wrong data.
+	 */
+	wmb();
+
+	iseg->byte_count = cpu_to_be32((1 << 31) | 4);
+}
+
+static void set_data_seg(struct mlx4_wqe_data_seg *dseg, struct ib_sge *sg)
 {
-	dseg->byte_count = cpu_to_be32(sg->length);
 	dseg->lkey       = cpu_to_be32(sg->lkey);
 	dseg->addr       = cpu_to_be64(sg->addr);
+
+	/*
+	 * Need a barrier here before writing the byte_count field to
+	 * make sure that all the data is visible before the
+	 * byte_count field is set.  Otherwise, if the segment begins
+	 * a new cacheline, the HCA prefetcher could grab the 64-byte
+	 * chunk and get a valid (!= * 0xffffffff) byte count but
+	 * stale data, and end up sending the wrong data.
+	 */
+	wmb();
+
+	dseg->byte_count = cpu_to_be32(sg->length);
 }
 
 int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
@@ -1225,6 +1255,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 	struct mlx4_ib_qp *qp = to_mqp(ibqp);
 	void *wqe;
 	struct mlx4_wqe_ctrl_seg *ctrl;
+	struct mlx4_wqe_data_seg *dseg;
 	unsigned long flags;
 	int nreq;
 	int err = 0;
@@ -1324,22 +1355,27 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 			break;
 		}
 
-		for (i = 0; i < wr->num_sge; ++i) {
-			set_data_seg(wqe, wr->sg_list + i);
+		/*
+		 * Write data segments in reverse order, so as to
+		 * overwrite cacheline stamp last within each
+		 * cacheline.  This avoids issues with WQE
+		 * prefetching.
+		 */
 
-			wqe  += sizeof (struct mlx4_wqe_data_seg);
-			size += sizeof (struct mlx4_wqe_data_seg) / 16;
-		}
+		dseg = wqe;
+		dseg += wr->num_sge - 1;
+		size += wr->num_sge * (sizeof (struct mlx4_wqe_data_seg) / 16);
 
 		/* Add one more inline data segment for ICRC for MLX sends */
-		if (qp->ibqp.qp_type == IB_QPT_SMI || qp->ibqp.qp_type == IB_QPT_GSI) {
-			((struct mlx4_wqe_inline_seg *) wqe)->byte_count =
-				cpu_to_be32((1 << 31) | 4);
-			((u32 *) wqe)[1] = 0;
-			wqe  += sizeof (struct mlx4_wqe_data_seg);
+		if (unlikely(qp->ibqp.qp_type == IB_QPT_SMI ||
+			     qp->ibqp.qp_type == IB_QPT_GSI)) {
+			set_mlx_icrc_seg(dseg + 1);
 			size += sizeof (struct mlx4_wqe_data_seg) / 16;
 		}
 
+		for (i = wr->num_sge - 1; i >= 0; --i, --dseg)
+			set_data_seg(dseg, wr->sg_list + i);
+
 		ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ?
 				    MLX4_WQE_CTRL_FENCE : 0) | size;
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-07-30 20:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-07-30 20:18 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get some small fixes for 2.6.23:

Dave Olson (4):
      IB/ipath: Remove unsafe fastrcvint code from interrupt handler
      IB/ipath: Use faster put_tid_2 routine after initialization
      IB/ipath: Fix some issues with buffer cancel and sendctrl register update
      IB/ipath: Workaround problem of errormask register being overwritten

Hoang-Nam Nguyen (2):
      IB/ehca: Fix include order to better match kernel style
      IB/ehca: Move extern declarations from .c files to .h files

Jack Morgenstein (1):
      mlx4_core: Remove kfree() in mlx4_mr_alloc() error flow

Roland Dreier (1):
      IB/mlx4: Whitespace fix

Tom Tucker (1):
      RDMA/amso1100: Initialize the wait_queue_head_t in the c2_qp structure

 drivers/infiniband/hw/amso1100/c2_qp.c        |    1 +
 drivers/infiniband/hw/ehca/ehca_classes.h     |    1 +
 drivers/infiniband/hw/ehca/ehca_mrmw.c        |    6 +--
 drivers/infiniband/hw/ehca/ehca_pd.c          |    1 -
 drivers/infiniband/hw/ehca/hcp_if.c           |    1 -
 drivers/infiniband/hw/ehca/ipz_pt_fn.h        |    2 +
 drivers/infiniband/hw/ipath/ipath_common.h    |    3 +-
 drivers/infiniband/hw/ipath/ipath_driver.c    |   11 +++--
 drivers/infiniband/hw/ipath/ipath_iba6120.c   |   20 +++++---
 drivers/infiniband/hw/ipath/ipath_init_chip.c |    7 ++-
 drivers/infiniband/hw/ipath/ipath_intr.c      |   63 ++++++------------------
 drivers/infiniband/hw/ipath/ipath_kernel.h    |   13 +----
 drivers/infiniband/hw/ipath/ipath_stats.c     |   54 +++++++++++++++++++--
 drivers/infiniband/hw/mlx4/qp.c               |    1 -
 drivers/net/mlx4/mr.c                         |   15 +-----
 15 files changed, 101 insertions(+), 98 deletions(-)

diff --git a/drivers/infiniband/hw/amso1100/c2_qp.c b/drivers/infiniband/hw/amso1100/c2_qp.c
index 420c138..01d0786 100644
--- a/drivers/infiniband/hw/amso1100/c2_qp.c
+++ b/drivers/infiniband/hw/amso1100/c2_qp.c
@@ -506,6 +506,7 @@ int c2_alloc_qp(struct c2_dev *c2dev,
 	qp->send_sgl_depth = qp_attrs->cap.max_send_sge;
 	qp->rdma_write_sgl_depth = qp_attrs->cap.max_send_sge;
 	qp->recv_sgl_depth = qp_attrs->cap.max_recv_sge;
+	init_waitqueue_head(&qp->wait);
 
 	/* Initialize the SQ MQ */
 	q_size = be32_to_cpu(reply->sq_depth);
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 3725aa8..b5e9603 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -322,6 +322,7 @@ extern int ehca_static_rate;
 extern int ehca_port_act_time;
 extern int ehca_use_hp_mr;
 extern int ehca_scaling_code;
+extern int ehca_mr_largepage;
 
 struct ipzu_queue_resp {
 	u32 qe_size;      /* queue entry size */
diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c b/drivers/infiniband/hw/ehca/ehca_mrmw.c
index c1b868b..d97eda3 100644
--- a/drivers/infiniband/hw/ehca/ehca_mrmw.c
+++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c
@@ -40,10 +40,10 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <rdma/ib_umem.h>
-
 #include <asm/current.h>
 
+#include <rdma/ib_umem.h>
+
 #include "ehca_iverbs.h"
 #include "ehca_mrmw.h"
 #include "hcp_if.h"
@@ -64,8 +64,6 @@ enum ehca_mr_pgsize {
 	EHCA_MR_PGSIZE16M = 0x1000000L
 };
 
-extern int ehca_mr_largepage;
-
 static u32 ehca_encode_hwpage_size(u32 pgsize)
 {
 	u32 idx = 0;
diff --git a/drivers/infiniband/hw/ehca/ehca_pd.c b/drivers/infiniband/hw/ehca/ehca_pd.c
index 3dafd7f..43bcf08 100644
--- a/drivers/infiniband/hw/ehca/ehca_pd.c
+++ b/drivers/infiniband/hw/ehca/ehca_pd.c
@@ -88,7 +88,6 @@ int ehca_dealloc_pd(struct ib_pd *pd)
 	u32 cur_pid = current->tgid;
 	struct ehca_pd *my_pd = container_of(pd, struct ehca_pd, ib_pd);
 	int i, leftovers = 0;
-	extern struct kmem_cache *small_qp_cache;
 	struct ipz_small_queue_page *page, *tmp;
 
 	if (my_pd->ib_pd.uobject && my_pd->ib_pd.uobject->context &&
diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c
index fdbfebe..24f4541 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.c
+++ b/drivers/infiniband/hw/ehca/hcp_if.c
@@ -758,7 +758,6 @@ u64 hipz_h_register_rpage_mr(const struct ipz_adapter_handle adapter_handle,
 			     const u64 logical_address_of_page,
 			     const u64 count)
 {
-	extern int ehca_debug_level;
 	u64 ret;
 
 	if (unlikely(ehca_debug_level >= 2)) {
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.h b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
index c6937a0..a801274 100644
--- a/drivers/infiniband/hw/ehca/ipz_pt_fn.h
+++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
@@ -54,6 +54,8 @@
 struct ehca_pd;
 struct ipz_small_queue_page;
 
+extern struct kmem_cache *small_qp_cache;
+
 /* struct generic ehca page */
 struct ipz_page {
 	u8 entries[EHCA_PAGESIZE];
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h
index b4b786d..6ad822c 100644
--- a/drivers/infiniband/hw/ipath/ipath_common.h
+++ b/drivers/infiniband/hw/ipath/ipath_common.h
@@ -100,8 +100,7 @@ struct infinipath_stats {
 	__u64 sps_hwerrs;
 	/* number of times IB link changed state unexpectedly */
 	__u64 sps_iblink;
-	/* kernel receive interrupts that didn't read intstat */
-	__u64 sps_fastrcvint;
+	__u64 sps_unused; /* was fastrcvint, no longer implemented */
 	/* number of kernel (port0) packets received */
 	__u64 sps_port0pkts;
 	/* number of "ethernet" packets sent by driver */
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index 09c5fd8..6ccba36 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -740,7 +740,7 @@ void ipath_disarm_piobufs(struct ipath_devdata *dd, unsigned first,
 	 * pioavail updates to memory to stop.
 	 */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
-			 sendorig & ~IPATH_S_PIOBUFAVAILUPD);
+			 sendorig & ~INFINIPATH_S_PIOBUFAVAILUPD);
 	sendorig = ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
 			 dd->ipath_sendctrl);
@@ -1614,7 +1614,7 @@ int ipath_waitfor_mdio_cmdready(struct ipath_devdata *dd)
  * it's safer to always do it.
  * PIOAvail bits are updated by the chip as if normal send had happened.
  */
-void ipath_cancel_sends(struct ipath_devdata *dd)
+void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl)
 {
 	ipath_dbg("Cancelling all in-progress send buffers\n");
 	dd->ipath_lastcancel = jiffies+HZ/2; /* skip armlaunch errs a bit */
@@ -1627,6 +1627,9 @@ void ipath_cancel_sends(struct ipath_devdata *dd)
 	ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
 	ipath_disarm_piobufs(dd, 0,
 		(unsigned)(dd->ipath_piobcnt2k + dd->ipath_piobcnt4k));
+	if (restore_sendctrl) /* else done by caller later */
+		ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
+				 dd->ipath_sendctrl);
 
 	/* and again, be sure all have hit the chip */
 	ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
@@ -1655,7 +1658,7 @@ static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
 	/* flush all queued sends when going to DOWN or INIT, to be sure that
 	 * they don't block MAD packets */
 	if (!linkcmd || linkcmd == INFINIPATH_IBCC_LINKCMD_INIT)
-		ipath_cancel_sends(dd);
+		ipath_cancel_sends(dd, 1);
 
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl,
 			 dd->ipath_ibcctrl | which);
@@ -2000,7 +2003,7 @@ void ipath_shutdown_device(struct ipath_devdata *dd)
 
 	ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_DISABLE <<
 			    INFINIPATH_IBCC_LINKINITCMD_SHIFT);
-	ipath_cancel_sends(dd);
+	ipath_cancel_sends(dd, 0);
 
 	/* disable IBC */
 	dd->ipath_control &= ~INFINIPATH_C_LINKENABLE;
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c
index 9868ccd..5b6ac9a 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba6120.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c
@@ -321,6 +321,8 @@ static const struct ipath_hwerror_msgs ipath_6120_hwerror_msgs[] = {
 		        << INFINIPATH_HWE_TXEMEMPARITYERR_SHIFT)
 
 static int ipath_pe_txe_recover(struct ipath_devdata *);
+static void ipath_pe_put_tid_2(struct ipath_devdata *, u64 __iomem *,
+			       u32, unsigned long);
 
 /**
  * ipath_pe_handle_hwerrors - display hardware errors.
@@ -555,8 +557,11 @@ static int ipath_pe_boardname(struct ipath_devdata *dd, char *name,
 		ipath_dev_err(dd, "Unsupported InfiniPath hardware revision %u.%u!\n",
 			      dd->ipath_majrev, dd->ipath_minrev);
 		ret = 1;
-	} else
+	} else {
 		ret = 0;
+		if (dd->ipath_minrev >= 2)
+			dd->ipath_f_put_tid = ipath_pe_put_tid_2;
+	}
 
 	return ret;
 }
@@ -1220,7 +1225,7 @@ static void ipath_pe_clear_tids(struct ipath_devdata *dd, unsigned port)
 		 port * dd->ipath_rcvtidcnt * sizeof(*tidbase));
 
 	for (i = 0; i < dd->ipath_rcvtidcnt; i++)
-		ipath_pe_put_tid(dd, &tidbase[i], RCVHQ_RCV_TYPE_EXPECTED,
+		dd->ipath_f_put_tid(dd, &tidbase[i], RCVHQ_RCV_TYPE_EXPECTED,
 				 tidinv);
 
 	tidbase = (u64 __iomem *)
@@ -1229,7 +1234,7 @@ static void ipath_pe_clear_tids(struct ipath_devdata *dd, unsigned port)
 		 port * dd->ipath_rcvegrcnt * sizeof(*tidbase));
 
 	for (i = 0; i < dd->ipath_rcvegrcnt; i++)
-		ipath_pe_put_tid(dd, &tidbase[i], RCVHQ_RCV_TYPE_EAGER,
+		dd->ipath_f_put_tid(dd, &tidbase[i], RCVHQ_RCV_TYPE_EAGER,
 				 tidinv);
 }
 
@@ -1395,10 +1400,11 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd)
 	dd->ipath_f_quiet_serdes = ipath_pe_quiet_serdes;
 	dd->ipath_f_bringup_serdes = ipath_pe_bringup_serdes;
 	dd->ipath_f_clear_tids = ipath_pe_clear_tids;
-	if (dd->ipath_minrev >= 2)
-		dd->ipath_f_put_tid = ipath_pe_put_tid_2;
-	else
-		dd->ipath_f_put_tid = ipath_pe_put_tid;
+	/*
+	 * this may get changed after we read the chip revision,
+	 * but we start with the safe version for all revs
+	 */
+	dd->ipath_f_put_tid = ipath_pe_put_tid;
 	dd->ipath_f_cleanup = ipath_setup_pe_cleanup;
 	dd->ipath_f_setextled = ipath_setup_pe_setextled;
 	dd->ipath_f_get_base_info = ipath_pe_get_base_info;
diff --git a/drivers/infiniband/hw/ipath/ipath_init_chip.c b/drivers/infiniband/hw/ipath/ipath_init_chip.c
index 49951d5..9dd0bac 100644
--- a/drivers/infiniband/hw/ipath/ipath_init_chip.c
+++ b/drivers/infiniband/hw/ipath/ipath_init_chip.c
@@ -782,7 +782,7 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
 	 * Follows early_init because some chips have to initialize
 	 * PIO buffers in early_init to avoid false parity errors.
 	 */
-	ipath_cancel_sends(dd);
+	ipath_cancel_sends(dd, 0);
 
 	/* early_init sets rcvhdrentsize and rcvhdrsize, so this must be
 	 * done after early_init */
@@ -851,13 +851,14 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_hwerrmask,
 			 dd->ipath_hwerrmask);
 
-	dd->ipath_maskederrs = dd->ipath_ignorederrs;
 	/* clear all */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_errorclear, -1LL);
 	/* enable errors that are masked, at least this first time. */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask,
 			 ~dd->ipath_maskederrs);
-	/* clear any interrups up to this point (ints still not enabled) */
+	dd->ipath_errormask = ipath_read_kreg64(dd,
+		dd->ipath_kregs->kr_errormask);
+	/* clear any interrupts up to this point (ints still not enabled) */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_intclear, -1LL);
 
 	/*
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c
index 1fd91c5..b29fe7e 100644
--- a/drivers/infiniband/hw/ipath/ipath_intr.c
+++ b/drivers/infiniband/hw/ipath/ipath_intr.c
@@ -303,7 +303,7 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd,
 		 * Flush all queued sends when link went to DOWN or INIT,
 		 * to be sure that they don't block SMA and other MAD packets
 		 */
-		ipath_cancel_sends(dd);
+		ipath_cancel_sends(dd, 1);
 	}
 	else if (lstate == IPATH_IBSTATE_INIT || lstate == IPATH_IBSTATE_ARM ||
 	    lstate == IPATH_IBSTATE_ACTIVE) {
@@ -517,10 +517,7 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs)
 
 	supp_msgs = handle_frequent_errors(dd, errs, msg, &noprint);
 
-	/*
-	 * don't report errors that are masked (includes those always
-	 * ignored)
-	 */
+	/* don't report errors that are masked */
 	errs &= ~dd->ipath_maskederrs;
 
 	/* do these first, they are most important */
@@ -566,19 +563,19 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs)
 		 * ones on this particular interrupt, which also isn't great
 		 */
 		dd->ipath_maskederrs |= dd->ipath_lasterror | errs;
+		dd->ipath_errormask &= ~dd->ipath_maskederrs;
 		ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask,
-				 ~dd->ipath_maskederrs);
+			dd->ipath_errormask);
 		s_iserr = ipath_decode_err(msg, sizeof msg,
-				 (dd->ipath_maskederrs & ~dd->
-				  ipath_ignorederrs));
+			dd->ipath_maskederrs);
 
-		if ((dd->ipath_maskederrs & ~dd->ipath_ignorederrs) &
+		if (dd->ipath_maskederrs &
 			~(INFINIPATH_E_RRCVEGRFULL |
 			INFINIPATH_E_RRCVHDRFULL | INFINIPATH_E_PKTERRS))
 			ipath_dev_err(dd, "Temporarily disabling "
 			    "error(s) %llx reporting; too frequent (%s)\n",
-				(unsigned long long) (dd->ipath_maskederrs &
-				~dd->ipath_ignorederrs), msg);
+				(unsigned long long)dd->ipath_maskederrs,
+				msg);
 		else {
 			/*
 			 * rcvegrfull and rcvhdrqfull are "normal",
@@ -793,19 +790,22 @@ void ipath_clear_freeze(struct ipath_devdata *dd)
 	/* disable error interrupts, to avoid confusion */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, 0ULL);
 
+	/* also disable interrupts; errormask is sometimes overwriten */
+	ipath_write_kreg(dd, dd->ipath_kregs->kr_intmask, 0ULL);
+
 	/*
 	 * clear all sends, because they have may been
 	 * completed by usercode while in freeze mode, and
 	 * therefore would not be sent, and eventually
 	 * might cause the process to run out of bufs
 	 */
-	ipath_cancel_sends(dd);
+	ipath_cancel_sends(dd, 0);
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_control,
 			 dd->ipath_control);
 
 	/* ensure pio avail updates continue */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
-		 dd->ipath_sendctrl & ~IPATH_S_PIOBUFAVAILUPD);
+		 dd->ipath_sendctrl & ~INFINIPATH_S_PIOBUFAVAILUPD);
 	ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
 		 dd->ipath_sendctrl);
@@ -817,7 +817,7 @@ void ipath_clear_freeze(struct ipath_devdata *dd)
 	for (i = 0; i < dd->ipath_pioavregs; i++) {
 		/* deal with 6110 chip bug */
 		im = i > 3 ? ((i&1) ? i-1 : i+1) : i;
-		val = ipath_read_kreg64(dd, 0x1000+(im*sizeof(u64)));
+		val = ipath_read_kreg64(dd, (0x1000/sizeof(u64))+im);
 		dd->ipath_pioavailregs_dma[i] = dd->ipath_pioavailshadow[i]
 			= le64_to_cpu(val);
 	}
@@ -832,7 +832,8 @@ void ipath_clear_freeze(struct ipath_devdata *dd)
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_errorclear,
 		E_SPKT_ERRS_IGNORE);
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask,
-		~dd->ipath_maskederrs);
+		dd->ipath_errormask);
+	ipath_write_kreg(dd, dd->ipath_kregs->kr_intmask, -1LL);
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_intclear, 0ULL);
 }
 
@@ -1002,7 +1003,6 @@ irqreturn_t ipath_intr(int irq, void *data)
 	u32 istat, chk0rcv = 0;
 	ipath_err_t estat = 0;
 	irqreturn_t ret;
-	u32 oldhead, curtail;
 	static unsigned unexpected = 0;
 	static const u32 port0rbits = (1U<<INFINIPATH_I_RCVAVAIL_SHIFT) |
 		 (1U<<INFINIPATH_I_RCVURG_SHIFT);
@@ -1035,36 +1035,6 @@ irqreturn_t ipath_intr(int irq, void *data)
 		goto bail;
 	}
 
-	/*
-	 * We try to avoid reading the interrupt status register, since
-	 * that's a PIO read, and stalls the processor for up to about
-	 * ~0.25 usec. The idea is that if we processed a port0 packet,
-	 * we blindly clear the  port 0 receive interrupt bits, and nothing
-	 * else, then return.  If other interrupts are pending, the chip
-	 * will re-interrupt us as soon as we write the intclear register.
-	 * We then won't process any more kernel packets (if not the 2nd
-	 * time, then the 3rd or 4th) and we'll then handle the other
-	 * interrupts.   We clear the interrupts first so that we don't
-	 * lose intr for later packets that arrive while we are processing.
-	 */
-	oldhead = dd->ipath_port0head;
-	curtail = (u32)le64_to_cpu(*dd->ipath_hdrqtailptr);
-	if (oldhead != curtail) {
-		if (dd->ipath_flags & IPATH_GPIO_INTR) {
-			ipath_write_kreg(dd, dd->ipath_kregs->kr_gpio_clear,
-					 (u64) (1 << IPATH_GPIO_PORT0_BIT));
-			istat = port0rbits | INFINIPATH_I_GPIO;
-		}
-		else
-			istat = port0rbits;
-		ipath_write_kreg(dd, dd->ipath_kregs->kr_intclear, istat);
-		ipath_kreceive(dd);
-		if (oldhead != dd->ipath_port0head) {
-			ipath_stats.sps_fastrcvint++;
-			goto done;
-		}
-	}
-
 	istat = ipath_read_kreg32(dd, dd->ipath_kregs->kr_intstatus);
 
 	if (unlikely(!istat)) {
@@ -1225,7 +1195,6 @@ irqreturn_t ipath_intr(int irq, void *data)
 		handle_layer_pioavail(dd);
 	}
 
-done:
 	ret = IRQ_HANDLED;
 
 bail:
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index ace63ef..7a7966f 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -261,18 +261,10 @@ struct ipath_devdata {
 	 * limiting of hwerror reporting
 	 */
 	ipath_err_t ipath_lasthwerror;
-	/*
-	 * errors masked because they occur too fast, also includes errors
-	 * that are always ignored (ipath_ignorederrs)
-	 */
+	/* errors masked because they occur too fast */
 	ipath_err_t ipath_maskederrs;
 	/* time in jiffies at which to re-enable maskederrs */
 	unsigned long ipath_unmasktime;
-	/*
-	 * errors always ignored (masked), at least for a given
-	 * chip/device, because they are wrong or not useful
-	 */
-	ipath_err_t ipath_ignorederrs;
 	/* count of egrfull errors, combined for all ports */
 	u64 ipath_last_tidfull;
 	/* for ipath_qcheck() */
@@ -436,6 +428,7 @@ struct ipath_devdata {
 	u64 ipath_lastibcstat;
 	/* hwerrmask shadow */
 	ipath_err_t ipath_hwerrmask;
+	ipath_err_t ipath_errormask; /* errormask shadow */
 	/* interrupt config reg shadow */
 	u64 ipath_intconfig;
 	/* kr_sendpiobufbase value */
@@ -683,7 +676,7 @@ int ipath_unordered_wc(void);
 
 void ipath_disarm_piobufs(struct ipath_devdata *, unsigned first,
 			  unsigned cnt);
-void ipath_cancel_sends(struct ipath_devdata *);
+void ipath_cancel_sends(struct ipath_devdata *, int);
 
 int ipath_create_rcvhdrq(struct ipath_devdata *, struct ipath_portdata *);
 void ipath_free_pddata(struct ipath_devdata *, struct ipath_portdata *);
diff --git a/drivers/infiniband/hw/ipath/ipath_stats.c b/drivers/infiniband/hw/ipath/ipath_stats.c
index 73ed17d..bae4f56 100644
--- a/drivers/infiniband/hw/ipath/ipath_stats.c
+++ b/drivers/infiniband/hw/ipath/ipath_stats.c
@@ -196,6 +196,45 @@ static void ipath_qcheck(struct ipath_devdata *dd)
 	}
 }
 
+static void ipath_chk_errormask(struct ipath_devdata *dd)
+{
+	static u32 fixed;
+	u32 ctrl;
+	unsigned long errormask;
+	unsigned long hwerrs;
+
+	if (!dd->ipath_errormask || !(dd->ipath_flags & IPATH_INITTED))
+		return;
+
+	errormask = ipath_read_kreg64(dd, dd->ipath_kregs->kr_errormask);
+
+	if (errormask == dd->ipath_errormask)
+		return;
+	fixed++;
+
+	hwerrs = ipath_read_kreg64(dd, dd->ipath_kregs->kr_hwerrstatus);
+	ctrl = ipath_read_kreg32(dd, dd->ipath_kregs->kr_control);
+
+	ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask,
+		dd->ipath_errormask);
+
+	if ((hwerrs & dd->ipath_hwerrmask) ||
+		(ctrl & INFINIPATH_C_FREEZEMODE)) {
+		/* force re-interrupt of pending events, just in case */
+		ipath_write_kreg(dd, dd->ipath_kregs->kr_hwerrclear, 0ULL);
+		ipath_write_kreg(dd, dd->ipath_kregs->kr_errorclear, 0ULL);
+		ipath_write_kreg(dd, dd->ipath_kregs->kr_intclear, 0ULL);
+		dev_info(&dd->pcidev->dev,
+			"errormask fixed(%u) %lx -> %lx, ctrl %x hwerr %lx\n",
+			fixed, errormask, (unsigned long)dd->ipath_errormask,
+			ctrl, hwerrs);
+	} else
+		ipath_dbg("errormask fixed(%u) %lx -> %lx, no freeze\n",
+			fixed, errormask,
+			(unsigned long)dd->ipath_errormask);
+}
+
+
 /**
  * ipath_get_faststats - get word counters from chip before they overflow
  * @opaque - contains a pointer to the infinipath device ipath_devdata
@@ -251,14 +290,13 @@ void ipath_get_faststats(unsigned long opaque)
 		dd->ipath_lasterror = 0;
 	if (dd->ipath_lasthwerror)
 		dd->ipath_lasthwerror = 0;
-	if ((dd->ipath_maskederrs & ~dd->ipath_ignorederrs)
+	if (dd->ipath_maskederrs
 	    && time_after(jiffies, dd->ipath_unmasktime)) {
 		char ebuf[256];
 		int iserr;
 		iserr = ipath_decode_err(ebuf, sizeof ebuf,
-				 (dd->ipath_maskederrs & ~dd->
-				  ipath_ignorederrs));
-		if ((dd->ipath_maskederrs & ~dd->ipath_ignorederrs) &
+			dd->ipath_maskederrs);
+		if (dd->ipath_maskederrs &
 				~(INFINIPATH_E_RRCVEGRFULL | INFINIPATH_E_RRCVHDRFULL |
 				INFINIPATH_E_PKTERRS ))
 			ipath_dev_err(dd, "Re-enabling masked errors "
@@ -278,9 +316,12 @@ void ipath_get_faststats(unsigned long opaque)
 				ipath_cdbg(ERRPKT, "Re-enabling packet"
 						" problem interrupt (%s)\n", ebuf);
 		}
-		dd->ipath_maskederrs = dd->ipath_ignorederrs;
+
+		/* re-enable masked errors */
+		dd->ipath_errormask |= dd->ipath_maskederrs;
 		ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask,
-				 ~dd->ipath_maskederrs);
+			dd->ipath_errormask);
+		dd->ipath_maskederrs = 0;
 	}
 
 	/* limit qfull messages to ~one per minute per port */
@@ -294,6 +335,7 @@ void ipath_get_faststats(unsigned long opaque)
 		}
 	}
 
+	ipath_chk_errormask(dd);
 done:
 	mod_timer(&dd->ipath_stats_timer, jiffies + HZ * 5);
 }
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index f6315df..ba0428d 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1209,7 +1209,6 @@ static void set_datagram_seg(struct mlx4_wqe_datagram_seg *dseg,
 	memcpy(dseg->av, &to_mah(wr->wr.ud.ah)->av, sizeof (struct mlx4_av));
 	dseg->dqpn = cpu_to_be32(wr->wr.ud.remote_qpn);
 	dseg->qkey = cpu_to_be32(wr->wr.ud.remote_qkey);
-
 }
 
 static void set_data_seg(struct mlx4_wqe_data_seg *dseg,
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index d0808fa..5b87183 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -255,10 +255,8 @@ int mlx4_mr_alloc(struct mlx4_dev *dev, u32 pd, u64 iova, u64 size, u32 access,
 	int err;
 
 	index = mlx4_bitmap_alloc(&priv->mr_table.mpt_bitmap);
-	if (index == -1) {
-		err = -ENOMEM;
-		goto err;
-	}
+	if (index == -1)
+		return -ENOMEM;
 
 	mr->iova       = iova;
 	mr->size       = size;
@@ -269,15 +267,8 @@ int mlx4_mr_alloc(struct mlx4_dev *dev, u32 pd, u64 iova, u64 size, u32 access,
 
 	err = mlx4_mtt_init(dev, npages, page_shift, &mr->mtt);
 	if (err)
-		goto err_index;
-
-	return 0;
-
-err_index:
-	mlx4_bitmap_free(&priv->mr_table.mpt_bitmap, index);
+		mlx4_bitmap_free(&priv->mr_table.mpt_bitmap, index);
 
-err:
-	kfree(mr);
 	return err;
 }
 EXPORT_SYMBOL_GPL(mlx4_mr_alloc);

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

* [GIT PULL] please pull infiniband.git
@ 2007-07-21  4:56 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-07-21  4:56 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get another small batch of changes for 2.6.23:

Arthur Jones (1):
      IB/ipath: Remove ipath_layer dead code

Florin Malita (1):
      IB/mlx4: Fix leaks in __mlx4_ib_modify_qp

Hoang-Nam Nguyen (3):
      IB/ehca: Support large page MRs
      IB/ehca: Generate async event when SRQ limit reached
      IB/ehca: Move ehca2ib_return_code() out of line

Joachim Fenkes (1):
      IB/ehca: Make internal_create/destroy_qp() static

Michael S. Tsirkin (1):
      IB/mthca: Change command token on timeout

Roland Dreier (2):
      mlx4_core: Change command token on timeout
      IB/mlx4: Fix error path in create_qp_common()

Stefan Roscher (1):
      IB/ehca: Support small QP queues

 drivers/infiniband/hw/ehca/ehca_classes.h |   50 +++--
 drivers/infiniband/hw/ehca/ehca_cq.c      |    8 +-
 drivers/infiniband/hw/ehca/ehca_eq.c      |    8 +-
 drivers/infiniband/hw/ehca/ehca_irq.c     |   42 +++-
 drivers/infiniband/hw/ehca/ehca_main.c    |   49 ++++-
 drivers/infiniband/hw/ehca/ehca_mrmw.c    |  371 ++++++++++++++++++++++++-----
 drivers/infiniband/hw/ehca/ehca_mrmw.h    |    2 +-
 drivers/infiniband/hw/ehca/ehca_pd.c      |   25 ++-
 drivers/infiniband/hw/ehca/ehca_qp.c      |  178 ++++++++------
 drivers/infiniband/hw/ehca/ehca_tools.h   |   19 +--
 drivers/infiniband/hw/ehca/ehca_uverbs.c  |    2 +-
 drivers/infiniband/hw/ehca/hcp_if.c       |   50 +++-
 drivers/infiniband/hw/ehca/ipz_pt_fn.c    |  222 +++++++++++++----
 drivers/infiniband/hw/ehca/ipz_pt_fn.h    |   26 ++-
 drivers/infiniband/hw/ipath/Makefile      |    1 -
 drivers/infiniband/hw/ipath/ipath_layer.c |  365 ----------------------------
 drivers/infiniband/hw/ipath/ipath_layer.h |   71 ------
 drivers/infiniband/hw/ipath/ipath_verbs.h |    2 -
 drivers/infiniband/hw/mlx4/qp.c           |   20 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c   |    3 +-
 drivers/net/mlx4/cmd.c                    |    3 +-
 21 files changed, 802 insertions(+), 715 deletions(-)
 delete mode 100644 drivers/infiniband/hw/ipath/ipath_layer.c
 delete mode 100644 drivers/infiniband/hw/ipath/ipath_layer.h

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

* [GIT PULL] please pull infiniband.git
@ 2007-07-18 22:52 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-07-18 22:52 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get another batch of changes for 2.6.23, including the
beginnings of cleaning up the work request posting code in mthca and
mlx4:

Dotan Barak (2):
      IB/mlx4: Take sizeof the correct pointer in call to memset()
      RDMA/cma: Remove local write permission from QP access flags

Hoang-Nam Nguyen (7):
      IB/ehca: Fix memory leak in error path of ehca_get_dma_mr()
      IB/ehca: Use common error code mapping instead of specific ones
      IB/ehca: Use #define for "pages per register_rpage" instead of hardcoded value
      IB/ehca: Use macro to calculate number of chunks in a mem block
      IB/ehca: MR/MW structure refactoring
      IB/ehca: Restructure ehca_set_pagebuf()
      IB/ehca: Fix warnings issued by checkpatch.pl

Jack Morgenstein (4):
      IB/mlx4: Fix flow label returned from query QP
      IB/mlx4: Fix port returned from query QP for QPs in INIT state
      mlx4_core: Reset device when internal error is detected
      IB/mlx4: Increase max outstanding RDMA reads as target

Joachim Fenkes (1):
      IB/ehca: Fix HW level autodetection

Roland Dreier (14):
      IB/mthca: Schedule MSI support for removal
      IB/mthca: Fix printk format used for firmware version in warning
      IB/iser: Make a couple of functions static
      IB/ipath: Make a few functions static
      IB/ipath: Remove ipath_get_user_pages_nocopy()
      IB/cm: Make internal function cm_get_ack_delay() static
      IB/mthca: Use uninitialized_var() for f0
      IB/mlx4: Return receive queue sizes for userspace QPs from query QP
      IB/mthca: Factor out setting WQE data segment entries
      IB/mlx4: Factor out setting WQE data segment entries
      IB/mlx4: Factor out setting other WQE segments
      IB/mthca: Factor out setting WQE remote address and atomic segment entries
      IB/mthca: Factor out setting WQE UD segment entries
      IB/mthca: Simplify use of size0 in work request posting

Steve Wise (1):
      RDMA/cxgb3: Remove cm_id reference on listen failures

 Documentation/feature-removal-schedule.txt        |   10 +
 drivers/infiniband/core/cm.c                      |    2 +-
 drivers/infiniband/core/cma.c                     |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c             |    1 +
 drivers/infiniband/hw/ehca/ehca_av.c              |    2 +-
 drivers/infiniband/hw/ehca/ehca_classes.h         |   54 +-
 drivers/infiniband/hw/ehca/ehca_classes_pSeries.h |  156 ++--
 drivers/infiniband/hw/ehca/ehca_cq.c              |    2 +-
 drivers/infiniband/hw/ehca/ehca_eq.c              |    3 +-
 drivers/infiniband/hw/ehca/ehca_hca.c             |   28 +-
 drivers/infiniband/hw/ehca/ehca_irq.c             |   56 +-
 drivers/infiniband/hw/ehca/ehca_iverbs.h          |    7 +-
 drivers/infiniband/hw/ehca/ehca_main.c            |   50 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c            | 1087 ++++++++-------------
 drivers/infiniband/hw/ehca/ehca_mrmw.h            |   21 +-
 drivers/infiniband/hw/ehca/ehca_qes.h             |   22 +-
 drivers/infiniband/hw/ehca/ehca_qp.c              |   39 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c            |   15 +-
 drivers/infiniband/hw/ehca/ehca_tools.h           |   31 +-
 drivers/infiniband/hw/ehca/ehca_uverbs.c          |   10 +-
 drivers/infiniband/hw/ehca/hcp_if.c               |    8 +-
 drivers/infiniband/hw/ehca/hcp_phyp.c             |    2 +-
 drivers/infiniband/hw/ehca/hipz_fns_core.h        |    4 +-
 drivers/infiniband/hw/ehca/hipz_hw.h              |   24 +-
 drivers/infiniband/hw/ehca/ipz_pt_fn.c            |    2 +-
 drivers/infiniband/hw/ehca/ipz_pt_fn.h            |    4 +-
 drivers/infiniband/hw/ipath/ipath_driver.c        |    2 +-
 drivers/infiniband/hw/ipath/ipath_eeprom.c        |    4 +-
 drivers/infiniband/hw/ipath/ipath_intr.c          |    2 +-
 drivers/infiniband/hw/ipath/ipath_kernel.h        |    2 -
 drivers/infiniband/hw/ipath/ipath_ruc.c           |    2 +-
 drivers/infiniband/hw/ipath/ipath_user_pages.c    |   26 -
 drivers/infiniband/hw/ipath/ipath_verbs.c         |    2 +-
 drivers/infiniband/hw/ipath/ipath_verbs.h         |    4 -
 drivers/infiniband/hw/mlx4/qp.c                   |  115 ++-
 drivers/infiniband/hw/mthca/mthca_main.c          |   22 +-
 drivers/infiniband/hw/mthca/mthca_qp.c            |  221 ++---
 drivers/infiniband/hw/mthca/mthca_srq.c           |   28 +-
 drivers/infiniband/hw/mthca/mthca_wqe.h           |   15 +
 drivers/infiniband/ulp/iser/iscsi_iser.h          |    5 -
 drivers/infiniband/ulp/iser/iser_memory.c         |    4 +-
 drivers/infiniband/ulp/iser/iser_verbs.c          |   47 +-
 drivers/net/mlx4/catas.c                          |  106 ++-
 drivers/net/mlx4/eq.c                             |   56 +-
 drivers/net/mlx4/intf.c                           |    2 +
 drivers/net/mlx4/main.c                           |   26 +-
 drivers/net/mlx4/mlx4.h                           |   13 +-
 47 files changed, 1055 insertions(+), 1291 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-07-12 23:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-07-12 23:07 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the first batch of changes for the 2.6.23 merge window:

Andrew Morton (1):
      IB: Fix ib_umem_get() when npages == 0

Arthur Jones (3):
      IB/ipath: Update MAINTAINERS entry
      IB/ipath: Test interrupts at driver startup
      IB/ipath: Remove bogus RD_ATOMIC checks from modify_qp

Bryan O'Sullivan (1):
      IB/ipath: Include <linux/vmalloc.h> to fix ppc64 build

Dave Olson (5):
      IB/ipath: Support the IBA6110 revision 4
      IB/ipath: Fix the mtrr_add args for chips with 2 buffer sizes
      IB/ipath: Use S_ABORT not cancel and abort on exit freeze mode after recovery
      IB/ipath: Be more cautious about coming out of freeze mode
      IB/ipath: Change version wording to be less confusing with release number

Dotan Barak (2):
      mlx4_core: Get the maximum message size from reported device capabilities
      IB/core: Take sizeof the correct pointer when calling kmalloc()

Hal Rosenstock (1):
      IB/mad: Enhance SMI for switch support

Hoang-Nam Nguyen (3):
      IB/ehca: Change scaling_code parameter description to match default value
      IB/ehca: Report RDMA atomic attributes in query_qp()
      IB/ehca: Improve latency by unlocking after triggering the hardware

Jack Morgenstein (2):
      IB/mlx4: Implement query QP
      IB/mlx4: Implement query SRQ

Jan Engelhardt (1):
      IB: Use menuconfig for InfiniBand menu

Joachim Fenkes (9):
      IB/ehca: Refactor "maybe missed event" code
      IB/ehca: HW level, HW caps and MTU autodetection
      IB/ehca: QP code restructuring in preparation for SRQ
      IB/ehca: add Shared Receive Queue support
      IB/ehca: Lock renaming, static initializers
      IB/ehca: Refactor sync between completions and destroy_cq using atomic_t
      IB/ehca: Change idr spinlocks into rwlocks
      IB/ehca: Return QP pointer in poll_cq()
      IB/ehca: Notify consumers of LID/PKEY/SM changes after nondisruptive events

Joan Eslinger (1):
      IB/ipath: Change use of constants for TID type to defined values

John Gregor (2):
      IB/ipath: Remove incompletely implemented ipath_runtime flags and code
      IB/ipath: Update copyright dates

Mark Debbage (2):
      IB/ipath: Correct checking of swminor version field when using subports
      IB/ipath: Make handling of one subport consistent

Michael Albaugh (4):
      IB/ipath: Support blinking LEDs with an led_override file
      IB/ipath: Lock and always use shadow copies of GPIO register
      IB/ipath: Log "active" time and some errors to EEPROM
      IB/ipath: Add capability to modify PBC word

Michael S. Tsirkin (2):
      IB/mlx4: Include linux/mutex.h from mlx4_ib.h
      mlx4_core: Include linux/mutex.h from mlx4.h

Ralph Campbell (10):
      IB/ipath: Fix problem with next WQE after a UC completion
      IB/ipath: Fix local loopback bug when waiting for resources
      IB/ipath: Set M bit in BTH according to IB spec
      IB/ipath: Fix RDMA read retry code
      IB/ipath: Wait for PIO available interrupt
      IB/ipath: Fix possible data corruption if multiple SGEs used for receive
      IB/ipath: Duplicate RDMA reads can cause responder to NAK inappropriately
      IB/ipath: Add barrier before updating WC head in shared memory
      IB/ipath: Lower default number of kernel send buffers
      IB/ipath: Remove support for preproduction HTX InfiniPath cards

Robert Walsh (5):
      IB/ipath: Fix maximum MTU reporting
      IB/ipath: Fill in some missing FMR-related fields in query_device
      IB/ipath: Send ACK invalid where appropriate
      IB/ipath: ipath_poll fixups and enhancements
      IB/ipath: Clean send flags properly on QP reset

Roland Dreier (5):
      IB: Remove garbage non-ASCII characters from comments
      IB: Update mailing list address
      IPoIB/cm: Fix warning if IPV6 is not enabled
      IPoIB: Recycle loopback skbs instead of freeing and reallocating
      IB: Update MAINTAINERS with Hal's new email address

Sean Hefty (7):
      IB/ipath: return correct PortGUID in NodeInfo
      IB/sa: Make sure SA queries use default P_Key
      IB/cm: Use spin_lock_irq() instead of spin_lock_irqsave() when possible
      IB/cm: Include HCA ACK delay in local ACK timeout
      IB/cm: cm_msgs.h should include ib_cm.h
      IB/cm: Fix handling of duplicate SIDR REQs
      IB/cm: Send no match if a SIDR REQ does not match a listen

Shani Moideen (1):
      IB/mthca: Replace memset(<addr>, 0, PAGE_SIZE) with clear_page(<addr>)

Stefan Roscher (2):
      IB/ehca: Support UD low-latency QPs
      IB/ehca: Set SEND_GRH flag for all non-LL UD QPs on eHCA2

Steve Wise (6):
      RDMA/cxgb3: Streaming -> RDMA mode transition fixes
      RDMA/cxgb3: TERMINATE WRs can hang the tx ofld queue
      RDMA/cxgb3: Don't count neg_adv abort_req_rss messages as real aborts
      RDMA/cxgb3: ctrl-qp init/clear shouldn't set the gen bit
      RDMA/cxgb3: Don't post TID_RELEASE message
      RDMA/cxgb3: Don't abort after failures sending the mpa reply

WANG Cong (1):
      RDMA/cxgb3: Check return of kmalloc() in iwch_register_device()

 MAINTAINERS                                       |   15 +-
 drivers/infiniband/Kconfig                        |   15 +-
 drivers/infiniband/core/agent.c                   |   19 +-
 drivers/infiniband/core/cm.c                      |  247 ++++---
 drivers/infiniband/core/cm_msgs.h                 |    1 +
 drivers/infiniband/core/cma.c                     |    1 -
 drivers/infiniband/core/mad.c                     |   50 ++-
 drivers/infiniband/core/multicast.c               |    2 +-
 drivers/infiniband/core/sa.h                      |    2 +-
 drivers/infiniband/core/sa_query.c                |   87 ++-
 drivers/infiniband/core/smi.c                     |   16 +-
 drivers/infiniband/core/smi.h                     |    2 +
 drivers/infiniband/core/sysfs.c                   |    2 +-
 drivers/infiniband/core/ucm.c                     |    1 -
 drivers/infiniband/core/umem.c                    |    1 +
 drivers/infiniband/hw/amso1100/Kconfig            |    2 +-
 drivers/infiniband/hw/cxgb3/Kconfig               |    2 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c            |    6 +-
 drivers/infiniband/hw/cxgb3/cxio_wr.h             |    3 +-
 drivers/infiniband/hw/cxgb3/iwch_cm.c             |  108 ++--
 drivers/infiniband/hw/cxgb3/iwch_cm.h             |    1 +
 drivers/infiniband/hw/cxgb3/iwch_provider.c       |    7 +-
 drivers/infiniband/hw/cxgb3/iwch_qp.c             |    7 +-
 drivers/infiniband/hw/ehca/Kconfig                |    2 +-
 drivers/infiniband/hw/ehca/ehca_av.c              |    6 +-
 drivers/infiniband/hw/ehca/ehca_classes.h         |   75 ++-
 drivers/infiniband/hw/ehca/ehca_classes_pSeries.h |    4 +-
 drivers/infiniband/hw/ehca/ehca_cq.c              |   50 +-
 drivers/infiniband/hw/ehca/ehca_hca.c             |   61 ++-
 drivers/infiniband/hw/ehca/ehca_irq.c             |  140 +++--
 drivers/infiniband/hw/ehca/ehca_irq.h             |    1 -
 drivers/infiniband/hw/ehca/ehca_iverbs.h          |   18 +
 drivers/infiniband/hw/ehca/ehca_main.c            |   98 +++-
 drivers/infiniband/hw/ehca/ehca_qp.c              |  751 +++++++++++++++------
 drivers/infiniband/hw/ehca/ehca_reqs.c            |   85 ++-
 drivers/infiniband/hw/ehca/ehca_tools.h           |    1 +
 drivers/infiniband/hw/ehca/ehca_uverbs.c          |   13 +-
 drivers/infiniband/hw/ehca/hcp_if.c               |   58 +-
 drivers/infiniband/hw/ehca/hcp_if.h               |    1 -
 drivers/infiniband/hw/ehca/hipz_hw.h              |   19 +
 drivers/infiniband/hw/ehca/ipz_pt_fn.h            |   28 +-
 drivers/infiniband/hw/ipath/Kconfig               |    2 +-
 drivers/infiniband/hw/ipath/ipath_common.h        |   33 +-
 drivers/infiniband/hw/ipath/ipath_cq.c            |    7 +-
 drivers/infiniband/hw/ipath/ipath_debug.h         |    2 +-
 drivers/infiniband/hw/ipath/ipath_diag.c          |   41 +-
 drivers/infiniband/hw/ipath/ipath_driver.c        |  187 +++++-
 drivers/infiniband/hw/ipath/ipath_eeprom.c        |  303 ++++++++-
 drivers/infiniband/hw/ipath/ipath_file_ops.c      |  205 ++++--
 drivers/infiniband/hw/ipath/ipath_fs.c            |    9 +-
 drivers/infiniband/hw/ipath/ipath_iba6110.c       |  101 ++--
 drivers/infiniband/hw/ipath/ipath_iba6120.c       |   92 ++-
 drivers/infiniband/hw/ipath/ipath_init_chip.c     |   26 +-
 drivers/infiniband/hw/ipath/ipath_intr.c          |  141 ++++-
 drivers/infiniband/hw/ipath/ipath_kernel.h        |   85 +++-
 drivers/infiniband/hw/ipath/ipath_keys.c          |    2 +-
 drivers/infiniband/hw/ipath/ipath_layer.c         |    2 +-
 drivers/infiniband/hw/ipath/ipath_layer.h         |    2 +-
 drivers/infiniband/hw/ipath/ipath_mad.c           |   11 +-
 drivers/infiniband/hw/ipath/ipath_mmap.c          |    2 +-
 drivers/infiniband/hw/ipath/ipath_mr.c            |    2 +-
 drivers/infiniband/hw/ipath/ipath_qp.c            |   19 +-
 drivers/infiniband/hw/ipath/ipath_rc.c            |  116 +++-
 drivers/infiniband/hw/ipath/ipath_registers.h     |    2 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c           |   36 +-
 drivers/infiniband/hw/ipath/ipath_srq.c           |    4 +-
 drivers/infiniband/hw/ipath/ipath_stats.c         |   25 +-
 drivers/infiniband/hw/ipath/ipath_sysfs.c         |   43 ++-
 drivers/infiniband/hw/ipath/ipath_uc.c            |    9 +-
 drivers/infiniband/hw/ipath/ipath_ud.c            |    6 +-
 drivers/infiniband/hw/ipath/ipath_user_pages.c    |    2 +-
 drivers/infiniband/hw/ipath/ipath_verbs.c         |   29 +-
 drivers/infiniband/hw/ipath/ipath_verbs.h         |    3 +-
 drivers/infiniband/hw/ipath/ipath_verbs_mcast.c   |    2 +-
 drivers/infiniband/hw/ipath/ipath_wc_ppc64.c      |    2 +-
 drivers/infiniband/hw/ipath/ipath_wc_x86_64.c     |   29 +-
 drivers/infiniband/hw/mlx4/Kconfig                |    1 -
 drivers/infiniband/hw/mlx4/main.c                 |    6 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h              |    4 +
 drivers/infiniband/hw/mlx4/qp.c                   |  137 ++++
 drivers/infiniband/hw/mlx4/srq.c                  |   18 +
 drivers/infiniband/hw/mthca/Kconfig               |    2 +-
 drivers/infiniband/hw/mthca/mthca_allocator.c     |    2 +-
 drivers/infiniband/hw/mthca/mthca_eq.c            |    2 +-
 drivers/infiniband/ulp/ipoib/Kconfig              |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c           |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c           |   33 +-
 drivers/infiniband/ulp/iser/Kconfig               |    2 +-
 drivers/infiniband/ulp/srp/Kconfig                |    2 +-
 drivers/net/cxgb3/version.h                       |    2 +-
 drivers/net/mlx4/fw.c                             |    3 +
 drivers/net/mlx4/fw.h                             |    1 +
 drivers/net/mlx4/main.c                           |    1 +
 drivers/net/mlx4/mlx4.h                           |    1 +
 drivers/net/mlx4/qp.c                             |   21 +
 drivers/net/mlx4/srq.c                            |   30 +
 include/linux/mlx4/device.h                       |    2 +
 include/linux/mlx4/qp.h                           |    3 +
 include/rdma/ib_cm.h                              |    1 -
 include/rdma/ib_mad.h                             |    3 +
 100 files changed, 2812 insertions(+), 1061 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-07-03  3:50 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-07-03  3:50 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a fix for a crash in IPoIB and new device IDs for mlx4:

Jack Morgenstein (1):
      mlx4_core: Add new Mellanox device IDs

Ralph Campbell (1):
      IPoIB/cm: Partial error clean up unmaps wrong address

 drivers/infiniband/ulp/ipoib/ipoib_cm.c |    4 ++--
 drivers/net/mlx4/main.c                 |    2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)


diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 5ffc464..ea74d1e 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -148,8 +148,8 @@ partial_error:
 
 	ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);
 
-	for (; i >= 0; --i)
-		ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
+	for (; i > 0; --i)
+		ib_dma_unmap_single(priv->ca, mapping[i], PAGE_SIZE, DMA_FROM_DEVICE);
 
 	dev_kfree_skb_any(skb);
 	return NULL;
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index 41eafeb..c3da2a2 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -911,6 +911,8 @@ static struct pci_device_id mlx4_pci_table[] = {
 	{ PCI_VDEVICE(MELLANOX, 0x6340) }, /* MT25408 "Hermon" SDR */
 	{ PCI_VDEVICE(MELLANOX, 0x634a) }, /* MT25408 "Hermon" DDR */
 	{ PCI_VDEVICE(MELLANOX, 0x6354) }, /* MT25408 "Hermon" QDR */
+	{ PCI_VDEVICE(MELLANOX, 0x6732) }, /* MT25408 "Hermon" DDR PCIe gen2 */
+	{ PCI_VDEVICE(MELLANOX, 0x673c) }, /* MT25408 "Hermon" QDR PCIe gen2 */
 	{ 0, }
 };
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-06-22 16:26 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-06-22 16:26 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few fixes for crashes/deadlocks as a well as a few
other small, safe fixes:

Jack Morgenstein (1):
      IB/mlx4: Correct max_srq_wr returned from mlx4_ib_query_device()

Michael S. Tsirkin (2):
      IPoIB/cm: Initialize RX before moving QP to RTR
      IPoIB/cm: Fix interoperability when MTU doesn't match

Roland Dreier (2):
      IB/umem: Fix possible hang on process exit
      IPoIB/cm: Remove dead definition of struct ipoib_cm_id

 drivers/infiniband/core/umem.c          |   16 ++++++-----
 drivers/infiniband/hw/mlx4/main.c       |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |   42 ++++++++++++++----------------
 3 files changed, 30 insertions(+), 30 deletions(-)


diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
index b4aec51..d40652a 100644
--- a/drivers/infiniband/core/umem.c
+++ b/drivers/infiniband/core/umem.c
@@ -225,13 +225,15 @@ void ib_umem_release(struct ib_umem *umem)
 	 * up here and not be able to take the mmap_sem.  In that case
 	 * we defer the vm_locked accounting to the system workqueue.
 	 */
-	if (context->closing && !down_write_trylock(&mm->mmap_sem)) {
-		INIT_WORK(&umem->work, ib_umem_account);
-		umem->mm   = mm;
-		umem->diff = diff;
-
-		schedule_work(&umem->work);
-		return;
+	if (context->closing) {
+		if (!down_write_trylock(&mm->mmap_sem)) {
+			INIT_WORK(&umem->work, ib_umem_account);
+			umem->mm   = mm;
+			umem->diff = diff;
+
+			schedule_work(&umem->work);
+			return;
+		}
 	} else
 		down_write(&mm->mmap_sem);
 
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index 1095c82..c591616 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -120,7 +120,7 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
 	props->max_qp_init_rd_atom = dev->dev->caps.max_qp_init_rdma;
 	props->max_res_rd_atom	   = props->max_qp_rd_atom * props->max_qp;
 	props->max_srq		   = dev->dev->caps.num_srqs - dev->dev->caps.reserved_srqs;
-	props->max_srq_wr	   = dev->dev->caps.max_srq_wqes;
+	props->max_srq_wr	   = dev->dev->caps.max_srq_wqes - 1;
 	props->max_srq_sge	   = dev->dev->caps.max_srq_sge;
 	props->local_ca_ack_delay  = dev->dev->caps.local_ca_ack_delay;
 	props->atomic_cap	   = dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_ATOMIC ?
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 076a0bb..5ffc464 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -56,13 +56,6 @@ MODULE_PARM_DESC(cm_data_debug_level,
 #define IPOIB_CM_RX_DELAY       (3 * 256 * HZ)
 #define IPOIB_CM_RX_UPDATE_MASK (0x3)
 
-struct ipoib_cm_id {
-	struct ib_cm_id *id;
-	int flags;
-	u32 remote_qpn;
-	u32 remote_mtu;
-};
-
 static struct ib_qp_attr ipoib_cm_err_attr = {
 	.qp_state = IB_QPS_ERR
 };
@@ -309,6 +302,11 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
 		return -ENOMEM;
 	p->dev = dev;
 	p->id = cm_id;
+	cm_id->context = p;
+	p->state = IPOIB_CM_RX_LIVE;
+	p->jiffies = jiffies;
+	INIT_LIST_HEAD(&p->list);
+
 	p->qp = ipoib_cm_create_rx_qp(dev, p);
 	if (IS_ERR(p->qp)) {
 		ret = PTR_ERR(p->qp);
@@ -320,24 +318,24 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
 	if (ret)
 		goto err_modify;
 
+	spin_lock_irq(&priv->lock);
+	queue_delayed_work(ipoib_workqueue,
+			   &priv->cm.stale_task, IPOIB_CM_RX_DELAY);
+	/* Add this entry to passive ids list head, but do not re-add it
+	 * if IB_EVENT_QP_LAST_WQE_REACHED has moved it to flush list. */
+	p->jiffies = jiffies;
+	if (p->state == IPOIB_CM_RX_LIVE)
+		list_move(&p->list, &priv->cm.passive_ids);
+	spin_unlock_irq(&priv->lock);
+
 	ret = ipoib_cm_send_rep(dev, cm_id, p->qp, &event->param.req_rcvd, psn);
 	if (ret) {
 		ipoib_warn(priv, "failed to send REP: %d\n", ret);
-		goto err_rep;
+		if (ib_modify_qp(p->qp, &ipoib_cm_err_attr, IB_QP_STATE))
+			ipoib_warn(priv, "unable to move qp to error state\n");
 	}
-
-	cm_id->context = p;
-	p->jiffies = jiffies;
-	p->state = IPOIB_CM_RX_LIVE;
-	spin_lock_irq(&priv->lock);
-	if (list_empty(&priv->cm.passive_ids))
-		queue_delayed_work(ipoib_workqueue,
-				   &priv->cm.stale_task, IPOIB_CM_RX_DELAY);
-	list_add(&p->list, &priv->cm.passive_ids);
-	spin_unlock_irq(&priv->lock);
 	return 0;
 
-err_rep:
 err_modify:
 	ib_destroy_qp(p->qp);
 err_qp:
@@ -754,9 +752,9 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
 
 	p->mtu = be32_to_cpu(data->mtu);
 
-	if (p->mtu < priv->dev->mtu + IPOIB_ENCAP_LEN) {
-		ipoib_warn(priv, "Rejecting connection: mtu %d < device mtu %d + 4\n",
-			   p->mtu, priv->dev->mtu);
+	if (p->mtu <= IPOIB_ENCAP_LEN) {
+		ipoib_warn(priv, "Rejecting connection: mtu %d <= %d\n",
+			   p->mtu, IPOIB_ENCAP_LEN);
 		return -EINVAL;
 	}
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-06-18 15:49 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-06-18 15:49 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a bunch of fixes to the new mlx4 driver.  This pull is
bigger than I would have liked after -rc5, but Mellanox discovered a
problem that required a firmware change and also some driver help to
fix.  Since this is a new driver for 2.6.22, which is for new hardware
that no one has in production yet, I think it's better to merge this
early even if it risks introducing a bug, rather than have a driver
in 2.6.22 that doesn't work at all with current adapter firmware.

Jack Morgenstein (1):
      IB/mlx4: Handle buffer wraparound in __mlx4_ib_cq_clean()

Roland Dreier (6):
      IB/mlx4: Fix handling of wq->tail for send completions
      IB/mlx4: Fix warning in rounding up queue sizes
      IB/mlx4: Handle new FW requirement for send request prefetching
      IB/mlx4: Get rid of max_inline_data calculation
      IB/mlx4: Handle FW command interface rev 3
      IB/mlx4: Make sure inline data segments don't cross a 64 byte boundary

 drivers/infiniband/hw/mlx4/cq.c      |   19 ++--
 drivers/infiniband/hw/mlx4/main.c    |   16 ++-
 drivers/infiniband/hw/mlx4/mlx4_ib.h |    5 +-
 drivers/infiniband/hw/mlx4/qp.c      |  196 ++++++++++++++++++++++------------
 drivers/infiniband/hw/mlx4/user.h    |    9 +-
 drivers/net/mlx4/fw.c                |  110 +++++++++++++-------
 drivers/net/mlx4/fw.h                |   10 +-
 drivers/net/mlx4/main.c              |   14 ++-
 include/linux/mlx4/cmd.h             |    1 +
 include/linux/mlx4/device.h          |   13 ++-
 include/linux/mlx4/qp.h              |    4 +
 11 files changed, 259 insertions(+), 138 deletions(-)


diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index b2a290c..660b27a 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -354,8 +354,8 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
 	if (is_send) {
 		wq = &(*cur_qp)->sq;
 		wqe_ctr = be16_to_cpu(cqe->wqe_index);
-		wq->tail += wqe_ctr - (u16) wq->tail;
-		wc->wr_id = wq->wrid[wq->tail & (wq->max - 1)];
+		wq->tail += (u16) (wqe_ctr - (u16) wq->tail);
+		wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
 		++wq->tail;
 	} else if ((*cur_qp)->ibqp.srq) {
 		srq = to_msrq((*cur_qp)->ibqp.srq);
@@ -364,7 +364,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
 		mlx4_ib_free_srq_wqe(srq, wqe_ctr);
 	} else {
 		wq	  = &(*cur_qp)->rq;
-		wc->wr_id = wq->wrid[wq->tail & (wq->max - 1)];
+		wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
 		++wq->tail;
 	}
 
@@ -478,7 +478,8 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq)
 {
 	u32 prod_index;
 	int nfreed = 0;
-	struct mlx4_cqe *cqe;
+	struct mlx4_cqe *cqe, *dest;
+	u8 owner_bit;
 
 	/*
 	 * First we need to find the current producer index, so we
@@ -501,9 +502,13 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq)
 			if (srq && !(cqe->owner_sr_opcode & MLX4_CQE_IS_SEND_MASK))
 				mlx4_ib_free_srq_wqe(srq, be16_to_cpu(cqe->wqe_index));
 			++nfreed;
-		} else if (nfreed)
-			memcpy(get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe),
-			       cqe, sizeof *cqe);
+		} else if (nfreed) {
+			dest = get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe);
+			owner_bit = dest->owner_sr_opcode & MLX4_CQE_OWNER_MASK;
+			memcpy(dest, cqe, sizeof *cqe);
+			dest->owner_sr_opcode = owner_bit |
+				(dest->owner_sr_opcode & ~MLX4_CQE_OWNER_MASK);
+		}
 	}
 
 	if (nfreed) {
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index 402f3a2..1095c82 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -125,7 +125,7 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
 	props->local_ca_ack_delay  = dev->dev->caps.local_ca_ack_delay;
 	props->atomic_cap	   = dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_ATOMIC ?
 		IB_ATOMIC_HCA : IB_ATOMIC_NONE;
-	props->max_pkeys	   = dev->dev->caps.pkey_table_len;
+	props->max_pkeys	   = dev->dev->caps.pkey_table_len[1];
 	props->max_mcast_grp	   = dev->dev->caps.num_mgms + dev->dev->caps.num_amgms;
 	props->max_mcast_qp_attach = dev->dev->caps.num_qp_per_mgm;
 	props->max_total_mcast_qp_attach = props->max_mcast_qp_attach *
@@ -168,9 +168,9 @@ static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
 	props->state		= out_mad->data[32] & 0xf;
 	props->phys_state	= out_mad->data[33] >> 4;
 	props->port_cap_flags	= be32_to_cpup((__be32 *) (out_mad->data + 20));
-	props->gid_tbl_len	= to_mdev(ibdev)->dev->caps.gid_table_len;
+	props->gid_tbl_len	= to_mdev(ibdev)->dev->caps.gid_table_len[port];
 	props->max_msg_sz	= 0x80000000;
-	props->pkey_tbl_len	= to_mdev(ibdev)->dev->caps.pkey_table_len;
+	props->pkey_tbl_len	= to_mdev(ibdev)->dev->caps.pkey_table_len[port];
 	props->bad_pkey_cntr	= be16_to_cpup((__be16 *) (out_mad->data + 46));
 	props->qkey_viol_cntr	= be16_to_cpup((__be16 *) (out_mad->data + 48));
 	props->active_width	= out_mad->data[31] & 0xf;
@@ -280,8 +280,14 @@ static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols,
 		return PTR_ERR(mailbox);
 
 	memset(mailbox->buf, 0, 256);
-	*(u8 *) mailbox->buf	     = !!reset_qkey_viols << 6;
-	((__be32 *) mailbox->buf)[2] = cpu_to_be32(cap_mask);
+
+	if (dev->dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
+		*(u8 *) mailbox->buf	     = !!reset_qkey_viols << 6;
+		((__be32 *) mailbox->buf)[2] = cpu_to_be32(cap_mask);
+	} else {
+		((u8 *) mailbox->buf)[3]     = !!reset_qkey_viols;
+		((__be32 *) mailbox->buf)[1] = cpu_to_be32(cap_mask);
+	}
 
 	err = mlx4_cmd(dev->dev, mailbox->dma, port, 0, MLX4_CMD_SET_PORT,
 		       MLX4_CMD_TIME_CLASS_B);
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h
index 93dac71..24ccadd 100644
--- a/drivers/infiniband/hw/mlx4/mlx4_ib.h
+++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h
@@ -95,7 +95,8 @@ struct mlx4_ib_mr {
 struct mlx4_ib_wq {
 	u64		       *wrid;
 	spinlock_t		lock;
-	int			max;
+	int			wqe_cnt;
+	int			max_post;
 	int			max_gs;
 	int			offset;
 	int			wqe_shift;
@@ -113,6 +114,7 @@ struct mlx4_ib_qp {
 
 	u32			doorbell_qpn;
 	__be32			sq_signal_bits;
+	int			sq_spare_wqes;
 	struct mlx4_ib_wq	sq;
 
 	struct ib_umem	       *umem;
@@ -123,6 +125,7 @@ struct mlx4_ib_qp {
 	u8			alt_port;
 	u8			atomic_rd_en;
 	u8			resp_depth;
+	u8			sq_no_prefetch;
 	u8			state;
 };
 
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 5c6d054..f8a1a08 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -109,6 +109,20 @@ static void *get_send_wqe(struct mlx4_ib_qp *qp, int n)
 	return get_wqe(qp, qp->sq.offset + (n << qp->sq.wqe_shift));
 }
 
+/*
+ * Stamp a SQ WQE so that it is invalid if prefetched by marking the
+ * first four bytes of every 64 byte chunk with 0xffffffff, except for
+ * the very first chunk of the WQE.
+ */
+static void stamp_send_wqe(struct mlx4_ib_qp *qp, int n)
+{
+	u32 *wqe = get_send_wqe(qp, n);
+	int i;
+
+	for (i = 16; i < 1 << (qp->sq.wqe_shift - 2); i += 16)
+		wqe[i] = 0xffffffff;
+}
+
 static void mlx4_ib_qp_event(struct mlx4_qp *qp, enum mlx4_event type)
 {
 	struct ib_event event;
@@ -178,6 +192,8 @@ static int send_wqe_overhead(enum ib_qp_type type)
 	case IB_QPT_GSI:
 		return sizeof (struct mlx4_wqe_ctrl_seg) +
 			ALIGN(MLX4_IB_UD_HEADER_SIZE +
+			      DIV_ROUND_UP(MLX4_IB_UD_HEADER_SIZE,
+					   MLX4_INLINE_ALIGN) *
 			      sizeof (struct mlx4_wqe_inline_seg),
 			      sizeof (struct mlx4_wqe_data_seg)) +
 			ALIGN(4 +
@@ -201,18 +217,18 @@ static int set_rq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 		if (cap->max_recv_wr)
 			return -EINVAL;
 
-		qp->rq.max = qp->rq.max_gs = 0;
+		qp->rq.wqe_cnt = qp->rq.max_gs = 0;
 	} else {
 		/* HW requires >= 1 RQ entry with >= 1 gather entry */
 		if (is_user && (!cap->max_recv_wr || !cap->max_recv_sge))
 			return -EINVAL;
 
-		qp->rq.max	 = roundup_pow_of_two(max(1, cap->max_recv_wr));
-		qp->rq.max_gs	 = roundup_pow_of_two(max(1, cap->max_recv_sge));
+		qp->rq.wqe_cnt	 = roundup_pow_of_two(max(1U, cap->max_recv_wr));
+		qp->rq.max_gs	 = roundup_pow_of_two(max(1U, cap->max_recv_sge));
 		qp->rq.wqe_shift = ilog2(qp->rq.max_gs * sizeof (struct mlx4_wqe_data_seg));
 	}
 
-	cap->max_recv_wr  = qp->rq.max;
+	cap->max_recv_wr  = qp->rq.max_post = qp->rq.wqe_cnt;
 	cap->max_recv_sge = qp->rq.max_gs;
 
 	return 0;
@@ -236,8 +252,6 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 	    cap->max_send_sge + 2 > dev->dev->caps.max_sq_sg)
 		return -EINVAL;
 
-	qp->sq.max = cap->max_send_wr ? roundup_pow_of_two(cap->max_send_wr) : 1;
-
 	qp->sq.wqe_shift = ilog2(roundup_pow_of_two(max(cap->max_send_sge *
 							sizeof (struct mlx4_wqe_data_seg),
 							cap->max_inline_data +
@@ -246,20 +260,27 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 	qp->sq.max_gs    = ((1 << qp->sq.wqe_shift) - send_wqe_overhead(type)) /
 		sizeof (struct mlx4_wqe_data_seg);
 
-	qp->buf_size = (qp->rq.max << qp->rq.wqe_shift) +
-		(qp->sq.max << qp->sq.wqe_shift);
+	/*
+	 * We need to leave 2 KB + 1 WQE of headroom in the SQ to
+	 * allow HW to prefetch.
+	 */
+	qp->sq_spare_wqes = (2048 >> qp->sq.wqe_shift) + 1;
+	qp->sq.wqe_cnt = roundup_pow_of_two(cap->max_send_wr + qp->sq_spare_wqes);
+
+	qp->buf_size = (qp->rq.wqe_cnt << qp->rq.wqe_shift) +
+		(qp->sq.wqe_cnt << qp->sq.wqe_shift);
 	if (qp->rq.wqe_shift > qp->sq.wqe_shift) {
 		qp->rq.offset = 0;
-		qp->sq.offset = qp->rq.max << qp->rq.wqe_shift;
+		qp->sq.offset = qp->rq.wqe_cnt << qp->rq.wqe_shift;
 	} else {
-		qp->rq.offset = qp->sq.max << qp->sq.wqe_shift;
+		qp->rq.offset = qp->sq.wqe_cnt << qp->sq.wqe_shift;
 		qp->sq.offset = 0;
 	}
 
-	cap->max_send_wr     = qp->sq.max;
-	cap->max_send_sge    = qp->sq.max_gs;
-	cap->max_inline_data = (1 << qp->sq.wqe_shift) - send_wqe_overhead(type) -
-		sizeof (struct mlx4_wqe_inline_seg);
+	cap->max_send_wr  = qp->sq.max_post = qp->sq.wqe_cnt - qp->sq_spare_wqes;
+	cap->max_send_sge = qp->sq.max_gs;
+	/* We don't support inline sends for kernel QPs (yet) */
+	cap->max_inline_data = 0;
 
 	return 0;
 }
@@ -267,11 +288,11 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
 static int set_user_sq_size(struct mlx4_ib_qp *qp,
 			    struct mlx4_ib_create_qp *ucmd)
 {
-	qp->sq.max       = 1 << ucmd->log_sq_bb_count;
+	qp->sq.wqe_cnt   = 1 << ucmd->log_sq_bb_count;
 	qp->sq.wqe_shift = ucmd->log_sq_stride;
 
-	qp->buf_size = (qp->rq.max << qp->rq.wqe_shift) +
-		(qp->sq.max << qp->sq.wqe_shift);
+	qp->buf_size = (qp->rq.wqe_cnt << qp->rq.wqe_shift) +
+		(qp->sq.wqe_cnt << qp->sq.wqe_shift);
 
 	return 0;
 }
@@ -307,6 +328,8 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 			goto err;
 		}
 
+		qp->sq_no_prefetch = ucmd.sq_no_prefetch;
+
 		err = set_user_sq_size(qp, &ucmd);
 		if (err)
 			goto err;
@@ -334,6 +357,8 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 				goto err_mtt;
 		}
 	} else {
+		qp->sq_no_prefetch = 0;
+
 		err = set_kernel_sq_size(dev, &init_attr->cap, init_attr->qp_type, qp);
 		if (err)
 			goto err;
@@ -360,16 +385,13 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 		if (err)
 			goto err_mtt;
 
-		qp->sq.wrid  = kmalloc(qp->sq.max * sizeof (u64), GFP_KERNEL);
-		qp->rq.wrid  = kmalloc(qp->rq.max * sizeof (u64), GFP_KERNEL);
+		qp->sq.wrid  = kmalloc(qp->sq.wqe_cnt * sizeof (u64), GFP_KERNEL);
+		qp->rq.wrid  = kmalloc(qp->rq.wqe_cnt * sizeof (u64), GFP_KERNEL);
 
 		if (!qp->sq.wrid || !qp->rq.wrid) {
 			err = -ENOMEM;
 			goto err_wrid;
 		}
-
-		/* We don't support inline sends for kernel QPs (yet) */
-		init_attr->cap.max_inline_data = 0;
 	}
 
 	err = mlx4_qp_alloc(dev->dev, sqpn, &qp->mqp);
@@ -583,24 +605,6 @@ int mlx4_ib_destroy_qp(struct ib_qp *qp)
 	return 0;
 }
 
-static void init_port(struct mlx4_ib_dev *dev, int port)
-{
-	struct mlx4_init_port_param param;
-	int err;
-
-	memset(&param, 0, sizeof param);
-
-	param.port_width_cap = dev->dev->caps.port_width_cap;
-	param.vl_cap	     = dev->dev->caps.vl_cap;
-	param.mtu	     = ib_mtu_enum_to_int(dev->dev->caps.mtu_cap);
-	param.max_gid	     = dev->dev->caps.gid_table_len;
-	param.max_pkey	     = dev->dev->caps.pkey_table_len;
-
-	err = mlx4_INIT_PORT(dev->dev, &param, port);
-	if (err)
-		printk(KERN_WARNING "INIT_PORT failed, return code %d.\n", err);
-}
-
 static int to_mlx4_st(enum ib_qp_type type)
 {
 	switch (type) {
@@ -674,9 +678,9 @@ static int mlx4_set_path(struct mlx4_ib_dev *dev, const struct ib_ah_attr *ah,
 	path->counter_index = 0xff;
 
 	if (ah->ah_flags & IB_AH_GRH) {
-		if (ah->grh.sgid_index >= dev->dev->caps.gid_table_len) {
+		if (ah->grh.sgid_index >= dev->dev->caps.gid_table_len[port]) {
 			printk(KERN_ERR "sgid_index (%u) too large. max is %d\n",
-			       ah->grh.sgid_index, dev->dev->caps.gid_table_len - 1);
+			       ah->grh.sgid_index, dev->dev->caps.gid_table_len[port] - 1);
 			return -1;
 		}
 
@@ -743,14 +747,17 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 		context->mtu_msgmax = (attr->path_mtu << 5) | 31;
 	}
 
-	if (qp->rq.max)
-		context->rq_size_stride = ilog2(qp->rq.max) << 3;
+	if (qp->rq.wqe_cnt)
+		context->rq_size_stride = ilog2(qp->rq.wqe_cnt) << 3;
 	context->rq_size_stride |= qp->rq.wqe_shift - 4;
 
-	if (qp->sq.max)
-		context->sq_size_stride = ilog2(qp->sq.max) << 3;
+	if (qp->sq.wqe_cnt)
+		context->sq_size_stride = ilog2(qp->sq.wqe_cnt) << 3;
 	context->sq_size_stride |= qp->sq.wqe_shift - 4;
 
+	if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
+		context->sq_size_stride |= !!qp->sq_no_prefetch << 7;
+
 	if (qp->ibqp.uobject)
 		context->usr_page = cpu_to_be32(to_mucontext(ibqp->uobject->context)->uar.index);
 	else
@@ -789,13 +796,14 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 	}
 
 	if (attr_mask & IB_QP_ALT_PATH) {
-		if (attr->alt_pkey_index >= dev->dev->caps.pkey_table_len)
-			return -EINVAL;
-
 		if (attr->alt_port_num == 0 ||
 		    attr->alt_port_num > dev->dev->caps.num_ports)
 			return -EINVAL;
 
+		if (attr->alt_pkey_index >=
+		    dev->dev->caps.pkey_table_len[attr->alt_port_num])
+			return -EINVAL;
+
 		if (mlx4_set_path(dev, &attr->alt_ah_attr, &context->alt_path,
 				  attr->alt_port_num))
 			return -EINVAL;
@@ -884,16 +892,19 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 
 	/*
 	 * Before passing a kernel QP to the HW, make sure that the
-	 * ownership bits of the send queue are set so that the
-	 * hardware doesn't start processing stale work requests.
+	 * ownership bits of the send queue are set and the SQ
+	 * headroom is stamped so that the hardware doesn't start
+	 * processing stale work requests.
 	 */
 	if (!ibqp->uobject && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
 		struct mlx4_wqe_ctrl_seg *ctrl;
 		int i;
 
-		for (i = 0; i < qp->sq.max; ++i) {
+		for (i = 0; i < qp->sq.wqe_cnt; ++i) {
 			ctrl = get_send_wqe(qp, i);
 			ctrl->owner_opcode = cpu_to_be32(1 << 31);
+
+			stamp_send_wqe(qp, i);
 		}
 	}
 
@@ -923,7 +934,9 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 	 */
 	if (is_qp0(dev, qp)) {
 		if (cur_state != IB_QPS_RTR && new_state == IB_QPS_RTR)
-			init_port(dev, qp->port);
+			if (mlx4_INIT_PORT(dev->dev, qp->port))
+				printk(KERN_WARNING "INIT_PORT failed for port %d\n",
+				       qp->port);
 
 		if (cur_state != IB_QPS_RESET && cur_state != IB_QPS_ERR &&
 		    (new_state == IB_QPS_RESET || new_state == IB_QPS_ERR))
@@ -986,16 +999,17 @@ int mlx4_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 	if (!ib_modify_qp_is_ok(cur_state, new_state, ibqp->qp_type, attr_mask))
 		goto out;
 
-	if ((attr_mask & IB_QP_PKEY_INDEX) &&
-	     attr->pkey_index >= dev->dev->caps.pkey_table_len) {
-		goto out;
-	}
-
 	if ((attr_mask & IB_QP_PORT) &&
 	    (attr->port_num == 0 || attr->port_num > dev->dev->caps.num_ports)) {
 		goto out;
 	}
 
+	if (attr_mask & IB_QP_PKEY_INDEX) {
+		int p = attr_mask & IB_QP_PORT ? attr->port_num : qp->port;
+		if (attr->pkey_index >= dev->dev->caps.pkey_table_len[p])
+			goto out;
+	}
+
 	if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC &&
 	    attr->max_rd_atomic > dev->dev->caps.max_qp_init_rdma) {
 		goto out;
@@ -1037,6 +1051,7 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
 	u16 pkey;
 	int send_size;
 	int header_size;
+	int spc;
 	int i;
 
 	send_size = 0;
@@ -1112,10 +1127,43 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
 		printk("\n");
 	}
 
-	inl->byte_count = cpu_to_be32(1 << 31 | header_size);
-	memcpy(inl + 1, sqp->header_buf, header_size);
+	/*
+	 * Inline data segments may not cross a 64 byte boundary.  If
+	 * our UD header is bigger than the space available up to the
+	 * next 64 byte boundary in the WQE, use two inline data
+	 * segments to hold the UD header.
+	 */
+	spc = MLX4_INLINE_ALIGN -
+		((unsigned long) (inl + 1) & (MLX4_INLINE_ALIGN - 1));
+	if (header_size <= spc) {
+		inl->byte_count = cpu_to_be32(1 << 31 | header_size);
+		memcpy(inl + 1, sqp->header_buf, header_size);
+		i = 1;
+	} else {
+		inl->byte_count = cpu_to_be32(1 << 31 | spc);
+		memcpy(inl + 1, sqp->header_buf, spc);
 
-	return ALIGN(sizeof (struct mlx4_wqe_inline_seg) + header_size, 16);
+		inl = (void *) (inl + 1) + spc;
+		memcpy(inl + 1, sqp->header_buf + spc, header_size - spc);
+		/*
+		 * Need a barrier here to make sure all the data is
+		 * visible before the byte_count field is set.
+		 * Otherwise the HCA prefetcher could grab the 64-byte
+		 * chunk with this inline segment and get a valid (!=
+		 * 0xffffffff) byte count but stale data, and end up
+		 * processing generating a packet with bad headers.
+		 *
+		 * The first inline segment's byte_count field doesn't
+		 * need a barrier, because it comes after a
+		 * control/MLX segment and therefore is at an offset
+		 * of 16 mod 64.
+		 */
+		wmb();
+		inl->byte_count = cpu_to_be32(1 << 31 | (header_size - spc));
+		i = 2;
+	}
+
+	return ALIGN(i * sizeof (struct mlx4_wqe_inline_seg) + header_size, 16);
 }
 
 static int mlx4_wq_overflow(struct mlx4_ib_wq *wq, int nreq, struct ib_cq *ib_cq)
@@ -1124,7 +1172,7 @@ static int mlx4_wq_overflow(struct mlx4_ib_wq *wq, int nreq, struct ib_cq *ib_cq
 	struct mlx4_ib_cq *cq;
 
 	cur = wq->head - wq->tail;
-	if (likely(cur + nreq < wq->max))
+	if (likely(cur + nreq < wq->max_post))
 		return 0;
 
 	cq = to_mcq(ib_cq);
@@ -1132,7 +1180,7 @@ static int mlx4_wq_overflow(struct mlx4_ib_wq *wq, int nreq, struct ib_cq *ib_cq
 	cur = wq->head - wq->tail;
 	spin_unlock(&cq->lock);
 
-	return cur + nreq >= wq->max;
+	return cur + nreq >= wq->max_post;
 }
 
 int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
@@ -1165,8 +1213,8 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 			goto out;
 		}
 
-		ctrl = wqe = get_send_wqe(qp, ind & (qp->sq.max - 1));
-		qp->sq.wrid[ind & (qp->sq.max - 1)] = wr->wr_id;
+		ctrl = wqe = get_send_wqe(qp, ind & (qp->sq.wqe_cnt - 1));
+		qp->sq.wrid[ind & (qp->sq.wqe_cnt - 1)] = wr->wr_id;
 
 		ctrl->srcrb_flags =
 			(wr->send_flags & IB_SEND_SIGNALED ?
@@ -1301,7 +1349,16 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 		}
 
 		ctrl->owner_opcode = mlx4_ib_opcode[wr->opcode] |
-			(ind & qp->sq.max ? cpu_to_be32(1 << 31) : 0);
+			(ind & qp->sq.wqe_cnt ? cpu_to_be32(1 << 31) : 0);
+
+		/*
+		 * We can improve latency by not stamping the last
+		 * send queue WQE until after ringing the doorbell, so
+		 * only stamp here if there are still more WQEs to post.
+		 */
+		if (wr->next)
+			stamp_send_wqe(qp, (ind + qp->sq_spare_wqes) &
+				       (qp->sq.wqe_cnt - 1));
 
 		++ind;
 	}
@@ -1324,6 +1381,9 @@ out:
 		 * and reach the HCA out of order.
 		 */
 		mmiowb();
+
+		stamp_send_wqe(qp, (ind + qp->sq_spare_wqes - 1) &
+			       (qp->sq.wqe_cnt - 1));
 	}
 
 	spin_unlock_irqrestore(&qp->rq.lock, flags);
@@ -1344,7 +1404,7 @@ int mlx4_ib_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 
 	spin_lock_irqsave(&qp->rq.lock, flags);
 
-	ind = qp->rq.head & (qp->rq.max - 1);
+	ind = qp->rq.head & (qp->rq.wqe_cnt - 1);
 
 	for (nreq = 0; wr; ++nreq, wr = wr->next) {
 		if (mlx4_wq_overflow(&qp->rq, nreq, qp->ibqp.send_cq)) {
@@ -1375,7 +1435,7 @@ int mlx4_ib_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 
 		qp->rq.wrid[ind] = wr->wr_id;
 
-		ind = (ind + 1) & (qp->rq.max - 1);
+		ind = (ind + 1) & (qp->rq.wqe_cnt - 1);
 	}
 
 out:
diff --git a/drivers/infiniband/hw/mlx4/user.h b/drivers/infiniband/hw/mlx4/user.h
index 88c72d5..e2d11be 100644
--- a/drivers/infiniband/hw/mlx4/user.h
+++ b/drivers/infiniband/hw/mlx4/user.h
@@ -39,7 +39,7 @@
  * Increment this value if any changes that break userspace ABI
  * compatibility are made.
  */
-#define MLX4_IB_UVERBS_ABI_VERSION	2
+#define MLX4_IB_UVERBS_ABI_VERSION	3
 
 /*
  * Make sure that all structs defined in this file remain laid out so
@@ -87,9 +87,10 @@ struct mlx4_ib_create_srq_resp {
 struct mlx4_ib_create_qp {
 	__u64	buf_addr;
 	__u64	db_addr;
-        __u8	log_sq_bb_count;
-        __u8	log_sq_stride;
-        __u8	reserved[6];
+	__u8	log_sq_bb_count;
+	__u8	log_sq_stride;
+	__u8	sq_no_prefetch;
+	__u8	reserved[5];
 };
 
 #endif /* MLX4_IB_USER_H */
diff --git a/drivers/net/mlx4/fw.c b/drivers/net/mlx4/fw.c
index e7ca118..d2b0653 100644
--- a/drivers/net/mlx4/fw.c
+++ b/drivers/net/mlx4/fw.c
@@ -38,7 +38,9 @@
 #include "icm.h"
 
 enum {
-	MLX4_COMMAND_INTERFACE_REV	= 1
+	MLX4_COMMAND_INTERFACE_MIN_REV		= 2,
+	MLX4_COMMAND_INTERFACE_MAX_REV		= 3,
+	MLX4_COMMAND_INTERFACE_NEW_PORT_CMDS	= 3,
 };
 
 extern void __buggy_use_of_MLX4_GET(void);
@@ -107,6 +109,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 	u16 size;
 	u16 stat_rate;
 	int err;
+	int i;
 
 #define QUERY_DEV_CAP_OUT_SIZE		       0x100
 #define QUERY_DEV_CAP_MAX_SRQ_SZ_OFFSET		0x10
@@ -176,7 +179,6 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 
 	err = mlx4_cmd_box(dev, 0, mailbox->dma, 0, 0, MLX4_CMD_QUERY_DEV_CAP,
 			   MLX4_CMD_TIME_CLASS_A);
-
 	if (err)
 		goto out;
 
@@ -216,18 +218,10 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 	dev_cap->max_rdma_global = 1 << (field & 0x3f);
 	MLX4_GET(field, outbox, QUERY_DEV_CAP_ACK_DELAY_OFFSET);
 	dev_cap->local_ca_ack_delay = field & 0x1f;
-	MLX4_GET(field, outbox, QUERY_DEV_CAP_MTU_WIDTH_OFFSET);
-	dev_cap->max_mtu	= field >> 4;
-	dev_cap->max_port_width = field & 0xf;
 	MLX4_GET(field, outbox, QUERY_DEV_CAP_VL_PORT_OFFSET);
-	dev_cap->max_vl    = field >> 4;
 	dev_cap->num_ports = field & 0xf;
-	MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_GID_OFFSET);
-	dev_cap->max_gids = 1 << (field & 0xf);
 	MLX4_GET(stat_rate, outbox, QUERY_DEV_CAP_RATE_SUPPORT_OFFSET);
 	dev_cap->stat_rate_support = stat_rate;
-	MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_PKEY_OFFSET);
-	dev_cap->max_pkeys = 1 << (field & 0xf);
 	MLX4_GET(dev_cap->flags, outbox, QUERY_DEV_CAP_FLAGS_OFFSET);
 	MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_UAR_OFFSET);
 	dev_cap->reserved_uars = field >> 4;
@@ -304,6 +298,42 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 	MLX4_GET(dev_cap->max_icm_sz, outbox,
 		 QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET);
 
+	if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
+		for (i = 1; i <= dev_cap->num_ports; ++i) {
+			MLX4_GET(field, outbox, QUERY_DEV_CAP_VL_PORT_OFFSET);
+			dev_cap->max_vl[i]	   = field >> 4;
+			MLX4_GET(field, outbox, QUERY_DEV_CAP_MTU_WIDTH_OFFSET);
+			dev_cap->max_mtu[i]	   = field >> 4;
+			dev_cap->max_port_width[i] = field & 0xf;
+			MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_GID_OFFSET);
+			dev_cap->max_gids[i]	   = 1 << (field & 0xf);
+			MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_PKEY_OFFSET);
+			dev_cap->max_pkeys[i]	   = 1 << (field & 0xf);
+		}
+	} else {
+#define QUERY_PORT_MTU_OFFSET			0x01
+#define QUERY_PORT_WIDTH_OFFSET			0x06
+#define QUERY_PORT_MAX_GID_PKEY_OFFSET		0x07
+#define QUERY_PORT_MAX_VL_OFFSET		0x0b
+
+		for (i = 1; i <= dev_cap->num_ports; ++i) {
+			err = mlx4_cmd_box(dev, 0, mailbox->dma, i, 0, MLX4_CMD_QUERY_PORT,
+					   MLX4_CMD_TIME_CLASS_B);
+			if (err)
+				goto out;
+
+			MLX4_GET(field, outbox, QUERY_PORT_MTU_OFFSET);
+			dev_cap->max_mtu[i]	   = field & 0xf;
+			MLX4_GET(field, outbox, QUERY_PORT_WIDTH_OFFSET);
+			dev_cap->max_port_width[i] = field & 0xf;
+			MLX4_GET(field, outbox, QUERY_PORT_MAX_GID_PKEY_OFFSET);
+			dev_cap->max_gids[i]	   = 1 << (field >> 4);
+			dev_cap->max_pkeys[i]	   = 1 << (field & 0xf);
+			MLX4_GET(field, outbox, QUERY_PORT_MAX_VL_OFFSET);
+			dev_cap->max_vl[i]	   = field & 0xf;
+		}
+	}
+
 	if (dev_cap->bmme_flags & 1)
 		mlx4_dbg(dev, "Base MM extensions: yes "
 			 "(flags %d, rsvd L_Key %08x)\n",
@@ -338,8 +368,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 	mlx4_dbg(dev, "Max CQEs: %d, max WQEs: %d, max SRQ WQEs: %d\n",
 		 dev_cap->max_cq_sz, dev_cap->max_qp_sz, dev_cap->max_srq_sz);
 	mlx4_dbg(dev, "Local CA ACK delay: %d, max MTU: %d, port width cap: %d\n",
-		 dev_cap->local_ca_ack_delay, 128 << dev_cap->max_mtu,
-		 dev_cap->max_port_width);
+		 dev_cap->local_ca_ack_delay, 128 << dev_cap->max_mtu[1],
+		 dev_cap->max_port_width[1]);
 	mlx4_dbg(dev, "Max SQ desc size: %d, max SQ S/G: %d\n",
 		 dev_cap->max_sq_desc_sz, dev_cap->max_sq_sg);
 	mlx4_dbg(dev, "Max RQ desc size: %d, max RQ S/G: %d\n",
@@ -491,7 +521,8 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
 		((fw_ver & 0x0000ffffull) << 16);
 
 	MLX4_GET(cmd_if_rev, outbox, QUERY_FW_CMD_IF_REV_OFFSET);
-	if (cmd_if_rev != MLX4_COMMAND_INTERFACE_REV) {
+	if (cmd_if_rev < MLX4_COMMAND_INTERFACE_MIN_REV ||
+	    cmd_if_rev > MLX4_COMMAND_INTERFACE_MAX_REV) {
 		mlx4_err(dev, "Installed FW has unsupported "
 			 "command interface revision %d.\n",
 			 cmd_if_rev);
@@ -499,12 +530,15 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
 			 (int) (dev->caps.fw_ver >> 32),
 			 (int) (dev->caps.fw_ver >> 16) & 0xffff,
 			 (int) dev->caps.fw_ver & 0xffff);
-		mlx4_err(dev, "This driver version supports only revision %d.\n",
-			 MLX4_COMMAND_INTERFACE_REV);
+		mlx4_err(dev, "This driver version supports only revisions %d to %d.\n",
+			 MLX4_COMMAND_INTERFACE_MIN_REV, MLX4_COMMAND_INTERFACE_MAX_REV);
 		err = -ENODEV;
 		goto out;
 	}
 
+	if (cmd_if_rev < MLX4_COMMAND_INTERFACE_NEW_PORT_CMDS)
+		dev->flags |= MLX4_FLAG_OLD_PORT_CMDS;
+
 	MLX4_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
 	cmd->max_cmds = 1 << lg;
 
@@ -708,13 +742,15 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
 	return err;
 }
 
-int mlx4_INIT_PORT(struct mlx4_dev *dev, struct mlx4_init_port_param *param, int port)
+int mlx4_INIT_PORT(struct mlx4_dev *dev, int port)
 {
 	struct mlx4_cmd_mailbox *mailbox;
 	u32 *inbox;
 	int err;
 	u32 flags;
+	u16 field;
 
+	if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
 #define INIT_PORT_IN_SIZE          256
 #define INIT_PORT_FLAGS_OFFSET     0x00
 #define INIT_PORT_FLAG_SIG         (1 << 18)
@@ -729,32 +765,32 @@ int mlx4_INIT_PORT(struct mlx4_dev *dev, struct mlx4_init_port_param *param, int
 #define INIT_PORT_NODE_GUID_OFFSET 0x18
 #define INIT_PORT_SI_GUID_OFFSET   0x20
 
-	mailbox = mlx4_alloc_cmd_mailbox(dev);
-	if (IS_ERR(mailbox))
-		return PTR_ERR(mailbox);
-	inbox = mailbox->buf;
+		mailbox = mlx4_alloc_cmd_mailbox(dev);
+		if (IS_ERR(mailbox))
+			return PTR_ERR(mailbox);
+		inbox = mailbox->buf;
 
-	memset(inbox, 0, INIT_PORT_IN_SIZE);
+		memset(inbox, 0, INIT_PORT_IN_SIZE);
 
-	flags = 0;
-	flags |= param->set_guid0     ? INIT_PORT_FLAG_G0  : 0;
-	flags |= param->set_node_guid ? INIT_PORT_FLAG_NG  : 0;
-	flags |= param->set_si_guid   ? INIT_PORT_FLAG_SIG : 0;
-	flags |= (param->vl_cap & 0xf) << INIT_PORT_VL_SHIFT;
-	flags |= (param->port_width_cap & 0xf) << INIT_PORT_PORT_WIDTH_SHIFT;
-	MLX4_PUT(inbox, flags,            INIT_PORT_FLAGS_OFFSET);
+		flags = 0;
+		flags |= (dev->caps.vl_cap[port] & 0xf) << INIT_PORT_VL_SHIFT;
+		flags |= (dev->caps.port_width_cap[port] & 0xf) << INIT_PORT_PORT_WIDTH_SHIFT;
+		MLX4_PUT(inbox, flags,		  INIT_PORT_FLAGS_OFFSET);
 
-	MLX4_PUT(inbox, param->mtu,       INIT_PORT_MTU_OFFSET);
-	MLX4_PUT(inbox, param->max_gid,   INIT_PORT_MAX_GID_OFFSET);
-	MLX4_PUT(inbox, param->max_pkey,  INIT_PORT_MAX_PKEY_OFFSET);
-	MLX4_PUT(inbox, param->guid0,     INIT_PORT_GUID0_OFFSET);
-	MLX4_PUT(inbox, param->node_guid, INIT_PORT_NODE_GUID_OFFSET);
-	MLX4_PUT(inbox, param->si_guid,   INIT_PORT_SI_GUID_OFFSET);
+		field = 128 << dev->caps.mtu_cap[port];
+		MLX4_PUT(inbox, field, INIT_PORT_MTU_OFFSET);
+		field = dev->caps.gid_table_len[port];
+		MLX4_PUT(inbox, field, INIT_PORT_MAX_GID_OFFSET);
+		field = dev->caps.pkey_table_len[port];
+		MLX4_PUT(inbox, field, INIT_PORT_MAX_PKEY_OFFSET);
 
-	err = mlx4_cmd(dev, mailbox->dma, port, 0, MLX4_CMD_INIT_PORT,
-		       MLX4_CMD_TIME_CLASS_A);
+		err = mlx4_cmd(dev, mailbox->dma, port, 0, MLX4_CMD_INIT_PORT,
+			       MLX4_CMD_TIME_CLASS_A);
 
-	mlx4_free_cmd_mailbox(dev, mailbox);
+		mlx4_free_cmd_mailbox(dev, mailbox);
+	} else
+		err = mlx4_cmd(dev, 0, port, 0, MLX4_CMD_INIT_PORT,
+			       MLX4_CMD_TIME_CLASS_A);
 
 	return err;
 }
diff --git a/drivers/net/mlx4/fw.h b/drivers/net/mlx4/fw.h
index 2616fa5..296254a 100644
--- a/drivers/net/mlx4/fw.h
+++ b/drivers/net/mlx4/fw.h
@@ -59,13 +59,13 @@ struct mlx4_dev_cap {
 	int max_responder_per_qp;
 	int max_rdma_global;
 	int local_ca_ack_delay;
-	int max_mtu;
-	int max_port_width;
-	int max_vl;
 	int num_ports;
-	int max_gids;
+	int max_mtu[MLX4_MAX_PORTS + 1];
+	int max_port_width[MLX4_MAX_PORTS + 1];
+	int max_vl[MLX4_MAX_PORTS + 1];
+	int max_gids[MLX4_MAX_PORTS + 1];
+	int max_pkeys[MLX4_MAX_PORTS + 1];
 	u16 stat_rate_support;
-	int max_pkeys;
 	u32 flags;
 	int reserved_uars;
 	int uar_size;
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index d417293..41eafeb 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -88,6 +88,7 @@ static struct mlx4_profile default_profile = {
 static int __devinit mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 {
 	int err;
+	int i;
 
 	err = mlx4_QUERY_DEV_CAP(dev, dev_cap);
 	if (err) {
@@ -117,11 +118,15 @@ static int __devinit mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev
 	}
 
 	dev->caps.num_ports	     = dev_cap->num_ports;
+	for (i = 1; i <= dev->caps.num_ports; ++i) {
+		dev->caps.vl_cap[i]	    = dev_cap->max_vl[i];
+		dev->caps.mtu_cap[i]	    = dev_cap->max_mtu[i];
+		dev->caps.gid_table_len[i]  = dev_cap->max_gids[i];
+		dev->caps.pkey_table_len[i] = dev_cap->max_pkeys[i];
+		dev->caps.port_width_cap[i] = dev_cap->max_port_width[i];
+	}
+
 	dev->caps.num_uars	     = dev_cap->uar_size / PAGE_SIZE;
-	dev->caps.vl_cap	     = dev_cap->max_vl;
-	dev->caps.mtu_cap	     = dev_cap->max_mtu;
-	dev->caps.gid_table_len	     = dev_cap->max_gids;
-	dev->caps.pkey_table_len     = dev_cap->max_pkeys;
 	dev->caps.local_ca_ack_delay = dev_cap->local_ca_ack_delay;
 	dev->caps.bf_reg_size	     = dev_cap->bf_reg_size;
 	dev->caps.bf_regs_per_page   = dev_cap->bf_regs_per_page;
@@ -148,7 +153,6 @@ static int __devinit mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev
 	dev->caps.reserved_mrws	     = dev_cap->reserved_mrws;
 	dev->caps.reserved_uars	     = dev_cap->reserved_uars;
 	dev->caps.reserved_pds	     = dev_cap->reserved_pds;
-	dev->caps.port_width_cap     = dev_cap->max_port_width;
 	dev->caps.mtt_entry_sz	     = MLX4_MTT_ENTRY_PER_SEG * dev_cap->mtt_entry_sz;
 	dev->caps.page_size_cap	     = ~(u32) (dev_cap->min_page_sz - 1);
 	dev->caps.flags		     = dev_cap->flags;
diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h
index 4fb552d..7d1eaa9 100644
--- a/include/linux/mlx4/cmd.h
+++ b/include/linux/mlx4/cmd.h
@@ -54,6 +54,7 @@ enum {
 	MLX4_CMD_INIT_PORT	 = 0x9,
 	MLX4_CMD_CLOSE_PORT	 = 0xa,
 	MLX4_CMD_QUERY_HCA	 = 0xb,
+	MLX4_CMD_QUERY_PORT	 = 0x43,
 	MLX4_CMD_SET_PORT	 = 0xc,
 	MLX4_CMD_ACCESS_DDR	 = 0x2e,
 	MLX4_CMD_MAP_ICM	 = 0xffa,
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 8c5f8fd..b372f59 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -41,6 +41,7 @@
 
 enum {
 	MLX4_FLAG_MSI_X		= 1 << 0,
+	MLX4_FLAG_OLD_PORT_CMDS	= 1 << 1,
 };
 
 enum {
@@ -131,10 +132,10 @@ enum {
 struct mlx4_caps {
 	u64			fw_ver;
 	int			num_ports;
-	int			vl_cap;
-	int			mtu_cap;
-	int			gid_table_len;
-	int			pkey_table_len;
+	int			vl_cap[MLX4_MAX_PORTS + 1];
+	int			mtu_cap[MLX4_MAX_PORTS + 1];
+	int			gid_table_len[MLX4_MAX_PORTS + 1];
+	int			pkey_table_len[MLX4_MAX_PORTS + 1];
 	int			local_ca_ack_delay;
 	int			num_uars;
 	int			bf_reg_size;
@@ -174,7 +175,7 @@ struct mlx4_caps {
 	u32			page_size_cap;
 	u32			flags;
 	u16			stat_rate_support;
-	u8			port_width_cap;
+	u8			port_width_cap[MLX4_MAX_PORTS + 1];
 };
 
 struct mlx4_buf_list {
@@ -322,7 +323,7 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt,
 void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq);
 int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark);
 
-int mlx4_INIT_PORT(struct mlx4_dev *dev, struct mlx4_init_port_param *param, int port);
+int mlx4_INIT_PORT(struct mlx4_dev *dev, int port);
 int mlx4_CLOSE_PORT(struct mlx4_dev *dev, int port);
 
 int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]);
diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h
index 9eeb61a..10c57d2 100644
--- a/include/linux/mlx4/qp.h
+++ b/include/linux/mlx4/qp.h
@@ -269,6 +269,10 @@ struct mlx4_wqe_data_seg {
 	__be64			addr;
 };
 
+enum {
+	MLX4_INLINE_ALIGN	= 64,
+};
+
 struct mlx4_wqe_inline_seg {
 	__be32			byte_count;
 };

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

* [GIT PULL] please pull infiniband.git
@ 2007-06-08 14:22 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-06-08 14:22 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a bunch of fixes to the new mlx4 driver, and one fix for
port assignment by the RDMA CM:

Eli Cohen (1):
      mlx4_core: Fix CQ context layout

Jack Morgenstein (2):
      mlx4_core: Don't set MTT address in dMPT entries with PA set
      IB/mlx4: Fix zeroing of rnr_retry value in ib_modify_qp()

Roland Dreier (5):
      mlx4_core: Initialize ctx_list and ctx_lock earlier
      mlx4_core: Free catastrophic error MSI-X interrupt with correct dev_id
      IB/mthca, mlx4_core: Fix typo in comment
      mlx4_core: Check firmware command interface revision
      IB/mlx4: Make sure RQ allocation is always valid

Sean Hefty (1):
      RDMA/cma: Fix initialization of next_port

 drivers/infiniband/core/cma.c           |    4 +-
 drivers/infiniband/hw/mlx4/qp.c         |   33 ++++++++++++++++++++----------
 drivers/infiniband/hw/mthca/mthca_cmd.c |    2 +-
 drivers/net/mlx4/cq.c                   |    2 +-
 drivers/net/mlx4/eq.c                   |    4 ++-
 drivers/net/mlx4/fw.c                   |   27 ++++++++++++++++++++++--
 drivers/net/mlx4/intf.c                 |    3 --
 drivers/net/mlx4/main.c                 |    2 +
 drivers/net/mlx4/mr.c                   |    8 ++++--
 9 files changed, 60 insertions(+), 25 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 2eb52b7..32a0e66 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -2773,8 +2773,8 @@ static int cma_init(void)
 	int ret;
 
 	get_random_bytes(&next_port, sizeof next_port);
-	next_port = (next_port % (sysctl_local_port_range[1] -
-				  sysctl_local_port_range[0])) +
+	next_port = ((unsigned int) next_port %
+		    (sysctl_local_port_range[1] - sysctl_local_port_range[0])) +
 		    sysctl_local_port_range[0];
 	cma_wq = create_singlethread_workqueue("rdma_cm");
 	if (!cma_wq)
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index dc137de..5c6d054 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -189,18 +189,28 @@ static int send_wqe_overhead(enum ib_qp_type type)
 }
 
 static int set_rq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
-		       struct mlx4_ib_qp *qp)
+		       int is_user, int has_srq, struct mlx4_ib_qp *qp)
 {
 	/* Sanity check RQ size before proceeding */
 	if (cap->max_recv_wr  > dev->dev->caps.max_wqes  ||
 	    cap->max_recv_sge > dev->dev->caps.max_rq_sg)
 		return -EINVAL;
 
-	qp->rq.max = cap->max_recv_wr ? roundup_pow_of_two(cap->max_recv_wr) : 0;
+	if (has_srq) {
+		/* QPs attached to an SRQ should have no RQ */
+		if (cap->max_recv_wr)
+			return -EINVAL;
+
+		qp->rq.max = qp->rq.max_gs = 0;
+	} else {
+		/* HW requires >= 1 RQ entry with >= 1 gather entry */
+		if (is_user && (!cap->max_recv_wr || !cap->max_recv_sge))
+			return -EINVAL;
 
-	qp->rq.wqe_shift = ilog2(roundup_pow_of_two(cap->max_recv_sge *
-						    sizeof (struct mlx4_wqe_data_seg)));
-	qp->rq.max_gs    = (1 << qp->rq.wqe_shift) / sizeof (struct mlx4_wqe_data_seg);
+		qp->rq.max	 = roundup_pow_of_two(max(1, cap->max_recv_wr));
+		qp->rq.max_gs	 = roundup_pow_of_two(max(1, cap->max_recv_sge));
+		qp->rq.wqe_shift = ilog2(qp->rq.max_gs * sizeof (struct mlx4_wqe_data_seg));
+	}
 
 	cap->max_recv_wr  = qp->rq.max;
 	cap->max_recv_sge = qp->rq.max_gs;
@@ -285,7 +295,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 	qp->sq.head	    = 0;
 	qp->sq.tail	    = 0;
 
-	err = set_rq_size(dev, &init_attr->cap, qp);
+	err = set_rq_size(dev, &init_attr->cap, !!pd->uobject, !!init_attr->srq, qp);
 	if (err)
 		goto err;
 
@@ -762,11 +772,6 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 		optpar |= MLX4_QP_OPTPAR_PKEY_INDEX;
 	}
 
-	if (attr_mask & IB_QP_RNR_RETRY) {
-		context->params1 |= cpu_to_be32(attr->rnr_retry << 13);
-		optpar |= MLX4_QP_OPTPAR_RNR_RETRY;
-	}
-
 	if (attr_mask & IB_QP_AV) {
 		if (mlx4_set_path(dev, &attr->ah_attr, &context->pri_path,
 				  attr_mask & IB_QP_PORT ? attr->port_num : qp->port)) {
@@ -802,6 +807,12 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 
 	context->pd	    = cpu_to_be32(to_mpd(ibqp->pd)->pdn);
 	context->params1    = cpu_to_be32(MLX4_IB_ACK_REQ_FREQ << 28);
+
+	if (attr_mask & IB_QP_RNR_RETRY) {
+		context->params1 |= cpu_to_be32(attr->rnr_retry << 13);
+		optpar |= MLX4_QP_OPTPAR_RNR_RETRY;
+	}
+
 	if (attr_mask & IB_QP_RETRY_CNT) {
 		context->params1 |= cpu_to_be32(attr->retry_cnt << 16);
 		optpar |= MLX4_QP_OPTPAR_RETRY_COUNT;
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c
index 3810252..f40558d 100644
--- a/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -772,7 +772,7 @@ int mthca_QUERY_FW(struct mthca_dev *dev, u8 *status)
 
 	MTHCA_GET(dev->fw_ver,   outbox, QUERY_FW_VER_OFFSET);
 	/*
-	 * FW subminor version is at more signifant bits than minor
+	 * FW subminor version is at more significant bits than minor
 	 * version, so swap here.
 	 */
 	dev->fw_ver = (dev->fw_ver & 0xffff00000000ull) |
diff --git a/drivers/net/mlx4/cq.c b/drivers/net/mlx4/cq.c
index 437d78a..39253d0 100644
--- a/drivers/net/mlx4/cq.c
+++ b/drivers/net/mlx4/cq.c
@@ -61,7 +61,7 @@ struct mlx4_cq_context {
 	__be32			solicit_producer_index;
 	__be32			consumer_index;
 	__be32			producer_index;
-	u8			reserved6[2];
+	u32			reserved6[2];
 	__be64			db_rec_addr;
 };
 
diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c
index 0f11adb..27a82ce 100644
--- a/drivers/net/mlx4/eq.c
+++ b/drivers/net/mlx4/eq.c
@@ -490,9 +490,11 @@ static void mlx4_free_irqs(struct mlx4_dev *dev)
 
 	if (eq_table->have_irq)
 		free_irq(dev->pdev->irq, dev);
-	for (i = 0; i < MLX4_NUM_EQ; ++i)
+	for (i = 0; i < MLX4_EQ_CATAS; ++i)
 		if (eq_table->eq[i].have_irq)
 			free_irq(eq_table->eq[i].irq, eq_table->eq + i);
+	if (eq_table->eq[MLX4_EQ_CATAS].have_irq)
+		free_irq(eq_table->eq[MLX4_EQ_CATAS].irq, dev);
 }
 
 static int __devinit mlx4_map_clr_int(struct mlx4_dev *dev)
diff --git a/drivers/net/mlx4/fw.c b/drivers/net/mlx4/fw.c
index cfa5cc0..e7ca118 100644
--- a/drivers/net/mlx4/fw.c
+++ b/drivers/net/mlx4/fw.c
@@ -37,6 +37,10 @@
 #include "fw.h"
 #include "icm.h"
 
+enum {
+	MLX4_COMMAND_INTERFACE_REV	= 1
+};
+
 extern void __buggy_use_of_MLX4_GET(void);
 extern void __buggy_use_of_MLX4_PUT(void);
 
@@ -452,10 +456,12 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
 	u32 *outbox;
 	int err = 0;
 	u64 fw_ver;
+	u16 cmd_if_rev;
 	u8 lg;
 
 #define QUERY_FW_OUT_SIZE             0x100
 #define QUERY_FW_VER_OFFSET            0x00
+#define QUERY_FW_CMD_IF_REV_OFFSET     0x0a
 #define QUERY_FW_MAX_CMD_OFFSET        0x0f
 #define QUERY_FW_ERR_START_OFFSET      0x30
 #define QUERY_FW_ERR_SIZE_OFFSET       0x38
@@ -477,21 +483,36 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
 
 	MLX4_GET(fw_ver, outbox, QUERY_FW_VER_OFFSET);
 	/*
-	 * FW subminor version is at more signifant bits than minor
+	 * FW subminor version is at more significant bits than minor
 	 * version, so swap here.
 	 */
 	dev->caps.fw_ver = (fw_ver & 0xffff00000000ull) |
 		((fw_ver & 0xffff0000ull) >> 16) |
 		((fw_ver & 0x0000ffffull) << 16);
 
+	MLX4_GET(cmd_if_rev, outbox, QUERY_FW_CMD_IF_REV_OFFSET);
+	if (cmd_if_rev != MLX4_COMMAND_INTERFACE_REV) {
+		mlx4_err(dev, "Installed FW has unsupported "
+			 "command interface revision %d.\n",
+			 cmd_if_rev);
+		mlx4_err(dev, "(Installed FW version is %d.%d.%03d)\n",
+			 (int) (dev->caps.fw_ver >> 32),
+			 (int) (dev->caps.fw_ver >> 16) & 0xffff,
+			 (int) dev->caps.fw_ver & 0xffff);
+		mlx4_err(dev, "This driver version supports only revision %d.\n",
+			 MLX4_COMMAND_INTERFACE_REV);
+		err = -ENODEV;
+		goto out;
+	}
+
 	MLX4_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
 	cmd->max_cmds = 1 << lg;
 
-	mlx4_dbg(dev, "FW version %d.%d.%03d, max commands %d\n",
+	mlx4_dbg(dev, "FW version %d.%d.%03d (cmd intf rev %d), max commands %d\n",
 		 (int) (dev->caps.fw_ver >> 32),
 		 (int) (dev->caps.fw_ver >> 16) & 0xffff,
 		 (int) dev->caps.fw_ver & 0xffff,
-		 cmd->max_cmds);
+		 cmd_if_rev, cmd->max_cmds);
 
 	MLX4_GET(fw->catas_offset, outbox, QUERY_FW_ERR_START_OFFSET);
 	MLX4_GET(fw->catas_size,   outbox, QUERY_FW_ERR_SIZE_OFFSET);
diff --git a/drivers/net/mlx4/intf.c b/drivers/net/mlx4/intf.c
index 65854f9..9ae951b 100644
--- a/drivers/net/mlx4/intf.c
+++ b/drivers/net/mlx4/intf.c
@@ -135,9 +135,6 @@ int mlx4_register_device(struct mlx4_dev *dev)
 	struct mlx4_priv *priv = mlx4_priv(dev);
 	struct mlx4_interface *intf;
 
-	INIT_LIST_HEAD(&priv->ctx_list);
-	spin_lock_init(&priv->ctx_lock);
-
 	mutex_lock(&intf_mutex);
 
 	list_add_tail(&priv->dev_list, &dev_list);
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index 20b8c0d..d417293 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -787,6 +787,8 @@ static int __devinit mlx4_init_one(struct pci_dev *pdev,
 
 	dev       = &priv->dev;
 	dev->pdev = pdev;
+	INIT_LIST_HEAD(&priv->ctx_list);
+	spin_lock_init(&priv->ctx_lock);
 
 	/*
 	 * Now reset the HCA before we touch the PCI capabilities or
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index b33864d..d0808fa 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -324,15 +324,17 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr)
 				       MLX4_MPT_FLAG_MIO	 |
 				       MLX4_MPT_FLAG_REGION	 |
 				       mr->access);
-	if (mr->mtt.order < 0)
-		mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_PHYSICAL);
 
 	mpt_entry->key	       = cpu_to_be32(key_to_hw_index(mr->key));
 	mpt_entry->pd	       = cpu_to_be32(mr->pd);
 	mpt_entry->start       = cpu_to_be64(mr->iova);
 	mpt_entry->length      = cpu_to_be64(mr->size);
 	mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift);
-	mpt_entry->mtt_seg     = cpu_to_be64(mlx4_mtt_addr(dev, &mr->mtt));
+	if (mr->mtt.order < 0) {
+		mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_PHYSICAL);
+		mpt_entry->mtt_seg = 0;
+	} else
+		mpt_entry->mtt_seg = cpu_to_be64(mlx4_mtt_addr(dev, &mr->mtt));
 
 	err = mlx4_SW2HW_MPT(dev, mailbox,
 			     key_to_hw_index(mr->key) & (dev->caps.num_mpts - 1));

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

* [GIT PULL] please pull infiniband.git
@ 2007-05-29 23:20 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-05-29 23:20 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few more nicely balanced ("55 insertions(+), 55
deletions(-)") 2.6.22-rc3 fixes, mostly for IPoIB connected mode:

Michael S. Tsirkin (2):
      IB/mthca: Fix handling of send CQE with error for QPs connected to SRQ
      IPoIB/cm: Fix performance regression on Mellanox

Roland Dreier (1):
      IB/mlx4: Fix last allocated object tracking in bitmap allocator

Sean Hefty (1):
      IB/cm: Fix stale connection detection

 drivers/infiniband/core/cm.c            |   25 ++++++-----
 drivers/infiniband/hw/mthca/mthca_qp.c  |    6 +-
 drivers/infiniband/ulp/ipoib/ipoib.h    |    3 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |   74 +++++++++++++++----------------
 drivers/net/mlx4/alloc.c                |    2 +-
 5 files changed, 55 insertions(+), 55 deletions(-)


diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index e840434..40c004a 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -1297,26 +1297,29 @@ static struct cm_id_private * cm_match_req(struct cm_work *work,
 
 	req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
 
-	/* Check for duplicate REQ and stale connections. */
+	/* Check for possible duplicate REQ. */
 	spin_lock_irqsave(&cm.lock, flags);
 	timewait_info = cm_insert_remote_id(cm_id_priv->timewait_info);
-	if (!timewait_info)
-		timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
-
 	if (timewait_info) {
 		cur_cm_id_priv = cm_get_id(timewait_info->work.local_id,
 					   timewait_info->work.remote_id);
-		cm_cleanup_timewait(cm_id_priv->timewait_info);
 		spin_unlock_irqrestore(&cm.lock, flags);
 		if (cur_cm_id_priv) {
 			cm_dup_req_handler(work, cur_cm_id_priv);
 			cm_deref_id(cur_cm_id_priv);
-		} else
-			cm_issue_rej(work->port, work->mad_recv_wc,
-				     IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ,
-				     NULL, 0);
-		listen_cm_id_priv = NULL;
-		goto out;
+		}
+		return NULL;
+	}
+
+	/* Check for stale connections. */
+	timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
+	if (timewait_info) {
+		cm_cleanup_timewait(cm_id_priv->timewait_info);
+		spin_unlock_irqrestore(&cm.lock, flags);
+		cm_issue_rej(work->port, work->mad_recv_wc,
+			     IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ,
+			     NULL, 0);
+		return NULL;
 	}
 
 	/* Find matching listen request. */
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index 0276649..eef415b 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -2284,10 +2284,10 @@ void mthca_free_err_wqe(struct mthca_dev *dev, struct mthca_qp *qp, int is_send,
 	struct mthca_next_seg *next;
 
 	/*
-	 * For SRQs, all WQEs generate a CQE, so we're always at the
-	 * end of the doorbell chain.
+	 * For SRQs, all receive WQEs generate a CQE, so we're always
+	 * at the end of the doorbell chain.
 	 */
-	if (qp->ibqp.srq) {
+	if (qp->ibqp.srq && !is_send) {
 		*new_wqe = 0;
 		return;
 	}
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 158759e..285c143 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -156,7 +156,7 @@ struct ipoib_cm_data {
  * - and then invoke a Destroy QP or Reset QP.
  *
  * We use the second option and wait for a completion on the
- * rx_drain_qp before destroying QPs attached to our SRQ.
+ * same CQ before destroying QPs attached to our SRQ.
  */
 
 enum ipoib_cm_state {
@@ -199,7 +199,6 @@ struct ipoib_cm_dev_priv {
 	struct ib_srq  	       *srq;
 	struct ipoib_cm_rx_buf *srq_ring;
 	struct ib_cm_id        *id;
-	struct ib_qp           *rx_drain_qp;   /* generates WR described in 10.3.1 */
 	struct list_head        passive_ids;   /* state: LIVE */
 	struct list_head        rx_error_list; /* state: ERROR */
 	struct list_head        rx_flush_list; /* state: FLUSH, drain not started */
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index f133b56..076a0bb 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -69,8 +69,9 @@ static struct ib_qp_attr ipoib_cm_err_attr = {
 
 #define IPOIB_CM_RX_DRAIN_WRID 0x7fffffff
 
-static struct ib_recv_wr ipoib_cm_rx_drain_wr = {
-	.wr_id = IPOIB_CM_RX_DRAIN_WRID
+static struct ib_send_wr ipoib_cm_rx_drain_wr = {
+	.wr_id = IPOIB_CM_RX_DRAIN_WRID,
+	.opcode = IB_WR_SEND,
 };
 
 static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
@@ -163,16 +164,22 @@ partial_error:
 
 static void ipoib_cm_start_rx_drain(struct ipoib_dev_priv* priv)
 {
-	struct ib_recv_wr *bad_wr;
+	struct ib_send_wr *bad_wr;
+	struct ipoib_cm_rx *p;
 
-	/* rx_drain_qp send queue depth is 1, so
+	/* We only reserved 1 extra slot in CQ for drain WRs, so
 	 * make sure we have at most 1 outstanding WR. */
 	if (list_empty(&priv->cm.rx_flush_list) ||
 	    !list_empty(&priv->cm.rx_drain_list))
 		return;
 
-	if (ib_post_recv(priv->cm.rx_drain_qp, &ipoib_cm_rx_drain_wr, &bad_wr))
-		ipoib_warn(priv, "failed to post rx_drain wr\n");
+	/*
+	 * QPs on flush list are error state.  This way, a "flush
+	 * error" WC will be immediately generated for each WR we post.
+	 */
+	p = list_entry(priv->cm.rx_flush_list.next, typeof(*p), list);
+	if (ib_post_send(p->qp, &ipoib_cm_rx_drain_wr, &bad_wr))
+		ipoib_warn(priv, "failed to post drain wr\n");
 
 	list_splice_init(&priv->cm.rx_flush_list, &priv->cm.rx_drain_list);
 }
@@ -199,10 +206,10 @@ static struct ib_qp *ipoib_cm_create_rx_qp(struct net_device *dev,
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct ib_qp_init_attr attr = {
 		.event_handler = ipoib_cm_rx_event_handler,
-		.send_cq = priv->cq, /* does not matter, we never send anything */
+		.send_cq = priv->cq, /* For drain WR */
 		.recv_cq = priv->cq,
 		.srq = priv->cm.srq,
-		.cap.max_send_wr = 1, /* FIXME: 0 Seems not to work */
+		.cap.max_send_wr = 1, /* For drain WR */
 		.cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */
 		.sq_sig_type = IB_SIGNAL_ALL_WR,
 		.qp_type = IB_QPT_RC,
@@ -242,6 +249,27 @@ static int ipoib_cm_modify_rx_qp(struct net_device *dev,
 		ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret);
 		return ret;
 	}
+
+	/*
+	 * Current Mellanox HCA firmware won't generate completions
+	 * with error for drain WRs unless the QP has been moved to
+	 * RTS first. This work-around leaves a window where a QP has
+	 * moved to error asynchronously, but this will eventually get
+	 * fixed in firmware, so let's not error out if modify QP
+	 * fails.
+	 */
+	qp_attr.qp_state = IB_QPS_RTS;
+	ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);
+	if (ret) {
+		ipoib_warn(priv, "failed to init QP attr for RTS: %d\n", ret);
+		return 0;
+	}
+	ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);
+	if (ret) {
+		ipoib_warn(priv, "failed to modify QP to RTS: %d\n", ret);
+		return 0;
+	}
+
 	return 0;
 }
 
@@ -623,38 +651,11 @@ static void ipoib_cm_tx_completion(struct ib_cq *cq, void *tx_ptr)
 int ipoib_cm_dev_open(struct net_device *dev)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
-	struct ib_qp_init_attr qp_init_attr = {
-		.send_cq = priv->cq,   /* does not matter, we never send anything */
-		.recv_cq = priv->cq,
-		.cap.max_send_wr = 1,  /* FIXME: 0 Seems not to work */
-		.cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */
-		.cap.max_recv_wr = 1,
-		.cap.max_recv_sge = 1, /* FIXME: 0 Seems not to work */
-		.sq_sig_type = IB_SIGNAL_ALL_WR,
-		.qp_type = IB_QPT_UC,
-	};
 	int ret;
 
 	if (!IPOIB_CM_SUPPORTED(dev->dev_addr))
 		return 0;
 
-	priv->cm.rx_drain_qp = ib_create_qp(priv->pd, &qp_init_attr);
-	if (IS_ERR(priv->cm.rx_drain_qp)) {
-		printk(KERN_WARNING "%s: failed to create CM ID\n", priv->ca->name);
-		ret = PTR_ERR(priv->cm.rx_drain_qp);
-		return ret;
-	}
-
-	/*
-	 * We put the QP in error state directly.  This way, a "flush
-	 * error" WC will be immediately generated for each WR we post.
-	 */
-	ret = ib_modify_qp(priv->cm.rx_drain_qp, &ipoib_cm_err_attr, IB_QP_STATE);
-	if (ret) {
-		ipoib_warn(priv, "failed to modify drain QP to error: %d\n", ret);
-		goto err_qp;
-	}
-
 	priv->cm.id = ib_create_cm_id(priv->ca, ipoib_cm_rx_handler, dev);
 	if (IS_ERR(priv->cm.id)) {
 		printk(KERN_WARNING "%s: failed to create CM ID\n", priv->ca->name);
@@ -676,8 +677,6 @@ err_listen:
 	ib_destroy_cm_id(priv->cm.id);
 err_cm:
 	priv->cm.id = NULL;
-err_qp:
-	ib_destroy_qp(priv->cm.rx_drain_qp);
 	return ret;
 }
 
@@ -740,7 +739,6 @@ void ipoib_cm_dev_stop(struct net_device *dev)
 		kfree(p);
 	}
 
-	ib_destroy_qp(priv->cm.rx_drain_qp);
 	cancel_delayed_work(&priv->cm.stale_task);
 }
 
diff --git a/drivers/net/mlx4/alloc.c b/drivers/net/mlx4/alloc.c
index dfbd580..f8d63d3 100644
--- a/drivers/net/mlx4/alloc.c
+++ b/drivers/net/mlx4/alloc.c
@@ -51,8 +51,8 @@ u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap)
 
 	if (obj < bitmap->max) {
 		set_bit(obj, bitmap->table);
+		bitmap->last = (obj + 1) & (bitmap->max - 1);
 		obj |= bitmap->top;
-		bitmap->last = obj + 1;
 	} else
 		obj = -1;
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-05-25 22:06 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-05-25 22:06 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few more 2.6.22-rc2 fixes:

Eli Cohen (1):
      IB/mlx4: Initialize send queue entry ownership bits

Michael S. Tsirkin (2):
      IPoIB/cm: Fix timeout check in ipoib_cm_dev_stop()
      IPoIB/cm: Drain cq in ipoib_cm_dev_stop()

Roland Dreier (1):
      IB/mlx4: Don't allocate RQ doorbell if using SRQ

Stefan Roscher (1):
      IB/ehca: Fix number of send WRs reported for new QP

 drivers/infiniband/hw/ehca/hcp_if.c     |    2 +-
 drivers/infiniband/hw/mlx4/qp.c         |   59 +++++++++++++++++++-----------
 drivers/infiniband/ulp/ipoib/ipoib.h    |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |    3 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c |   31 ++++++++++------
 5 files changed, 60 insertions(+), 36 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c
index 7f0beec..5766ae3 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.c
+++ b/drivers/infiniband/hw/ehca/hcp_if.c
@@ -331,7 +331,7 @@ u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle,
 				0);
 	qp->ipz_qp_handle.handle = outs[0];
 	qp->real_qp_num = (u32)outs[1];
-	parms->act_nr_send_sges =
+	parms->act_nr_send_wqes =
 		(u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, outs[2]);
 	parms->act_nr_recv_wqes =
 		(u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, outs[2]);
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index a824bc5..dc137de 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -270,9 +270,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 			    struct ib_qp_init_attr *init_attr,
 			    struct ib_udata *udata, int sqpn, struct mlx4_ib_qp *qp)
 {
-	struct mlx4_wqe_ctrl_seg *ctrl;
 	int err;
-	int i;
 
 	mutex_init(&qp->mutex);
 	spin_lock_init(&qp->sq.lock);
@@ -319,20 +317,24 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 		if (err)
 			goto err_mtt;
 
-		err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context),
-					  ucmd.db_addr, &qp->db);
-		if (err)
-			goto err_mtt;
+		if (!init_attr->srq) {
+			err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context),
+						  ucmd.db_addr, &qp->db);
+			if (err)
+				goto err_mtt;
+		}
 	} else {
 		err = set_kernel_sq_size(dev, &init_attr->cap, init_attr->qp_type, qp);
 		if (err)
 			goto err;
 
-		err = mlx4_ib_db_alloc(dev, &qp->db, 0);
-		if (err)
-			goto err;
+		if (!init_attr->srq) {
+			err = mlx4_ib_db_alloc(dev, &qp->db, 0);
+			if (err)
+				goto err;
 
-		*qp->db.db = 0;
+			*qp->db.db = 0;
+		}
 
 		if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) {
 			err = -ENOMEM;
@@ -348,11 +350,6 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 		if (err)
 			goto err_mtt;
 
-		for (i = 0; i < qp->sq.max; ++i) {
-			ctrl = get_send_wqe(qp, i);
-			ctrl->owner_opcode = cpu_to_be32(1 << 31);
-		}
-
 		qp->sq.wrid  = kmalloc(qp->sq.max * sizeof (u64), GFP_KERNEL);
 		qp->rq.wrid  = kmalloc(qp->rq.max * sizeof (u64), GFP_KERNEL);
 
@@ -386,7 +383,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 	return 0;
 
 err_wrid:
-	if (pd->uobject)
+	if (pd->uobject && !init_attr->srq)
 		mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), &qp->db);
 	else {
 		kfree(qp->sq.wrid);
@@ -403,7 +400,7 @@ err_buf:
 		mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf);
 
 err_db:
-	if (!pd->uobject)
+	if (!pd->uobject && !init_attr->srq)
 		mlx4_ib_db_free(dev, &qp->db);
 
 err:
@@ -481,14 +478,16 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
 	mlx4_mtt_cleanup(dev->dev, &qp->mtt);
 
 	if (is_user) {
-		mlx4_ib_db_unmap_user(to_mucontext(qp->ibqp.uobject->context),
-				      &qp->db);
+		if (!qp->ibqp.srq)
+			mlx4_ib_db_unmap_user(to_mucontext(qp->ibqp.uobject->context),
+					      &qp->db);
 		ib_umem_release(qp->umem);
 	} else {
 		kfree(qp->sq.wrid);
 		kfree(qp->rq.wrid);
 		mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf);
-		mlx4_ib_db_free(dev, &qp->db);
+		if (!qp->ibqp.srq)
+			mlx4_ib_db_free(dev, &qp->db);
 	}
 }
 
@@ -852,7 +851,7 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 	if (ibqp->srq)
 		context->srqn = cpu_to_be32(1 << 24 | to_msrq(ibqp->srq)->msrq.srqn);
 
-	if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
+	if (!ibqp->srq && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
 		context->db_rec_addr = cpu_to_be64(qp->db.dma);
 
 	if (cur_state == IB_QPS_INIT &&
@@ -872,6 +871,21 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 	else
 		sqd_event = 0;
 
+	/*
+	 * Before passing a kernel QP to the HW, make sure that the
+	 * ownership bits of the send queue are set so that the
+	 * hardware doesn't start processing stale work requests.
+	 */
+	if (!ibqp->uobject && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
+		struct mlx4_wqe_ctrl_seg *ctrl;
+		int i;
+
+		for (i = 0; i < qp->sq.max; ++i) {
+			ctrl = get_send_wqe(qp, i);
+			ctrl->owner_opcode = cpu_to_be32(1 << 31);
+		}
+	}
+
 	err = mlx4_qp_modify(dev->dev, &qp->mtt, to_mlx4_state(cur_state),
 			     to_mlx4_state(new_state), context, optpar,
 			     sqd_event, &qp->mqp);
@@ -919,7 +933,8 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
 		qp->rq.tail = 0;
 		qp->sq.head = 0;
 		qp->sq.tail = 0;
-		*qp->db.db  = 0;
+		if (!ibqp->srq)
+			*qp->db.db  = 0;
 	}
 
 out:
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index a0b3782..158759e 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -429,6 +429,7 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey);
 
 void ipoib_pkey_poll(struct work_struct *work);
 int ipoib_pkey_dev_delay_open(struct net_device *dev);
+void ipoib_drain_cq(struct net_device *dev);
 
 #ifdef CONFIG_INFINIBAND_IPOIB_CM
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index ffec794..f133b56 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -713,7 +713,7 @@ void ipoib_cm_dev_stop(struct net_device *dev)
 	while (!list_empty(&priv->cm.rx_error_list) ||
 	       !list_empty(&priv->cm.rx_flush_list) ||
 	       !list_empty(&priv->cm.rx_drain_list)) {
-		if (!time_after(jiffies, begin + 5 * HZ)) {
+		if (time_after(jiffies, begin + 5 * HZ)) {
 			ipoib_warn(priv, "RX drain timing out\n");
 
 			/*
@@ -726,6 +726,7 @@ void ipoib_cm_dev_stop(struct net_device *dev)
 		}
 		spin_unlock_irq(&priv->lock);
 		msleep(1);
+		ipoib_drain_cq(dev);
 		spin_lock_irq(&priv->lock);
 	}
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index c1aad06..8404f05 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -550,13 +550,30 @@ static int recvs_pending(struct net_device *dev)
 	return pending;
 }
 
+void ipoib_drain_cq(struct net_device *dev)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+	int i, n;
+	do {
+		n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc);
+		for (i = 0; i < n; ++i) {
+			if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ)
+				ipoib_cm_handle_rx_wc(dev, priv->ibwc + i);
+			else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV)
+				ipoib_ib_handle_rx_wc(dev, priv->ibwc + i);
+			else
+				ipoib_ib_handle_tx_wc(dev, priv->ibwc + i);
+		}
+	} while (n == IPOIB_NUM_WC);
+}
+
 int ipoib_ib_dev_stop(struct net_device *dev, int flush)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct ib_qp_attr qp_attr;
 	unsigned long begin;
 	struct ipoib_tx_buf *tx_req;
-	int i, n;
+	int i;
 
 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 	netif_poll_disable(dev);
@@ -611,17 +628,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush)
 			goto timeout;
 		}
 
-		do {
-			n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc);
-			for (i = 0; i < n; ++i) {
-				if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ)
-					ipoib_cm_handle_rx_wc(dev, priv->ibwc + i);
-				else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV)
-					ipoib_ib_handle_rx_wc(dev, priv->ibwc + i);
-				else
-					ipoib_ib_handle_tx_wc(dev, priv->ibwc + i);
-			}
-		} while (n == IPOIB_NUM_WC);
+		ipoib_drain_cq(dev);
 
 		msleep(1);
 	}

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

* [GIT PULL] please pull infiniband.git
@ 2007-05-21 20:51 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-05-21 20:51 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the following post 2.6.22-rc2 fixes.  (This batch is
bigger than I would like, but I think it's all legitimately post-rc2
material: we've had some fixes for fairly serious problems cooking for
a while, and those fixes involve largish patches.  The rest is either
trivial stuff or fixes for the just-merged mlx4 driver)

Ali Ayoub (1):
      IB/mthca: Fix use-after-free on device restart

Eli Cohen (3):
      IB/core: Free umem when mm is already gone
      IB/mlx4: Fix check of max_qp_dest_rdma in modify QP
      IB/mlx4: Pass send queue sizes from userspace to kernel

Hoang-Nam Nguyen (1):
      IB/ehca: Return proper error code if register_mr fails

Michael S. Tsirkin (5):
      IB/mthca: Fix RESET to ERROR transition
      IB/mlx4: Fix RESET to RESET and RESET to ERROR transitions
      IB/ipoib: Fix typos in error messages
      IPoIB/cm: Fix SRQ WR leak
      IB/cm: Improve local id allocation

Roland Dreier (6):
      IB/ipath: Fix potential deadlock with multicast spinlocks
      IB/core: Use start_port() and end_port()
      IB/mlx4: Set GRH:HopLimit when sending globally routed MADs
      mlx4_core: Fix array overrun in dump_dev_cap_flags()
      IB/mlx4: Fix check of opcode in mlx4_ib_post_send()
      IB/mlx4: Check if SRQ is full when posting receive

Rolf Manderscheid (1):
      IB/mthca: Set GRH:HopLimit when building MLX headers

Yosef Etigin (2):
      IB/core: Add helpers for uncached GID and P_Key searches
      IPoIB: Handle P_Key table reordering

 drivers/infiniband/core/cm.c                    |    4 +-
 drivers/infiniband/core/device.c                |  135 ++++++++++++++-
 drivers/infiniband/core/umem.c                  |    4 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c          |    7 +-
 drivers/infiniband/hw/ipath/ipath_verbs_mcast.c |   16 +-
 drivers/infiniband/hw/mlx4/qp.c                 |  181 ++++++++++++++------
 drivers/infiniband/hw/mlx4/srq.c                |    6 +
 drivers/infiniband/hw/mlx4/user.h               |    5 +-
 drivers/infiniband/hw/mthca/mthca_av.c          |    1 +
 drivers/infiniband/hw/mthca/mthca_main.c        |    4 +-
 drivers/infiniband/hw/mthca/mthca_qp.c          |  158 +++++++++++-------
 drivers/infiniband/ulp/ipoib/ipoib.h            |   49 +++++-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c         |  203 +++++++++++++++++++----
 drivers/infiniband/ulp/ipoib/ipoib_ib.c         |   87 ++++++++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c       |    7 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c  |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c      |   40 ++---
 drivers/net/mlx4/fw.c                           |    2 +-
 include/rdma/ib_verbs.h                         |    8 +
 19 files changed, 697 insertions(+), 222 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-05-14 21:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-05-14 21:18 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get the following post 2.6.22-rc1 fixes:

Arthur Jones (1):
      IB/ipath: Shadow the gpio_mask register

Hoang-Nam Nguyen (1):
      IB/ehca: Fix AQP0/1 QP number

Jack Morgenstein (1):
      IB/mlx4: Fix uninitialized spinlock for 32-bit archs

Joachim Fenkes (4):
      IB/ehca: Correctly set GRH mask bit in ehca_modify_qp()
      IB/ehca: Remove _irqsave, move #ifdef
      IB/ehca: Beautify sysfs attribute code and fix compiler warnings
      IB/ehca: Disable scaling code by default, bump version number

Michael S. Tsirkin (3):
      IB/mthca: Fix posting >255 recv WRs for Tavor
      IB/mthca: Set cleaned CQEs back to HW ownership when cleaning CQ
      IPoIB/cm: Optimize stale connection detection

Paul Mundt (1):
      net: Trivial MLX4_DEBUG dependency fix.

Roland Dreier (1):
      mlx4_core: Remove unused doorbell_lock

Sean Hefty (3):
      RDMA/cma: Simplify device removal handling code
      RDMA/cma: Fix synchronization with device removal in cma_iw_handler
      RDMA/cma: Add check to validate that cm_id is bound to a device

Stefan Roscher (1):
      IB/ehca: Serialize hypervisor calls in ehca_register_mr()

 drivers/infiniband/core/cma.c               |  106 +++++++++++++++------------
 drivers/infiniband/hw/ehca/ehca_classes.h   |    1 +
 drivers/infiniband/hw/ehca/ehca_irq.c       |    7 +-
 drivers/infiniband/hw/ehca/ehca_main.c      |   94 +++++++++++-------------
 drivers/infiniband/hw/ehca/ehca_qp.c        |   17 +++--
 drivers/infiniband/hw/ehca/hcp_if.c         |   13 +++-
 drivers/infiniband/hw/ipath/ipath_iba6120.c |    7 +-
 drivers/infiniband/hw/ipath/ipath_intr.c    |    7 +-
 drivers/infiniband/hw/ipath/ipath_kernel.h  |    2 +
 drivers/infiniband/hw/ipath/ipath_verbs.c   |   12 ++--
 drivers/infiniband/hw/mlx4/main.c           |    1 +
 drivers/infiniband/hw/mthca/mthca_cq.c      |    4 +-
 drivers/infiniband/hw/mthca/mthca_qp.c      |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c     |   11 ++-
 drivers/net/Kconfig                         |    1 +
 drivers/net/mlx4/main.c                     |    2 -
 drivers/net/mlx4/mlx4.h                     |    1 -
 17 files changed, 154 insertions(+), 133 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-05-09  1:06 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-05-09  1:06 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will merge the mlx4 drivers for new Mellanox adapters:

Roland Dreier (3):
      IB/uverbs: Export ib_umem_get()/ib_umem_release() to modules
      IB: Put rlimit accounting struct in struct ib_umem
      IB/mlx4: Add a driver Mellanox ConnectX InfiniBand adapters

 drivers/infiniband/Kconfig                       |    7 +
 drivers/infiniband/Makefile                      |    1 +
 drivers/infiniband/core/Makefile                 |    4 +-
 drivers/infiniband/core/device.c                 |    2 +
 drivers/infiniband/core/{uverbs_mem.c => umem.c} |  153 ++-
 drivers/infiniband/core/uverbs.h                 |    6 +-
 drivers/infiniband/core/uverbs_cmd.c             |   60 +-
 drivers/infiniband/core/uverbs_main.c            |   11 +-
 drivers/infiniband/hw/amso1100/c2_provider.c     |   42 +-
 drivers/infiniband/hw/amso1100/c2_provider.h     |    1 +
 drivers/infiniband/hw/cxgb3/iwch_provider.c      |   28 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.h      |    1 +
 drivers/infiniband/hw/ehca/ehca_classes.h        |    1 +
 drivers/infiniband/hw/ehca/ehca_iverbs.h         |    3 +-
 drivers/infiniband/hw/ehca/ehca_mrmw.c           |   69 +-
 drivers/infiniband/hw/ipath/ipath_mr.c           |   38 +-
 drivers/infiniband/hw/ipath/ipath_verbs.h        |    5 +-
 drivers/infiniband/hw/mlx4/Kconfig               |    9 +
 drivers/infiniband/hw/mlx4/Makefile              |    3 +
 drivers/infiniband/hw/mlx4/ah.c                  |  100 ++
 drivers/infiniband/hw/mlx4/cq.c                  |  525 +++++++++
 drivers/infiniband/hw/mlx4/doorbell.c            |  216 ++++
 drivers/infiniband/hw/mlx4/mad.c                 |  339 ++++++
 drivers/infiniband/hw/mlx4/main.c                |  651 +++++++++++
 drivers/infiniband/hw/mlx4/mlx4_ib.h             |  285 +++++
 drivers/infiniband/hw/mlx4/mr.c                  |  184 +++
 drivers/infiniband/hw/mlx4/qp.c                  | 1294 ++++++++++++++++++++++
 drivers/infiniband/hw/mlx4/srq.c                 |  334 ++++++
 drivers/infiniband/hw/mlx4/user.h                |   92 ++
 drivers/infiniband/hw/mthca/mthca_provider.c     |   38 +-
 drivers/infiniband/hw/mthca/mthca_provider.h     |    1 +
 drivers/net/Kconfig                              |   14 +
 drivers/net/Makefile                             |    1 +
 drivers/net/mlx4/Makefile                        |    4 +
 drivers/net/mlx4/alloc.c                         |  179 +++
 drivers/net/mlx4/catas.c                         |   70 ++
 drivers/net/mlx4/cmd.c                           |  429 +++++++
 drivers/net/mlx4/cq.c                            |  254 +++++
 drivers/net/mlx4/eq.c                            |  696 ++++++++++++
 drivers/net/mlx4/fw.c                            |  775 +++++++++++++
 drivers/net/mlx4/fw.h                            |  167 +++
 drivers/net/mlx4/icm.c                           |  379 +++++++
 drivers/net/mlx4/icm.h                           |  135 +++
 drivers/net/mlx4/intf.c                          |  165 +++
 drivers/net/mlx4/main.c                          |  936 ++++++++++++++++
 drivers/net/mlx4/mcg.c                           |  380 +++++++
 drivers/net/mlx4/mlx4.h                          |  348 ++++++
 drivers/net/mlx4/mr.c                            |  479 ++++++++
 drivers/net/mlx4/pd.c                            |  102 ++
 drivers/net/mlx4/profile.c                       |  238 ++++
 drivers/net/mlx4/qp.c                            |  280 +++++
 drivers/net/mlx4/reset.c                         |  181 +++
 drivers/net/mlx4/srq.c                           |  227 ++++
 include/linux/mlx4/cmd.h                         |  178 +++
 include/linux/mlx4/cq.h                          |  123 ++
 include/linux/mlx4/device.h                      |  331 ++++++
 include/linux/mlx4/doorbell.h                    |   97 ++
 include/linux/mlx4/driver.h                      |   59 +
 include/linux/mlx4/qp.h                          |  288 +++++
 include/linux/mlx4/srq.h                         |   42 +
 include/rdma/ib_umem.h                           |   81 ++
 include/rdma/ib_verbs.h                          |   28 +-
 62 files changed, 11951 insertions(+), 218 deletions(-)
 rename drivers/infiniband/core/{uverbs_mem.c => umem.c} (59%)
 create mode 100644 drivers/infiniband/hw/mlx4/Kconfig
 create mode 100644 drivers/infiniband/hw/mlx4/Makefile
 create mode 100644 drivers/infiniband/hw/mlx4/ah.c
 create mode 100644 drivers/infiniband/hw/mlx4/cq.c
 create mode 100644 drivers/infiniband/hw/mlx4/doorbell.c
 create mode 100644 drivers/infiniband/hw/mlx4/mad.c
 create mode 100644 drivers/infiniband/hw/mlx4/main.c
 create mode 100644 drivers/infiniband/hw/mlx4/mlx4_ib.h
 create mode 100644 drivers/infiniband/hw/mlx4/mr.c
 create mode 100644 drivers/infiniband/hw/mlx4/qp.c
 create mode 100644 drivers/infiniband/hw/mlx4/srq.c
 create mode 100644 drivers/infiniband/hw/mlx4/user.h
 create mode 100644 drivers/net/mlx4/Makefile
 create mode 100644 drivers/net/mlx4/alloc.c
 create mode 100644 drivers/net/mlx4/catas.c
 create mode 100644 drivers/net/mlx4/cmd.c
 create mode 100644 drivers/net/mlx4/cq.c
 create mode 100644 drivers/net/mlx4/eq.c
 create mode 100644 drivers/net/mlx4/fw.c
 create mode 100644 drivers/net/mlx4/fw.h
 create mode 100644 drivers/net/mlx4/icm.c
 create mode 100644 drivers/net/mlx4/icm.h
 create mode 100644 drivers/net/mlx4/intf.c
 create mode 100644 drivers/net/mlx4/main.c
 create mode 100644 drivers/net/mlx4/mcg.c
 create mode 100644 drivers/net/mlx4/mlx4.h
 create mode 100644 drivers/net/mlx4/mr.c
 create mode 100644 drivers/net/mlx4/pd.c
 create mode 100644 drivers/net/mlx4/profile.c
 create mode 100644 drivers/net/mlx4/qp.c
 create mode 100644 drivers/net/mlx4/reset.c
 create mode 100644 drivers/net/mlx4/srq.c
 create mode 100644 include/linux/mlx4/cmd.h
 create mode 100644 include/linux/mlx4/cq.h
 create mode 100644 include/linux/mlx4/device.h
 create mode 100644 include/linux/mlx4/doorbell.h
 create mode 100644 include/linux/mlx4/driver.h
 create mode 100644 include/linux/mlx4/qp.h
 create mode 100644 include/linux/mlx4/srq.h
 create mode 100644 include/rdma/ib_umem.h

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

* [GIT PULL] please pull infiniband.git
@ 2007-05-07  4:19 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-05-07  4:19 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This is the second batch of merges for 2.6.22 -- mostly fixes, but
also the conversion of IPoIB to use NAPI:

Ishai Rabinovitz (1):
      IB/srp: Add orig_dgid sysfs attribute to scsi_host

Michael S. Tsirkin (4):
      IB/mthca: Work around kernel QP starvation
      IPoIB/cm: Fix error handling in ipoib_cm_dev_open()
      IPoIB/cm: Don't crash if remote side uses one QP for both directions
      IB: Add CQ comp_vector support

Ralph Campbell (4):
      IB/ipath: Don't call spin_lock_irq() from interrupt context
      IB/ipath: Don't put QP in timeout queue if waiting to send
      IB/ipath: Fix two more spin lock problems
      IB/ipath: Fix a race condition when generating ACKs

Robert Walsh (1):
      IB/ipath: Don't corrupt pending mmap list when unmapped objects are freed

Roland Dreier (4):
      IB/srp: Set proc_name
      IB/fmr_pool: Add prefix to all printks
      IB: Return "maybe missed event" hint from ib_req_notify_cq()
      IPoIB: Convert to NAPI

Steve Wise (4):
      RDMA/cxgb3: Fix TERM codes
      RDMA/cxgb3: Fail qp creation if the requested max_inline is too large
      RDMA/cxgb3: Initialize cpu_idx field in cpl_close_listserv_req message
      RDMA/cxgb3: Support for new abort logic

 drivers/infiniband/core/fmr_pool.c           |   32 +++++----
 drivers/infiniband/core/mad.c                |    2 +-
 drivers/infiniband/core/uverbs_cmd.c         |    1 +
 drivers/infiniband/core/uverbs_main.c        |    2 +-
 drivers/infiniband/core/verbs.c              |    4 +-
 drivers/infiniband/hw/amso1100/c2.h          |    2 +-
 drivers/infiniband/hw/amso1100/c2_cq.c       |   16 ++++-
 drivers/infiniband/hw/amso1100/c2_provider.c |    3 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c       |    3 +
 drivers/infiniband/hw/cxgb3/cxio_wr.h        |    1 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c        |   19 ++++++
 drivers/infiniband/hw/cxgb3/iwch_cm.h        |    6 ++
 drivers/infiniband/hw/cxgb3/iwch_provider.c  |   14 +++-
 drivers/infiniband/hw/cxgb3/iwch_qp.c        |   69 +++++++++++---------
 drivers/infiniband/hw/ehca/ehca_cq.c         |    2 +-
 drivers/infiniband/hw/ehca/ehca_iverbs.h     |    4 +-
 drivers/infiniband/hw/ehca/ehca_main.c       |    3 +-
 drivers/infiniband/hw/ehca/ehca_reqs.c       |   14 +++-
 drivers/infiniband/hw/ehca/ipz_pt_fn.h       |    8 ++
 drivers/infiniband/hw/ipath/ipath_cq.c       |   68 ++++++++++----------
 drivers/infiniband/hw/ipath/ipath_mmap.c     |   64 +++++++++++++++++--
 drivers/infiniband/hw/ipath/ipath_qp.c       |   52 +++++++++------
 drivers/infiniband/hw/ipath/ipath_rc.c       |   55 ++++++++--------
 drivers/infiniband/hw/ipath/ipath_srq.c      |   55 ++++++++--------
 drivers/infiniband/hw/ipath/ipath_verbs.c    |    4 +
 drivers/infiniband/hw/ipath/ipath_verbs.h    |   24 +++++--
 drivers/infiniband/hw/mthca/mthca_cq.c       |   12 ++--
 drivers/infiniband/hw/mthca/mthca_dev.h      |    4 +-
 drivers/infiniband/hw/mthca/mthca_provider.c |    2 +
 drivers/infiniband/hw/mthca/mthca_qp.c       |   13 ++++
 drivers/infiniband/ulp/ipoib/ipoib.h         |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c      |   14 +++--
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |   89 ++++++++++++++++++++------
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |    2 +
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c   |    2 +-
 drivers/infiniband/ulp/iser/iser_verbs.c     |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c          |   27 +++++++-
 drivers/infiniband/ulp/srp/ib_srp.h          |    1 +
 drivers/net/cxgb3/version.h                  |    4 +-
 include/rdma/ib_verbs.h                      |   47 +++++++++++---
 40 files changed, 508 insertions(+), 239 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-04-26 18:42 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-04-26 18:42 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This is the first batch of merges for 2.6.22 -- mostly ipath driver fixes:

Arthur Jones (2):
      IB/ipath: Call free_irq() on chip specific initialization failure
      IB/ipath: Force PIOAvail update entry point

Bryan O'Sullivan (17):
      IB/ipath: Add ability to set and clear IB local loopback
      IB/ipath: Fix user memory region creation when IOMMU present
      IB/ipath: Definitions of two RXE parity err bits were reversed
      IB/ipath: Fix up some debug messages
      IB/ipath: Change packet problems vs chip errors handling and reporting
      IB/ipath: Fix bad argument to clear_bit()
      IB/ipath: Fix CQ flushing when QP is modified to error state
      IB/ipath: Remove unused ipath_read_kreg64_port()
      IB/ipath: Fix calculation for number of kernel PIO buffers
      IB/ipath: Discard multicast packets without a GRH
      IB/ipath: Print better error messages if kernel is misconfigured
      IB/ipath: Improve handling and reporting of parity errors
      IB/ipath: On unrecoverable errors, force link down, LEDs off
      IB/ipath: Prevent random program use of diags interface
      IB/ipath: Disable IB link earlier in shutdown sequence
      IB/ipath: Don't allow QPs 0 and 1 to be opened multiple times
      IB/ipath: Fix unit selection when all CPU affinity bits set

Hal Rosenstock (3):
      IB/umad: Fix declaration of dev_map[]
      IB/mad: Change SMI to use enums rather than magic return codes
      IB/umad: Clarify documentation of transaction ID

Joachim Fenkes (2):
      IB/ehca: Implement modify_port
      IB: Set class_dev->dev in core for nice device symlink

Mark Debbage (1):
      IB/ipath: Allow receive ports mapped into userspace to be shared

Michael Albaugh (1):
      IB/ipath: Fix driver crash (in interrupt or during unload) after chip reset

Ralph Campbell (8):
      IB/ipath: Don't initialize port memory for subports
      IB/ipath: Fix SRQ limit event causing dropped CQ entry
      IB/ipath: NMI cpu lockup if local loopback used
      IB/ipath: Support larger IB_QP_MAX_DEST_RD_ATOMIC and IB_QP_MAX_QP_RD_ATOMIC
      IB/ipath: Fix QP error completion queue entries
      IB/ipath: Fix PSN update for RC retries
      IB/ipath: Fix port sharing on powerpc
      IB/ipath: Fix RDMA reads of length zero and error handling

Robert Walsh (4):
      IB/ipath: Check reserved memory keys
      IB/ipath: Remove duplicate stuff from ipath_verbs.h
      IB/ipath: Check that a UD work request's address handle is valid
      IB/ipath: Fix WC format drift between user and kernel space

Roland Dreier (6):
      IB: Remove reference to obsolete CONFIG_IPATH_CORE
      IPoIB: Remove pointless opcode field from debugging output
      IB/mthca: Update HCA firmware revisions
      IB/mthca: Fix mthca_write_mtt() on HCAs with hidden memory
      IB/mthca: Simplify CQ cleaning in mthca_free_qp()
      IPoIB/cm: spin_lock_irqsave() -> spin_lock_irq() replacements

Sean Hefty (5):
      RDMA/ucma: Simplify ucma_get_event()
      IB/ucm: Simplify ib_ucm_event()
      IB/sa: Set src_path_bits correctly in ib_init_ah_from_path()
      IB/ipoib: Use ib_init_ah_from_path to initialize ah_attr
      IB/umad: Implement GRH handling for sent/received MADs

 Documentation/infiniband/user_mad.txt         |    8 +
 drivers/Makefile                              |    1 -
 drivers/infiniband/core/mad.c                 |   34 +-
 drivers/infiniband/core/sa_query.c            |   24 +-
 drivers/infiniband/core/smi.c                 |   86 ++--
 drivers/infiniband/core/smi.h                 |   34 +-
 drivers/infiniband/core/sysfs.c               |    1 +
 drivers/infiniband/core/ucm.c                 |   23 +-
 drivers/infiniband/core/ucma.c                |   22 +-
 drivers/infiniband/core/user_mad.c            |   20 +-
 drivers/infiniband/hw/amso1100/c2_provider.c  |    1 -
 drivers/infiniband/hw/cxgb3/iwch_provider.c   |    1 -
 drivers/infiniband/hw/ehca/ehca_classes.h     |    1 +
 drivers/infiniband/hw/ehca/ehca_hca.c         |   55 ++-
 drivers/infiniband/hw/ehca/ehca_main.c        |    1 +
 drivers/infiniband/hw/ehca/hcp_if.c           |   24 +
 drivers/infiniband/hw/ehca/hcp_if.h           |    4 +
 drivers/infiniband/hw/ipath/ipath_common.h    |   23 +-
 drivers/infiniband/hw/ipath/ipath_cq.c        |   38 +-
 drivers/infiniband/hw/ipath/ipath_debug.h     |    1 +
 drivers/infiniband/hw/ipath/ipath_diag.c      |   11 +-
 drivers/infiniband/hw/ipath/ipath_driver.c    |  123 +++--
 drivers/infiniband/hw/ipath/ipath_eeprom.c    |    4 +
 drivers/infiniband/hw/ipath/ipath_file_ops.c  |  287 +++++----
 drivers/infiniband/hw/ipath/ipath_iba6110.c   |  152 +++--
 drivers/infiniband/hw/ipath/ipath_iba6120.c   |   73 ++-
 drivers/infiniband/hw/ipath/ipath_init_chip.c |   86 ++-
 drivers/infiniband/hw/ipath/ipath_intr.c      |  100 ++-
 drivers/infiniband/hw/ipath/ipath_kernel.h    |   10 +-
 drivers/infiniband/hw/ipath/ipath_keys.c      |   14 +-
 drivers/infiniband/hw/ipath/ipath_mr.c        |   12 +-
 drivers/infiniband/hw/ipath/ipath_qp.c        |  133 +++--
 drivers/infiniband/hw/ipath/ipath_rc.c        |  920 ++++++++++++++-----------
 drivers/infiniband/hw/ipath/ipath_registers.h |   22 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c       |   63 +-
 drivers/infiniband/hw/ipath/ipath_stats.c     |   16 +-
 drivers/infiniband/hw/ipath/ipath_uc.c        |    6 +-
 drivers/infiniband/hw/ipath/ipath_ud.c        |    8 +-
 drivers/infiniband/hw/ipath/ipath_verbs.c     |   15 +-
 drivers/infiniband/hw/ipath/ipath_verbs.h     |   57 +-
 drivers/infiniband/hw/mthca/mthca_main.c      |   10 +-
 drivers/infiniband/hw/mthca/mthca_mr.c        |    6 +-
 drivers/infiniband/hw/mthca/mthca_provider.c  |    1 -
 drivers/infiniband/hw/mthca/mthca_qp.c        |    7 +-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c       |   64 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c       |    8 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c     |   12 +-
 47 files changed, 1620 insertions(+), 1002 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-04-16 21:16 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-04-16 21:16 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a one-liner that fixes data corruption seen with storage
over iSER:

Michael S. Tsirkin (1):
      IB/mthca: Fix data corruption after FMR unmap on Sinai

 drivers/infiniband/hw/mthca/mthca_mr.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index fdb576d..ee561c5 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -835,6 +835,7 @@ void mthca_arbel_fmr_unmap(struct mthca_dev *dev, struct mthca_fmr *fmr)
 
 	key = arbel_key_to_hw_index(fmr->ibmr.lkey);
 	key &= dev->limits.num_mpts - 1;
+	key = adjust_key(dev, key);
 	fmr->ibmr.lkey = fmr->ibmr.rkey = arbel_hw_index_to_key(key);
 
 	fmr->maps = 0;

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

* [GIT PULL] please pull infiniband.git
@ 2007-04-12 17:52 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-04-12 17:52 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general, Jeff Garzik

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will fix up some problems with drivers/infiniband/hw/cxgb3 caused
by a change to drivers/net/cxgb3 that you just pulled.

Steve Wise (1):
      RDMA/cxgb3: Add set_tcb_rpl_handler

 drivers/infiniband/hw/cxgb3/iwch_cm.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index d0ed1d3..2d2de9b 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -2026,6 +2026,17 @@ static int sched(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 	return 0;
 }
 
+static int set_tcb_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+	struct cpl_set_tcb_rpl *rpl = cplhdr(skb);
+
+	if (rpl->status != CPL_ERR_NONE) {
+		printk(KERN_ERR MOD "Unexpected SET_TCB_RPL status %u "
+		       "for tid %u\n", rpl->status, GET_TID(rpl));
+	}
+	return CPL_RET_BUF_DONE;
+}
+
 int __init iwch_cm_init(void)
 {
 	skb_queue_head_init(&rxq);
@@ -2053,6 +2064,7 @@ int __init iwch_cm_init(void)
 	t3c_handlers[CPL_ABORT_REQ_RSS] = sched;
 	t3c_handlers[CPL_RDMA_TERMINATE] = sched;
 	t3c_handlers[CPL_RDMA_EC_STATUS] = sched;
+	t3c_handlers[CPL_SET_TCB_RPL] = set_tcb_rpl;
 
 	/*
 	 * These are the real handlers that are called from a

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

* [GIT PULL] please pull infiniband.git
@ 2007-04-10 17:43 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-04-10 17:43 UTC (permalink / raw)
  To: torvalds, linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will two small post-rc6 fixes for crasher bugs:

Erez Zilber (1):
      IB/iser: Don't defer connection failure notification to workqueue

Michael S. Tsirkin (1):
      IPoIB/cm: Fix DMA direction typo

 drivers/infiniband/ulp/ipoib/ipoib_cm.c  |    2 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h |    1 -
 drivers/infiniband/ulp/iser/iser_verbs.c |   40 ++++++++++++------------------
 3 files changed, 17 insertions(+), 26 deletions(-)


diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index e70492d..2b242a4 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -131,7 +131,7 @@ static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev, int id, int
 		skb_fill_page_desc(skb, i, page, 0, PAGE_SIZE);
 
 		mapping[i + 1] = ib_dma_map_page(priv->ca, skb_shinfo(skb)->frags[i].page,
-						 0, PAGE_SIZE, DMA_TO_DEVICE);
+						 0, PAGE_SIZE, DMA_FROM_DEVICE);
 		if (unlikely(ib_dma_mapping_error(priv->ca, mapping[i + 1])))
 			goto partial_error;
 	}
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index cae8c96..8960196 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -245,7 +245,6 @@ struct iser_conn {
 	wait_queue_head_t	     wait;          /* waitq for conn/disconn  */
 	atomic_t                     post_recv_buf_count; /* posted rx count   */
 	atomic_t                     post_send_buf_count; /* posted tx count   */
-	struct work_struct           comperror_work; /* conn term sleepable ctx*/
 	char 			     name[ISER_OBJECT_NAME_SIZE];
 	struct iser_page_vec         *page_vec;     /* represents SG to fmr maps*
 						     * maps serialized as tx is*/
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 693b770..1fc9674 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -48,7 +48,6 @@
 
 static void iser_cq_tasklet_fn(unsigned long data);
 static void iser_cq_callback(struct ib_cq *cq, void *cq_context);
-static void iser_comp_error_worker(struct work_struct *work);
 
 static void iser_cq_event_callback(struct ib_event *cause, void *context)
 {
@@ -480,7 +479,6 @@ int iser_conn_init(struct iser_conn **ibconn)
 	init_waitqueue_head(&ib_conn->wait);
 	atomic_set(&ib_conn->post_recv_buf_count, 0);
 	atomic_set(&ib_conn->post_send_buf_count, 0);
-	INIT_WORK(&ib_conn->comperror_work, iser_comp_error_worker);
 	INIT_LIST_HEAD(&ib_conn->conn_list);
 	spin_lock_init(&ib_conn->lock);
 
@@ -753,26 +751,6 @@ int iser_post_send(struct iser_desc *tx_desc)
 	return ret_val;
 }
 
-static void iser_comp_error_worker(struct work_struct *work)
-{
-	struct iser_conn *ib_conn =
-		container_of(work, struct iser_conn, comperror_work);
-
-	/* getting here when the state is UP means that the conn is being *
-	 * terminated asynchronously from the iSCSI layer's perspective.  */
-	if (iser_conn_state_comp_exch(ib_conn, ISER_CONN_UP,
-				      ISER_CONN_TERMINATING))
-		iscsi_conn_failure(ib_conn->iser_conn->iscsi_conn,
-					ISCSI_ERR_CONN_FAILED);
-
-	/* complete the termination process if disconnect event was delivered *
-	 * note there are no more non completed posts to the QP               */
-	if (ib_conn->disc_evt_flag) {
-		ib_conn->state = ISER_CONN_DOWN;
-		wake_up_interruptible(&ib_conn->wait);
-	}
-}
-
 static void iser_handle_comp_error(struct iser_desc *desc)
 {
 	struct iser_dto  *dto     = &desc->dto;
@@ -791,8 +769,22 @@ static void iser_handle_comp_error(struct iser_desc *desc)
 	}
 
 	if (atomic_read(&ib_conn->post_recv_buf_count) == 0 &&
-	    atomic_read(&ib_conn->post_send_buf_count) == 0)
-		schedule_work(&ib_conn->comperror_work);
+	    atomic_read(&ib_conn->post_send_buf_count) == 0) {
+		/* getting here when the state is UP means that the conn is *
+		 * being terminated asynchronously from the iSCSI layer's   *
+		 * perspective.                                             */
+		if (iser_conn_state_comp_exch(ib_conn, ISER_CONN_UP,
+		    ISER_CONN_TERMINATING))
+			iscsi_conn_failure(ib_conn->iser_conn->iscsi_conn,
+					   ISCSI_ERR_CONN_FAILED);
+
+		/* complete the termination process if disconnect event was delivered *
+		 * note there are no more non completed posts to the QP               */
+		if (ib_conn->disc_evt_flag) {
+			ib_conn->state = ISER_CONN_DOWN;
+			wake_up_interruptible(&ib_conn->wait);
+		}
+	}
 }
 
 static void iser_cq_tasklet_fn(unsigned long data)

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

* [GIT PULL] please pull infiniband.git
@ 2007-03-28 17:25 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-03-28 17:25 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get a few small post-rc5 fixes.  I still have one more fix
to send that I am still reviewing -- I should be able to send it Thursday.

Erez Zilber (1):
      IB/iser: Handle aborting a command after it is sent

Michael S. Tsirkin (1):
      IB/mthca: Fix thinko in init_mr_table()

Steve Wise (1):
      RDMA/cxgb3: Fix resource leak in cxio_hal_init_ctrl_qp()

 drivers/infiniband/hw/cxgb3/cxio_hal.c       |   12 ++++++++----
 drivers/infiniband/hw/mthca/mthca_mr.c       |    4 ++--
 drivers/infiniband/ulp/iser/iser_initiator.c |   17 +++++++++--------
 3 files changed, 19 insertions(+), 14 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
index 818cf1a..f5e9aee 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c
@@ -498,9 +498,9 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p)
 	u64 sge_cmd, ctx0, ctx1;
 	u64 base_addr;
 	struct t3_modify_qp_wr *wqe;
-	struct sk_buff *skb = alloc_skb(sizeof(*wqe), GFP_KERNEL);
-
+	struct sk_buff *skb;
 
+	skb = alloc_skb(sizeof(*wqe), GFP_KERNEL);
 	if (!skb) {
 		PDBG("%s alloc_skb failed\n", __FUNCTION__);
 		return -ENOMEM;
@@ -508,7 +508,7 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p)
 	err = cxio_hal_init_ctrl_cq(rdev_p);
 	if (err) {
 		PDBG("%s err %d initializing ctrl_cq\n", __FUNCTION__, err);
-		return err;
+		goto err;
 	}
 	rdev_p->ctrl_qp.workq = dma_alloc_coherent(
 					&(rdev_p->rnic_info.pdev->dev),
@@ -518,7 +518,8 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p)
 					GFP_KERNEL);
 	if (!rdev_p->ctrl_qp.workq) {
 		PDBG("%s dma_alloc_coherent failed\n", __FUNCTION__);
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto err;
 	}
 	pci_unmap_addr_set(&rdev_p->ctrl_qp, mapping,
 			   rdev_p->ctrl_qp.dma_addr);
@@ -556,6 +557,9 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p)
 	     rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2);
 	skb->priority = CPL_PRIORITY_CONTROL;
 	return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb));
+err:
+	kfree_skb(skb);
+	return err;
 }
 
 static int cxio_hal_destroy_ctrl_qp(struct cxio_rdev *rdev_p)
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index 8e4846b..fdb576d 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -881,8 +881,8 @@ int mthca_init_mr_table(struct mthca_dev *dev)
 		}
 		mpts = mtts = 1 << i;
 	} else {
-		mpts = dev->limits.num_mtt_segs;
-		mtts = dev->limits.num_mpts;
+		mtts = dev->limits.num_mtt_segs;
+		mpts = dev->limits.num_mpts;
 	}
 
 	if (!mthca_is_memfree(dev) &&
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index 89e3728..278fcbc 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -658,6 +658,7 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask)
 {
 	int deferred;
 	int is_rdma_aligned = 1;
+	struct iser_regd_buf *regd;
 
 	/* if we were reading, copy back to unaligned sglist,
 	 * anyway dma_unmap and free the copy
@@ -672,20 +673,20 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask)
 	}
 
 	if (iser_ctask->dir[ISER_DIR_IN]) {
-		deferred = iser_regd_buff_release
-			(&iser_ctask->rdma_regd[ISER_DIR_IN]);
+		regd = &iser_ctask->rdma_regd[ISER_DIR_IN];
+		deferred = iser_regd_buff_release(regd);
 		if (deferred) {
-			iser_err("References remain for BUF-IN rdma reg\n");
-			BUG();
+			iser_err("%d references remain for BUF-IN rdma reg\n",
+				 atomic_read(&regd->ref_count));
 		}
 	}
 
 	if (iser_ctask->dir[ISER_DIR_OUT]) {
-		deferred = iser_regd_buff_release
-			(&iser_ctask->rdma_regd[ISER_DIR_OUT]);
+		regd = &iser_ctask->rdma_regd[ISER_DIR_OUT];
+		deferred = iser_regd_buff_release(regd);
 		if (deferred) {
-			iser_err("References remain for BUF-OUT rdma reg\n");
-			BUG();
+			iser_err("%d references remain for BUF-OUT rdma reg\n",
+				 atomic_read(&regd->ref_count));
 		}
 	}
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-03-22 21:39 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-03-22 21:39 UTC (permalink / raw)
  To: torvalds; +Cc: general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get various small post-rc4 fixes:

Bryan O'Sullivan (1):
      IB/ipath: check return value of lookup_one_len

Joachim Fenkes (1):
      IB/ehca: Make scaling code work without CPU hotplug

Michael S. Tsirkin (3):
      IPoIB/cm: Fix reaping of stale connections
      IPoIB: Fix use-after-free in path_rec_completion()
      IB/ipoib: Fix thinko in packet length checks

Sean Hefty (1):
      IPoIB: Fix race in detaching from mcast group before attaching

Steve Wise (1):
      RDMA/cxgb3: Handle build_phys_page_list() failure in iwch_reregister_phys_mem()

 drivers/infiniband/hw/cxgb3/iwch_provider.c    |    5 ++++-
 drivers/infiniband/hw/ehca/ehca_irq.c          |    8 ++++++++
 drivers/infiniband/hw/ipath/ipath_fs.c         |   16 +++++++++++++++-
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |    4 ++--
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |    4 ++--
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    4 ++--
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    6 +++---
 7 files changed, 36 insertions(+), 11 deletions(-)


diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index f2774ae..24e0df0 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -545,11 +545,14 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr,
 		php = to_iwch_pd(pd);
 	if (mr_rereg_mask & IB_MR_REREG_ACCESS)
 		mh.attr.perms = iwch_ib_to_tpt_access(acc);
-	if (mr_rereg_mask & IB_MR_REREG_TRANS)
+	if (mr_rereg_mask & IB_MR_REREG_TRANS) {
 		ret = build_phys_page_list(buffer_list, num_phys_buf,
 					   iova_start,
 					   &total_size, &npages,
 					   &shift, &page_list);
+		if (ret)
+			return ret;
+	}
 
 	ret = iwch_reregister_mem(rhp, php, &mh, shift, page_list, npages);
 	kfree(page_list);
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index 20f36bf..f284be1 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -66,7 +66,9 @@
 static void queue_comp_task(struct ehca_cq *__cq);
 
 static struct ehca_comp_pool* pool;
+#ifdef CONFIG_HOTPLUG_CPU
 static struct notifier_block comp_pool_callback_nb;
+#endif
 
 static inline void comp_event_callback(struct ehca_cq *cq)
 {
@@ -733,6 +735,7 @@ static void take_over_work(struct ehca_comp_pool *pool,
 
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
 static int comp_pool_callback(struct notifier_block *nfb,
 			      unsigned long action,
 			      void *hcpu)
@@ -775,6 +778,7 @@ static int comp_pool_callback(struct notifier_block *nfb,
 
 	return NOTIFY_OK;
 }
+#endif
 
 int ehca_create_comp_pool(void)
 {
@@ -805,9 +809,11 @@ int ehca_create_comp_pool(void)
 		}
 	}
 
+#ifdef CONFIG_HOTPLUG_CPU
 	comp_pool_callback_nb.notifier_call = comp_pool_callback;
 	comp_pool_callback_nb.priority =0;
 	register_cpu_notifier(&comp_pool_callback_nb);
+#endif
 
 	printk(KERN_INFO "eHCA scaling code enabled\n");
 
@@ -821,7 +827,9 @@ void ehca_destroy_comp_pool(void)
 	if (!ehca_scaling_code)
 		return;
 
+#ifdef CONFIG_HOTPLUG_CPU
 	unregister_cpu_notifier(&comp_pool_callback_nb);
+#endif
 
 	for (i = 0; i < NR_CPUS; i++) {
 		if (cpu_online(i))
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c
index 5b40a84..ed55979 100644
--- a/drivers/infiniband/hw/ipath/ipath_fs.c
+++ b/drivers/infiniband/hw/ipath/ipath_fs.c
@@ -451,12 +451,18 @@ bail:
 	return ret;
 }
 
-static void remove_file(struct dentry *parent, char *name)
+static int remove_file(struct dentry *parent, char *name)
 {
 	struct dentry *tmp;
+	int ret;
 
 	tmp = lookup_one_len(name, parent, strlen(name));
 
+	if (IS_ERR(tmp)) {
+		ret = PTR_ERR(tmp);
+		goto bail;
+	}
+
 	spin_lock(&dcache_lock);
 	spin_lock(&tmp->d_lock);
 	if (!(d_unhashed(tmp) && tmp->d_inode)) {
@@ -469,6 +475,14 @@ static void remove_file(struct dentry *parent, char *name)
 		spin_unlock(&tmp->d_lock);
 		spin_unlock(&dcache_lock);
 	}
+
+	ret = 0;
+bail:
+	/*
+	 * We don't expect clients to care about the return value, but
+	 * it's there if they need it.
+	 */
+	return ret;
 }
 
 static int remove_device_files(struct super_block *sb,
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 3484e8b..e70492d 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -452,7 +452,7 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
 			   skb->len, tx->mtu);
 		++priv->stats.tx_dropped;
 		++priv->stats.tx_errors;
-		ipoib_cm_skb_too_long(dev, skb, tx->mtu - INFINIBAND_ALEN);
+		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
 		return;
 	}
 
@@ -1095,7 +1095,7 @@ static void ipoib_cm_stale_task(struct work_struct *work)
 		/* List if sorted by LRU, start from tail,
 		 * stop when we see a recently used entry */
 		p = list_entry(priv->cm.passive_ids.prev, typeof(*p), list);
-		if (time_after_eq(jiffies, p->jiffies + IPOIB_CM_RX_TIMEOUT))
+		if (time_before_eq(jiffies, p->jiffies + IPOIB_CM_RX_TIMEOUT))
 			break;
 		list_del_init(&p->list);
 		spin_unlock_irqrestore(&priv->lock, flags);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index f2aa923..ba0ee5c 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -328,9 +328,9 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
 	struct ipoib_tx_buf *tx_req;
 	u64 addr;
 
-	if (unlikely(skb->len > priv->mcast_mtu + INFINIBAND_ALEN)) {
+	if (unlikely(skb->len > priv->mcast_mtu + IPOIB_ENCAP_LEN)) {
 		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
-			   skb->len, priv->mcast_mtu + INFINIBAND_ALEN);
+			   skb->len, priv->mcast_mtu + IPOIB_ENCAP_LEN);
 		++priv->stats.tx_dropped;
 		++priv->stats.tx_errors;
 		ipoib_cm_skb_too_long(dev, skb, priv->mcast_mtu);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index f9dbc6f..0741c6d 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -380,7 +380,7 @@ static void path_rec_completion(int status,
 	struct net_device *dev = path->dev;
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct ipoib_ah *ah = NULL;
-	struct ipoib_neigh *neigh;
+	struct ipoib_neigh *neigh, *tn;
 	struct sk_buff_head skqueue;
 	struct sk_buff *skb;
 	unsigned long flags;
@@ -418,7 +418,7 @@ static void path_rec_completion(int status,
 		while ((skb = __skb_dequeue(&path->queue)))
 			__skb_queue_tail(&skqueue, skb);
 
-		list_for_each_entry(neigh, &path->neigh_list, list) {
+		list_for_each_entry_safe(neigh, tn, &path->neigh_list, list) {
 			kref_get(&path->ah->ref);
 			neigh->ah = path->ah;
 			memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw,
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 56c87a8..54fbead 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -644,6 +644,9 @@ static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	int ret = 0;
 
+	if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
+		ib_sa_free_multicast(mcast->mc);
+
 	if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
 		ipoib_dbg_mcast(priv, "leaving MGID " IPOIB_GID_FMT "\n",
 				IPOIB_GID_ARG(mcast->mcmember.mgid));
@@ -655,9 +658,6 @@ static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
 			ipoib_warn(priv, "ipoib_mcast_detach failed (result = %d)\n", ret);
 	}
 
-	if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
-		ib_sa_free_multicast(mcast->mc);
-
 	return 0;
 }
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-03-08 23:50 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-03-08 23:50 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get various post-rc3 fixes:

David Miller (1):
      RDMA/cxgb3: Fix build on sparc64

Hoang-Nam Nguyen (1):
      IB/ehca: Fix sync between completion handler and destroy cq

Roland Dreier (2):
      IPoIB: Only handle async events for one port
      IB/mthca: Fix error path in mthca_alloc_memfree()

Sean Hefty (2):
      RDMA/cma: Initialize rdma_bind_list in cma_alloc_any_port()
      RDMA/ucma: Avoid sending reject if backlog is full

Shirley Ma (1):
      IPoIB: Turn on interface's carrier after broadcast group is joined

Steve Wise (8):
      RDMA/cxgb3: Start ep timer on a MPA reject
      RDMA/cxgb3: Don't use mm after it's freed in iwch_mmap()
      RDMA/cxgb3: Fixes for "normal close" failures
      RDMA/cxgb3: Move QP to error on destroy if the state is IDLE
      RDMA/cxgb3: Stop EP timer when MPA exchange is aborted by peer
      RDMA/cxgb3: Squelch logging AE errors
      RDMA/cxgb3: Don't reuse skbs that are non-linear or cloned
      RDMA/cxgb3: Fix MR permission problems

 drivers/infiniband/core/cma.c                  |    2 +-
 drivers/infiniband/core/ucma.c                 |    2 +-
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |    1 +
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |   19 ++++---
 drivers/infiniband/hw/cxgb3/iwch_ev.c          |   12 ++--
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |   40 +++++-----------
 drivers/infiniband/hw/cxgb3/iwch_provider.h    |   33 +++++--------
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |    2 +-
 drivers/infiniband/hw/ehca/ehca_classes.h      |    6 ++-
 drivers/infiniband/hw/ehca/ehca_cq.c           |   16 ++++++-
 drivers/infiniband/hw/ehca/ehca_irq.c          |   59 ++++++++++++++++--------
 drivers/infiniband/hw/ehca/ehca_main.c         |    4 +-
 drivers/infiniband/hw/mthca/mthca_qp.c         |   10 ++--
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    5 ++-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |   13 +++--
 15 files changed, 122 insertions(+), 102 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index d441815..fde92ce 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1821,7 +1821,7 @@ static int cma_alloc_port(struct idr *ps, struct rdma_id_private *id_priv,
 	struct rdma_bind_list *bind_list;
 	int port, ret;
 
-	bind_list = kmalloc(sizeof *bind_list, GFP_KERNEL);
+	bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
 	if (!bind_list)
 		return -ENOMEM;
 
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
index b516b93..c859134 100644
--- a/drivers/infiniband/core/ucma.c
+++ b/drivers/infiniband/core/ucma.c
@@ -266,7 +266,7 @@ static int ucma_event_handler(struct rdma_cm_id *cm_id,
 	mutex_lock(&ctx->file->mut);
 	if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) {
 		if (!ctx->backlog) {
-			ret = -EDQUOT;
+			ret = -ENOMEM;
 			kfree(uevent);
 			goto out;
 		}
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
index d737c73..818cf1a 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c
@@ -36,6 +36,7 @@
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 
 #include "cxio_resource.h"
 #include "cxio_hal.h"
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index b21fde8..d0ed1d3 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -305,8 +305,7 @@ static int status2errno(int status)
  */
 static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp)
 {
-	if (skb) {
-		BUG_ON(skb_cloned(skb));
+	if (skb && !skb_is_nonlinear(skb) && !skb_cloned(skb)) {
 		skb_trim(skb, 0);
 		skb_get(skb);
 	} else {
@@ -1415,6 +1414,7 @@ static int peer_close(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 		wake_up(&ep->com.waitq);
 		break;
 	case FPDU_MODE:
+		start_ep_timer(ep);
 		__state_set(&ep->com, CLOSING);
 		attrs.next_state = IWCH_QP_STATE_CLOSING;
 		iwch_modify_qp(ep->com.qp->rhp, ep->com.qp,
@@ -1425,7 +1425,6 @@ static int peer_close(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 		disconnect = 0;
 		break;
 	case CLOSING:
-		start_ep_timer(ep);
 		__state_set(&ep->com, MORIBUND);
 		disconnect = 0;
 		break;
@@ -1487,8 +1486,10 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 	case CONNECTING:
 		break;
 	case MPA_REQ_WAIT:
+		stop_ep_timer(ep);
 		break;
 	case MPA_REQ_SENT:
+		stop_ep_timer(ep);
 		connect_reply_upcall(ep, -ECONNRESET);
 		break;
 	case MPA_REP_SENT:
@@ -1507,9 +1508,10 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 		get_ep(&ep->com);
 		break;
 	case MORIBUND:
+	case CLOSING:
 		stop_ep_timer(ep);
+		/*FALLTHROUGH*/
 	case FPDU_MODE:
-	case CLOSING:
 		if (ep->com.cm_id && ep->com.qp) {
 			attrs.next_state = IWCH_QP_STATE_ERROR;
 			ret = iwch_modify_qp(ep->com.qp->rhp,
@@ -1570,7 +1572,6 @@ static int close_con_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 	spin_lock_irqsave(&ep->com.lock, flags);
 	switch (ep->com.state) {
 	case CLOSING:
-		start_ep_timer(ep);
 		__state_set(&ep->com, MORIBUND);
 		break;
 	case MORIBUND:
@@ -1586,6 +1587,8 @@ static int close_con_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 		__state_set(&ep->com, DEAD);
 		release = 1;
 		break;
+	case ABORTING:
+		break;
 	case DEAD:
 	default:
 		BUG_ON(1);
@@ -1659,6 +1662,7 @@ static void ep_timeout(unsigned long arg)
 		break;
 	case MPA_REQ_WAIT:
 		break;
+	case CLOSING:
 	case MORIBUND:
 		if (ep->com.cm_id && ep->com.qp) {
 			attrs.next_state = IWCH_QP_STATE_ERROR;
@@ -1687,12 +1691,11 @@ int iwch_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
 		return -ECONNRESET;
 	}
 	BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD);
-	state_set(&ep->com, CLOSING);
 	if (mpa_rev == 0)
 		abort_connection(ep, NULL, GFP_KERNEL);
 	else {
 		err = send_mpa_reject(ep, pdata, pdata_len);
-		err = send_halfclose(ep, GFP_KERNEL);
+		err = iwch_ep_disconnect(ep, 0, GFP_KERNEL);
 	}
 	return 0;
 }
@@ -1957,11 +1960,11 @@ int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp)
 	case MPA_REQ_RCVD:
 	case MPA_REP_SENT:
 	case FPDU_MODE:
+		start_ep_timer(ep);
 		ep->com.state = CLOSING;
 		close = 1;
 		break;
 	case CLOSING:
-		start_ep_timer(ep);
 		ep->com.state = MORIBUND;
 		close = 1;
 		break;
diff --git a/drivers/infiniband/hw/cxgb3/iwch_ev.c b/drivers/infiniband/hw/cxgb3/iwch_ev.c
index 54362af..b406766 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_ev.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_ev.c
@@ -47,12 +47,6 @@ static void post_qp_event(struct iwch_dev *rnicp, struct iwch_cq *chp,
 	struct iwch_qp_attributes attrs;
 	struct iwch_qp *qhp;
 
-	printk(KERN_ERR "%s - AE qpid 0x%x opcode %d status 0x%x "
-	       "type %d wrid.hi 0x%x wrid.lo 0x%x \n", __FUNCTION__,
-	       CQE_QPID(rsp_msg->cqe), CQE_OPCODE(rsp_msg->cqe),
-	       CQE_STATUS(rsp_msg->cqe), CQE_TYPE(rsp_msg->cqe),
-	       CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe));
-
 	spin_lock(&rnicp->lock);
 	qhp = get_qhp(rnicp, CQE_QPID(rsp_msg->cqe));
 
@@ -73,6 +67,12 @@ static void post_qp_event(struct iwch_dev *rnicp, struct iwch_cq *chp,
 		return;
 	}
 
+	printk(KERN_ERR "%s - AE qpid 0x%x opcode %d status 0x%x "
+	       "type %d wrid.hi 0x%x wrid.lo 0x%x \n", __FUNCTION__,
+	       CQE_QPID(rsp_msg->cqe), CQE_OPCODE(rsp_msg->cqe),
+	       CQE_STATUS(rsp_msg->cqe), CQE_TYPE(rsp_msg->cqe),
+	       CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe));
+
 	atomic_inc(&qhp->refcnt);
 	spin_unlock(&rnicp->lock);
 
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index 9947a14..f2774ae 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -331,6 +331,7 @@ static int iwch_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 	int ret = 0;
 	struct iwch_mm_entry *mm;
 	struct iwch_ucontext *ucontext;
+	u64 addr;
 
 	PDBG("%s pgoff 0x%lx key 0x%x len %d\n", __FUNCTION__, vma->vm_pgoff,
 	     key, len);
@@ -345,10 +346,11 @@ static int iwch_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 	mm = remove_mmap(ucontext, key, len);
 	if (!mm)
 		return -EINVAL;
+	addr = mm->addr;
 	kfree(mm);
 
-	if ((mm->addr >= rdev_p->rnic_info.udbell_physbase) &&
-	    (mm->addr < (rdev_p->rnic_info.udbell_physbase +
+	if ((addr >= rdev_p->rnic_info.udbell_physbase) &&
+	    (addr < (rdev_p->rnic_info.udbell_physbase +
 		       rdev_p->rnic_info.udbell_len))) {
 
 		/*
@@ -362,7 +364,7 @@ static int iwch_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 		vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND;
 		vma->vm_flags &= ~VM_MAYREAD;
 		ret = io_remap_pfn_range(vma, vma->vm_start,
-					 mm->addr >> PAGE_SHIFT,
+					 addr >> PAGE_SHIFT,
 				         len, vma->vm_page_prot);
 	} else {
 
@@ -370,7 +372,7 @@ static int iwch_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 		 * Map WQ or CQ contig dma memory...
 		 */
 		ret = remap_pfn_range(vma, vma->vm_start,
-				      mm->addr >> PAGE_SHIFT,
+				      addr >> PAGE_SHIFT,
 				      len, vma->vm_page_prot);
 	}
 
@@ -463,9 +465,6 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd,
 	php = to_iwch_pd(pd);
 	rhp = php->rhp;
 
-	acc = iwch_convert_access(acc);
-
-
 	mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
 	if (!mhp)
 		return ERR_PTR(-ENOMEM);
@@ -491,12 +490,7 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd,
 	mhp->attr.pdid = php->pdid;
 	mhp->attr.zbva = 0;
 
-	/* NOTE: TPT perms are backwards from BIND WR perms! */
-	mhp->attr.perms = (acc & 0x1) << 3;
-	mhp->attr.perms |= (acc & 0x2) << 1;
-	mhp->attr.perms |= (acc & 0x4) >> 1;
-	mhp->attr.perms |= (acc & 0x8) >> 3;
-
+	mhp->attr.perms = iwch_ib_to_tpt_access(acc);
 	mhp->attr.va_fbo = *iova_start;
 	mhp->attr.page_size = shift - 12;
 
@@ -525,7 +519,6 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr,
 	struct iwch_mr mh, *mhp;
 	struct iwch_pd *php;
 	struct iwch_dev *rhp;
-	int new_acc;
 	__be64 *page_list = NULL;
 	int shift = 0;
 	u64 total_size;
@@ -546,14 +539,12 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr,
 	if (rhp != php->rhp)
 		return -EINVAL;
 
-	new_acc = mhp->attr.perms;
-
 	memcpy(&mh, mhp, sizeof *mhp);
 
 	if (mr_rereg_mask & IB_MR_REREG_PD)
 		php = to_iwch_pd(pd);
 	if (mr_rereg_mask & IB_MR_REREG_ACCESS)
-		mh.attr.perms = iwch_convert_access(acc);
+		mh.attr.perms = iwch_ib_to_tpt_access(acc);
 	if (mr_rereg_mask & IB_MR_REREG_TRANS)
 		ret = build_phys_page_list(buffer_list, num_phys_buf,
 					   iova_start,
@@ -568,7 +559,7 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr,
 	if (mr_rereg_mask & IB_MR_REREG_PD)
 		mhp->attr.pdid = php->pdid;
 	if (mr_rereg_mask & IB_MR_REREG_ACCESS)
-		mhp->attr.perms = acc;
+		mhp->attr.perms = iwch_ib_to_tpt_access(acc);
 	if (mr_rereg_mask & IB_MR_REREG_TRANS) {
 		mhp->attr.zbva = 0;
 		mhp->attr.va_fbo = *iova_start;
@@ -613,8 +604,6 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
 		goto err;
 	}
 
-	acc = iwch_convert_access(acc);
-
 	i = n = 0;
 
 	list_for_each_entry(chunk, &region->chunk_list, list)
@@ -630,10 +619,7 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
 	mhp->rhp = rhp;
 	mhp->attr.pdid = php->pdid;
 	mhp->attr.zbva = 0;
-	mhp->attr.perms = (acc & 0x1) << 3;
-	mhp->attr.perms |= (acc & 0x2) << 1;
-	mhp->attr.perms |= (acc & 0x4) >> 1;
-	mhp->attr.perms |= (acc & 0x8) >> 3;
+	mhp->attr.perms = iwch_ib_to_tpt_access(acc);
 	mhp->attr.va_fbo = region->virt_base;
 	mhp->attr.page_size = shift - 12;
 	mhp->attr.len = (u32) region->length;
@@ -736,10 +722,8 @@ static int iwch_destroy_qp(struct ib_qp *ib_qp)
 	qhp = to_iwch_qp(ib_qp);
 	rhp = qhp->rhp;
 
-	if (qhp->attr.state == IWCH_QP_STATE_RTS) {
-		attrs.next_state = IWCH_QP_STATE_ERROR;
-		iwch_modify_qp(rhp, qhp, IWCH_QP_ATTR_NEXT_STATE, &attrs, 0);
-	}
+	attrs.next_state = IWCH_QP_STATE_ERROR;
+	iwch_modify_qp(rhp, qhp, IWCH_QP_ATTR_NEXT_STATE, &attrs, 0);
 	wait_event(qhp->wait, !qhp->ep);
 
 	remove_handle(rhp, &rhp->qpidr, qhp->wq.qpid);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h
index de0fe1b..93bcc56 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.h
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.h
@@ -286,27 +286,20 @@ static inline int iwch_convert_state(enum ib_qp_state ib_state)
 	}
 }
 
-enum iwch_mem_perms {
-	IWCH_MEM_ACCESS_LOCAL_READ = 1 << 0,
-	IWCH_MEM_ACCESS_LOCAL_WRITE = 1 << 1,
-	IWCH_MEM_ACCESS_REMOTE_READ = 1 << 2,
-	IWCH_MEM_ACCESS_REMOTE_WRITE = 1 << 3,
-	IWCH_MEM_ACCESS_ATOMICS = 1 << 4,
-	IWCH_MEM_ACCESS_BINDING = 1 << 5,
-	IWCH_MEM_ACCESS_LOCAL =
-	    (IWCH_MEM_ACCESS_LOCAL_READ | IWCH_MEM_ACCESS_LOCAL_WRITE),
-	IWCH_MEM_ACCESS_REMOTE =
-	    (IWCH_MEM_ACCESS_REMOTE_WRITE | IWCH_MEM_ACCESS_REMOTE_READ)
-	    /* cannot go beyond 1 << 31 */
-} __attribute__ ((packed));
-
-static inline u32 iwch_convert_access(int acc)
+static inline u32 iwch_ib_to_tpt_access(int acc)
 {
-	return (acc & IB_ACCESS_REMOTE_WRITE ? IWCH_MEM_ACCESS_REMOTE_WRITE : 0)
-	    | (acc & IB_ACCESS_REMOTE_READ ? IWCH_MEM_ACCESS_REMOTE_READ : 0) |
-	    (acc & IB_ACCESS_LOCAL_WRITE ? IWCH_MEM_ACCESS_LOCAL_WRITE : 0) |
-	    (acc & IB_ACCESS_MW_BIND ? IWCH_MEM_ACCESS_BINDING : 0) |
-	    IWCH_MEM_ACCESS_LOCAL_READ;
+	return (acc & IB_ACCESS_REMOTE_WRITE ? TPT_REMOTE_WRITE : 0) |
+	       (acc & IB_ACCESS_REMOTE_READ ? TPT_REMOTE_READ : 0) |
+	       (acc & IB_ACCESS_LOCAL_WRITE ? TPT_LOCAL_WRITE : 0) |
+	       TPT_LOCAL_READ;
+}
+
+static inline u32 iwch_ib_to_mwbind_access(int acc)
+{
+	return (acc & IB_ACCESS_REMOTE_WRITE ? T3_MEM_ACCESS_REM_WRITE : 0) |
+	       (acc & IB_ACCESS_REMOTE_READ ? T3_MEM_ACCESS_REM_READ : 0) |
+	       (acc & IB_ACCESS_LOCAL_WRITE ? T3_MEM_ACCESS_LOCAL_WRITE : 0) |
+	       T3_MEM_ACCESS_LOCAL_READ;
 }
 
 enum iwch_mmid_state {
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 9ea00cc..0a472c9 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -439,7 +439,7 @@ int iwch_bind_mw(struct ib_qp *qp,
 	wqe->bind.type = T3_VA_BASED_TO;
 
 	/* TBD: check perms */
-	wqe->bind.perms = iwch_convert_access(mw_bind->mw_access_flags);
+	wqe->bind.perms = iwch_ib_to_mwbind_access(mw_bind->mw_access_flags);
 	wqe->bind.mr_stag = cpu_to_be32(mw_bind->mr->lkey);
 	wqe->bind.mw_stag = cpu_to_be32(mw->rkey);
 	wqe->bind.mw_len = cpu_to_be32(mw_bind->length);
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 40404c9..82ded44 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -52,6 +52,8 @@ struct ehca_mw;
 struct ehca_pd;
 struct ehca_av;
 
+#include <linux/wait.h>
+
 #include <rdma/ib_verbs.h>
 #include <rdma/ib_user_verbs.h>
 
@@ -153,7 +155,9 @@ struct ehca_cq {
 	spinlock_t cb_lock;
 	struct hlist_head qp_hashtab[QP_HASHTAB_LEN];
 	struct list_head entry;
-	u32 nr_callbacks;
+	u32 nr_callbacks; /* #events assigned to cpu by scaling code */
+	u32 nr_events;    /* #events seen */
+	wait_queue_head_t wait_completion;
 	spinlock_t task_lock;
 	u32 ownpid;
 	/* mmap counter for resources mapped into user space */
diff --git a/drivers/infiniband/hw/ehca/ehca_cq.c b/drivers/infiniband/hw/ehca/ehca_cq.c
index 6ebfa27..e2cdc1a 100644
--- a/drivers/infiniband/hw/ehca/ehca_cq.c
+++ b/drivers/infiniband/hw/ehca/ehca_cq.c
@@ -146,6 +146,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe,
 	spin_lock_init(&my_cq->spinlock);
 	spin_lock_init(&my_cq->cb_lock);
 	spin_lock_init(&my_cq->task_lock);
+	init_waitqueue_head(&my_cq->wait_completion);
 	my_cq->ownpid = current->tgid;
 
 	cq = &my_cq->ib_cq;
@@ -302,6 +303,16 @@ create_cq_exit1:
 	return cq;
 }
 
+static int get_cq_nr_events(struct ehca_cq *my_cq)
+{
+	int ret;
+	unsigned long flags;
+	spin_lock_irqsave(&ehca_cq_idr_lock, flags);
+	ret = my_cq->nr_events;
+	spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
+	return ret;
+}
+
 int ehca_destroy_cq(struct ib_cq *cq)
 {
 	u64 h_ret;
@@ -329,10 +340,11 @@ int ehca_destroy_cq(struct ib_cq *cq)
 	}
 
 	spin_lock_irqsave(&ehca_cq_idr_lock, flags);
-	while (my_cq->nr_callbacks) {
+	while (my_cq->nr_events) {
 		spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
-		yield();
+		wait_event(my_cq->wait_completion, !get_cq_nr_events(my_cq));
 		spin_lock_irqsave(&ehca_cq_idr_lock, flags);
+		/* recheck nr_events to assure no cqe has just arrived */
 	}
 
 	idr_remove(&ehca_cq_idr, my_cq->token);
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index 3ec53c6..20f36bf 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -404,10 +404,11 @@ static inline void process_eqe(struct ehca_shca *shca, struct ehca_eqe *eqe)
 	u32 token;
 	unsigned long flags;
 	struct ehca_cq *cq;
+
 	eqe_value = eqe->entry;
 	ehca_dbg(&shca->ib_device, "eqe_value=%lx", eqe_value);
 	if (EHCA_BMASK_GET(EQE_COMPLETION_EVENT, eqe_value)) {
-		ehca_dbg(&shca->ib_device, "... completion event");
+		ehca_dbg(&shca->ib_device, "Got completion event");
 		token = EHCA_BMASK_GET(EQE_CQ_TOKEN, eqe_value);
 		spin_lock_irqsave(&ehca_cq_idr_lock, flags);
 		cq = idr_find(&ehca_cq_idr, token);
@@ -419,16 +420,20 @@ static inline void process_eqe(struct ehca_shca *shca, struct ehca_eqe *eqe)
 			return;
 		}
 		reset_eq_pending(cq);
-		if (ehca_scaling_code) {
+		cq->nr_events++;
+		spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
+		if (ehca_scaling_code)
 			queue_comp_task(cq);
-			spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
-		} else {
-			spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
+		else {
 			comp_event_callback(cq);
+			spin_lock_irqsave(&ehca_cq_idr_lock, flags);
+			cq->nr_events--;
+			if (!cq->nr_events)
+				wake_up(&cq->wait_completion);
+			spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
 		}
 	} else {
-		ehca_dbg(&shca->ib_device,
-			 "Got non completion event");
+		ehca_dbg(&shca->ib_device, "Got non completion event");
 		parse_identifier(shca, eqe_value);
 	}
 }
@@ -478,6 +483,7 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
 					 "token=%x", token);
 				continue;
 			}
+			eqe_cache[eqe_cnt].cq->nr_events++;
 			spin_unlock(&ehca_cq_idr_lock);
 		} else
 			eqe_cache[eqe_cnt].cq = NULL;
@@ -504,12 +510,18 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
 	/* call completion handler for cached eqes */
 	for (i = 0; i < eqe_cnt; i++)
 		if (eq->eqe_cache[i].cq) {
-			if (ehca_scaling_code) {
-				spin_lock(&ehca_cq_idr_lock);
+			if (ehca_scaling_code)
 				queue_comp_task(eq->eqe_cache[i].cq);
-				spin_unlock(&ehca_cq_idr_lock);
-			} else
-				comp_event_callback(eq->eqe_cache[i].cq);
+			else {
+				struct ehca_cq *cq = eq->eqe_cache[i].cq;
+				comp_event_callback(cq);
+				spin_lock_irqsave(&ehca_cq_idr_lock, flags);
+				cq->nr_events--;
+				if (!cq->nr_events)
+					wake_up(&cq->wait_completion);
+				spin_unlock_irqrestore(&ehca_cq_idr_lock,
+						       flags);
+			}
 		} else {
 			ehca_dbg(&shca->ib_device, "Got non completion event");
 			parse_identifier(shca, eq->eqe_cache[i].eqe->entry);
@@ -523,7 +535,6 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
 		if (!eqe)
 			break;
 		process_eqe(shca, eqe);
-		eqe_cnt++;
 	} while (1);
 
 unlock_irq_spinlock:
@@ -567,8 +578,7 @@ static void __queue_comp_task(struct ehca_cq *__cq,
 		list_add_tail(&__cq->entry, &cct->cq_list);
 		cct->cq_jobs++;
 		wake_up(&cct->wait_queue);
-	}
-	else
+	} else
 		__cq->nr_callbacks++;
 
 	spin_unlock(&__cq->task_lock);
@@ -577,18 +587,21 @@ static void __queue_comp_task(struct ehca_cq *__cq,
 
 static void queue_comp_task(struct ehca_cq *__cq)
 {
-	int cpu;
 	int cpu_id;
 	struct ehca_cpu_comp_task *cct;
+	int cq_jobs;
+	unsigned long flags;
 
-	cpu = get_cpu();
 	cpu_id = find_next_online_cpu(pool);
 	BUG_ON(!cpu_online(cpu_id));
 
 	cct = per_cpu_ptr(pool->cpu_comp_tasks, cpu_id);
 	BUG_ON(!cct);
 
-	if (cct->cq_jobs > 0) {
+	spin_lock_irqsave(&cct->task_lock, flags);
+	cq_jobs = cct->cq_jobs;
+	spin_unlock_irqrestore(&cct->task_lock, flags);
+	if (cq_jobs > 0) {
 		cpu_id = find_next_online_cpu(pool);
 		cct = per_cpu_ptr(pool->cpu_comp_tasks, cpu_id);
 		BUG_ON(!cct);
@@ -608,11 +621,17 @@ static void run_comp_task(struct ehca_cpu_comp_task* cct)
 		cq = list_entry(cct->cq_list.next, struct ehca_cq, entry);
 		spin_unlock_irqrestore(&cct->task_lock, flags);
 		comp_event_callback(cq);
-		spin_lock_irqsave(&cct->task_lock, flags);
 
+		spin_lock_irqsave(&ehca_cq_idr_lock, flags);
+		cq->nr_events--;
+		if (!cq->nr_events)
+			wake_up(&cq->wait_completion);
+		spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
+
+		spin_lock_irqsave(&cct->task_lock, flags);
 		spin_lock(&cq->task_lock);
 		cq->nr_callbacks--;
-		if (cq->nr_callbacks == 0) {
+		if (!cq->nr_callbacks) {
 			list_del_init(cct->cq_list.next);
 			cct->cq_jobs--;
 		}
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index c183512..059da96 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -52,7 +52,7 @@
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
 MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
-MODULE_VERSION("SVNEHCA_0021");
+MODULE_VERSION("SVNEHCA_0022");
 
 int ehca_open_aqp1     = 0;
 int ehca_debug_level   = 0;
@@ -810,7 +810,7 @@ int __init ehca_module_init(void)
 	int ret;
 
 	printk(KERN_INFO "eHCA Infiniband Device Driver "
-	       "(Rel.: SVNEHCA_0021)\n");
+	       "(Rel.: SVNEHCA_0022)\n");
 	idr_init(&ehca_qp_idr);
 	idr_init(&ehca_cq_idr);
 	spin_lock_init(&ehca_qp_idr_lock);
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index 71dc84b..1c6b63a 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -1088,21 +1088,21 @@ static void mthca_unmap_memfree(struct mthca_dev *dev,
 static int mthca_alloc_memfree(struct mthca_dev *dev,
 			       struct mthca_qp *qp)
 {
-	int ret = 0;
-
 	if (mthca_is_memfree(dev)) {
 		qp->rq.db_index = mthca_alloc_db(dev, MTHCA_DB_TYPE_RQ,
 						 qp->qpn, &qp->rq.db);
 		if (qp->rq.db_index < 0)
-			return ret;
+			return -ENOMEM;
 
 		qp->sq.db_index = mthca_alloc_db(dev, MTHCA_DB_TYPE_SQ,
 						 qp->qpn, &qp->sq.db);
-		if (qp->sq.db_index < 0)
+		if (qp->sq.db_index < 0) {
 			mthca_free_db(dev, MTHCA_DB_TYPE_RQ, qp->rq.db_index);
+			return -ENOMEM;
+		}
 	}
 
-	return ret;
+	return 0;
 }
 
 static void mthca_free_memfree(struct mthca_dev *dev,
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index bb2e3d5..56c87a8 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -407,6 +407,10 @@ static int ipoib_mcast_join_complete(int status,
 			queue_delayed_work(ipoib_workqueue,
 					   &priv->mcast_task, 0);
 		mutex_unlock(&mcast_mutex);
+
+		if (mcast == priv->broadcast)
+			netif_carrier_on(dev);
+
 		return 0;
 	}
 
@@ -594,7 +598,6 @@ void ipoib_mcast_join_task(struct work_struct *work)
 	ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n");
 
 	clear_bit(IPOIB_MCAST_RUN, &priv->flags);
-	netif_carrier_on(dev);
 }
 
 int ipoib_mcast_start_thread(struct net_device *dev)
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
index 3cb551b..7f3ec20 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
@@ -259,12 +259,13 @@ void ipoib_event(struct ib_event_handler *handler,
 	struct ipoib_dev_priv *priv =
 		container_of(handler, struct ipoib_dev_priv, event_handler);
 
-	if (record->event == IB_EVENT_PORT_ERR    ||
-	    record->event == IB_EVENT_PKEY_CHANGE ||
-	    record->event == IB_EVENT_PORT_ACTIVE ||
-	    record->event == IB_EVENT_LID_CHANGE  ||
-	    record->event == IB_EVENT_SM_CHANGE   ||
-	    record->event == IB_EVENT_CLIENT_REREGISTER) {
+	if ((record->event == IB_EVENT_PORT_ERR    ||
+	     record->event == IB_EVENT_PKEY_CHANGE ||
+	     record->event == IB_EVENT_PORT_ACTIVE ||
+	     record->event == IB_EVENT_LID_CHANGE  ||
+	     record->event == IB_EVENT_SM_CHANGE   ||
+	     record->event == IB_EVENT_CLIENT_REREGISTER) &&
+	    record->element.port_num == priv->port) {
 		ipoib_dbg(priv, "Port state change event\n");
 		queue_work(ipoib_workqueue, &priv->flush_task);
 	}

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

* [GIT PULL] please pull infiniband.git
@ 2007-02-26 21:05 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-02-26 21:05 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will get various post-rc1 cleanups and fixes:

Adrian Bunk (2):
      IB/mthca: Make 2 functions static
      RDMA/cxgb3: cleanups

Michael S. Tsirkin (1):
      IPoIB/cm: Improve small message bandwidth

Roland Dreier (3):
      IPoIB: Remove unused local_rate tracking
      IB/uverbs: Return correct error for invalid PD in register MR
      IPoIB: Correct debugging output when path record lookup fails

Sean Hefty (4):
      IB/core: Set hop limit in ib_init_ah_from_wc correctly
      RDMA/cma: Request reversible paths only
      IB/cm: Remove ca_guid from cm_device structure
      RDMA/cma: Remove unused node_guid from cma_device structure

Steve Wise (1):
      RDMA/cxgb3: Stop the EP Timer on BAD CLOSE

 drivers/infiniband/core/cm.c                   |   10 ++---
 drivers/infiniband/core/cma.c                  |    6 ++--
 drivers/infiniband/core/uverbs_cmd.c           |    4 ++-
 drivers/infiniband/core/verbs.c                |    2 +-
 drivers/infiniband/hw/cxgb3/Makefile           |    1 -
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |   31 +++++-----------
 drivers/infiniband/hw/cxgb3/cxio_hal.h         |    5 ---
 drivers/infiniband/hw/cxgb3/cxio_resource.c    |   14 +------
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |    6 ++--
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |    2 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.h    |    1 -
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |   29 +++++++--------
 drivers/infiniband/hw/mthca/mthca_mr.c         |   10 +++--
 drivers/infiniband/ulp/ipoib/ipoib.h           |    1 -
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |   46 ++++++++++++++----------
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    8 ++---
 17 files changed, 76 insertions(+), 102 deletions(-)


diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index d446998..842cd0b 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -88,7 +88,6 @@ struct cm_port {
 struct cm_device {
 	struct list_head list;
 	struct ib_device *device;
-	__be64 ca_guid;
 	struct cm_port port[0];
 };
 
@@ -739,8 +738,8 @@ retest:
 		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
 		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
 		ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT,
-			       &cm_id_priv->av.port->cm_dev->ca_guid,
-			       sizeof cm_id_priv->av.port->cm_dev->ca_guid,
+			       &cm_id_priv->id.device->node_guid,
+			       sizeof cm_id_priv->id.device->node_guid,
 			       NULL, 0);
 		break;
 	case IB_CM_REQ_RCVD:
@@ -883,7 +882,7 @@ static void cm_format_req(struct cm_req_msg *req_msg,
 
 	req_msg->local_comm_id = cm_id_priv->id.local_id;
 	req_msg->service_id = param->service_id;
-	req_msg->local_ca_guid = cm_id_priv->av.port->cm_dev->ca_guid;
+	req_msg->local_ca_guid = cm_id_priv->id.device->node_guid;
 	cm_req_set_local_qpn(req_msg, cpu_to_be32(param->qp_num));
 	cm_req_set_resp_res(req_msg, param->responder_resources);
 	cm_req_set_init_depth(req_msg, param->initiator_depth);
@@ -1442,7 +1441,7 @@ static void cm_format_rep(struct cm_rep_msg *rep_msg,
 	cm_rep_set_flow_ctrl(rep_msg, param->flow_control);
 	cm_rep_set_rnr_retry_count(rep_msg, param->rnr_retry_count);
 	cm_rep_set_srq(rep_msg, param->srq);
-	rep_msg->local_ca_guid = cm_id_priv->av.port->cm_dev->ca_guid;
+	rep_msg->local_ca_guid = cm_id_priv->id.device->node_guid;
 
 	if (param->private_data && param->private_data_len)
 		memcpy(rep_msg->private_data, param->private_data,
@@ -3385,7 +3384,6 @@ static void cm_add_one(struct ib_device *device)
 		return;
 
 	cm_dev->device = device;
-	cm_dev->ca_guid = device->node_guid;
 
 	set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask);
 	for (i = 1; i <= device->phys_port_cnt; i++) {
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index f8d69b3..d441815 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -77,7 +77,6 @@ static int next_port;
 struct cma_device {
 	struct list_head	list;
 	struct ib_device	*device;
-	__be64			node_guid;
 	struct completion	comp;
 	atomic_t		refcount;
 	struct list_head	id_list;
@@ -1492,11 +1491,13 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
 	ib_addr_get_dgid(addr, &path_rec.dgid);
 	path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr));
 	path_rec.numb_path = 1;
+	path_rec.reversible = 1;
 
 	id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device,
 				id_priv->id.port_num, &path_rec,
 				IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID |
-				IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH,
+				IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH |
+				IB_SA_PATH_REC_REVERSIBLE,
 				timeout_ms, GFP_KERNEL,
 				cma_query_handler, work, &id_priv->query);
 
@@ -2672,7 +2673,6 @@ static void cma_add_one(struct ib_device *device)
 		return;
 
 	cma_dev->device = device;
-	cma_dev->node_guid = device->node_guid;
 
 	init_completion(&cma_dev->comp);
 	atomic_set(&cma_dev->refcount, 1);
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index df1efbc..4fd75af 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -622,8 +622,10 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file,
 	obj->umem.virt_base = cmd.hca_va;
 
 	pd = idr_read_pd(cmd.pd_handle, file->ucontext);
-	if (!pd)
+	if (!pd) {
+		ret = -EINVAL;
 		goto err_release;
+	}
 
 	mr = pd->device->reg_user_mr(pd, &obj->umem, cmd.access_flags, &udata);
 	if (IS_ERR(mr)) {
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index 8b5dd36..ccdf93d 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -167,7 +167,7 @@ int ib_init_ah_from_wc(struct ib_device *device, u8 port_num, struct ib_wc *wc,
 		ah_attr->grh.sgid_index = (u8) gid_index;
 		flow_class = be32_to_cpu(grh->version_tclass_flow);
 		ah_attr->grh.flow_label = flow_class & 0xFFFFF;
-		ah_attr->grh.hop_limit = grh->hop_limit;
+		ah_attr->grh.hop_limit = 0xFF;
 		ah_attr->grh.traffic_class = (flow_class >> 20) & 0xFF;
 	}
 	return 0;
diff --git a/drivers/infiniband/hw/cxgb3/Makefile b/drivers/infiniband/hw/cxgb3/Makefile
index 0e110f3..36b9898 100644
--- a/drivers/infiniband/hw/cxgb3/Makefile
+++ b/drivers/infiniband/hw/cxgb3/Makefile
@@ -8,5 +8,4 @@ iw_cxgb3-y :=  iwch_cm.o iwch_ev.o iwch_cq.o iwch_qp.o iwch_mem.o \
 
 ifdef CONFIG_INFINIBAND_CXGB3_DEBUG
 EXTRA_CFLAGS += -DDEBUG
-iw_cxgb3-y += cxio_dbg.o
 endif
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
index 114ac3b..d737c73 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c
@@ -45,7 +45,7 @@
 static LIST_HEAD(rdev_list);
 static cxio_hal_ev_callback_func_t cxio_ev_cb = NULL;
 
-static inline struct cxio_rdev *cxio_hal_find_rdev_by_name(char *dev_name)
+static struct cxio_rdev *cxio_hal_find_rdev_by_name(char *dev_name)
 {
 	struct cxio_rdev *rdev;
 
@@ -55,8 +55,7 @@ static inline struct cxio_rdev *cxio_hal_find_rdev_by_name(char *dev_name)
 	return NULL;
 }
 
-static inline struct cxio_rdev *cxio_hal_find_rdev_by_t3cdev(struct t3cdev
-							     *tdev)
+static struct cxio_rdev *cxio_hal_find_rdev_by_t3cdev(struct t3cdev *tdev)
 {
 	struct cxio_rdev *rdev;
 
@@ -118,7 +117,7 @@ int cxio_hal_cq_op(struct cxio_rdev *rdev_p, struct t3_cq *cq,
 	return 0;
 }
 
-static inline int cxio_hal_clear_cq_ctx(struct cxio_rdev *rdev_p, u32 cqid)
+static int cxio_hal_clear_cq_ctx(struct cxio_rdev *rdev_p, u32 cqid)
 {
 	struct rdma_cq_setup setup;
 	setup.id = cqid;
@@ -130,7 +129,7 @@ static inline int cxio_hal_clear_cq_ctx(struct cxio_rdev *rdev_p, u32 cqid)
 	return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup));
 }
 
-int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev_p, u32 qpid)
+static int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev_p, u32 qpid)
 {
 	u64 sge_cmd;
 	struct t3_modify_qp_wr *wqe;
@@ -425,7 +424,7 @@ void cxio_flush_hw_cq(struct t3_cq *cq)
 	}
 }
 
-static inline int cqe_completes_wr(struct t3_cqe *cqe, struct t3_wq *wq)
+static int cqe_completes_wr(struct t3_cqe *cqe, struct t3_wq *wq)
 {
 	if (CQE_OPCODE(*cqe) == T3_TERMINATE)
 		return 0;
@@ -760,17 +759,6 @@ ret:
 	return err;
 }
 
-/* IN : stag key, pdid, pbl_size
- * Out: stag index, actaul pbl_size, and pbl_addr allocated.
- */
-int cxio_allocate_stag(struct cxio_rdev *rdev_p, u32 * stag, u32 pdid,
-		       enum tpt_mem_perm perm, u32 * pbl_size, u32 * pbl_addr)
-{
-	*stag = T3_STAG_UNSET;
-	return (__cxio_tpt_op(rdev_p, 0, stag, 0, pdid, TPT_NON_SHARED_MR,
-			      perm, 0, 0ULL, 0, 0, NULL, pbl_size, pbl_addr));
-}
-
 int cxio_register_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid,
 			   enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len,
 			   u8 page_size, __be64 *pbl, u32 *pbl_size,
@@ -1029,7 +1017,7 @@ void __exit cxio_hal_exit(void)
 	cxio_hal_destroy_rhdl_resource();
 }
 
-static inline void flush_completed_wrs(struct t3_wq *wq, struct t3_cq *cq)
+static void flush_completed_wrs(struct t3_wq *wq, struct t3_cq *cq)
 {
 	struct t3_swsq *sqp;
 	__u32 ptr = wq->sq_rptr;
@@ -1058,9 +1046,8 @@ static inline void flush_completed_wrs(struct t3_wq *wq, struct t3_cq *cq)
 			break;
 }
 
-static inline void create_read_req_cqe(struct t3_wq *wq,
-				       struct t3_cqe *hw_cqe,
-				       struct t3_cqe *read_cqe)
+static void create_read_req_cqe(struct t3_wq *wq, struct t3_cqe *hw_cqe,
+				struct t3_cqe *read_cqe)
 {
 	read_cqe->u.scqe.wrid_hi = wq->oldest_read->sq_wptr;
 	read_cqe->len = wq->oldest_read->read_len;
@@ -1073,7 +1060,7 @@ static inline void create_read_req_cqe(struct t3_wq *wq,
 /*
  * Return a ptr to the next read wr in the SWSQ or NULL.
  */
-static inline void advance_oldest_read(struct t3_wq *wq)
+static void advance_oldest_read(struct t3_wq *wq)
 {
 
 	u32 rptr = wq->oldest_read - wq->sq + 1;
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h
index 8ab04a7..99543d6 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_hal.h
+++ b/drivers/infiniband/hw/cxgb3/cxio_hal.h
@@ -143,7 +143,6 @@ int cxio_rdev_open(struct cxio_rdev *rdev);
 void cxio_rdev_close(struct cxio_rdev *rdev);
 int cxio_hal_cq_op(struct cxio_rdev *rdev, struct t3_cq *cq,
 		   enum t3_cq_opcode op, u32 credit);
-int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev, u32 qpid);
 int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
 int cxio_destroy_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
 int cxio_resize_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
@@ -154,8 +153,6 @@ int cxio_create_qp(struct cxio_rdev *rdev, u32 kernel_domain, struct t3_wq *wq,
 int cxio_destroy_qp(struct cxio_rdev *rdev, struct t3_wq *wq,
 		    struct cxio_ucontext *uctx);
 int cxio_peek_cq(struct t3_wq *wr, struct t3_cq *cq, int opcode);
-int cxio_allocate_stag(struct cxio_rdev *rdev, u32 * stag, u32 pdid,
-		       enum tpt_mem_perm perm, u32 * pbl_size, u32 * pbl_addr);
 int cxio_register_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid,
 			   enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len,
 			   u8 page_size, __be64 *pbl, u32 *pbl_size,
@@ -171,8 +168,6 @@ int cxio_deallocate_window(struct cxio_rdev *rdev, u32 stag);
 int cxio_rdma_init(struct cxio_rdev *rdev, struct t3_rdma_init_attr *attr);
 void cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb);
 void cxio_unregister_ev_cb(cxio_hal_ev_callback_func_t ev_cb);
-u32 cxio_hal_get_rhdl(void);
-void cxio_hal_put_rhdl(u32 rhdl);
 u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp);
 void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid);
 int __init cxio_hal_init(void);
diff --git a/drivers/infiniband/hw/cxgb3/cxio_resource.c b/drivers/infiniband/hw/cxgb3/cxio_resource.c
index 65bf577..d3095ae 100644
--- a/drivers/infiniband/hw/cxgb3/cxio_resource.c
+++ b/drivers/infiniband/hw/cxgb3/cxio_resource.c
@@ -179,7 +179,7 @@ tpt_err:
 /*
  * returns 0 if no resource available
  */
-static inline u32 cxio_hal_get_resource(struct kfifo *fifo)
+static u32 cxio_hal_get_resource(struct kfifo *fifo)
 {
 	u32 entry;
 	if (kfifo_get(fifo, (unsigned char *) &entry, sizeof(u32)))
@@ -188,21 +188,11 @@ static inline u32 cxio_hal_get_resource(struct kfifo *fifo)
 		return 0;	/* fifo emptry */
 }
 
-static inline void cxio_hal_put_resource(struct kfifo *fifo, u32 entry)
+static void cxio_hal_put_resource(struct kfifo *fifo, u32 entry)
 {
 	BUG_ON(kfifo_put(fifo, (unsigned char *) &entry, sizeof(u32)) == 0);
 }
 
-u32 cxio_hal_get_rhdl(void)
-{
-	return cxio_hal_get_resource(rhdl_fifo);
-}
-
-void cxio_hal_put_rhdl(u32 rhdl)
-{
-	cxio_hal_put_resource(rhdl_fifo, rhdl);
-}
-
 u32 cxio_hal_get_stag(struct cxio_hal_resource *rscp)
 {
 	return cxio_hal_get_resource(rscp->tpt_fifo);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index e5442e3..b21fde8 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -209,8 +209,7 @@ static enum iwch_ep_state state_read(struct iwch_ep_common *epc)
 	return state;
 }
 
-static inline void __state_set(struct iwch_ep_common *epc,
-			       enum iwch_ep_state new)
+static void __state_set(struct iwch_ep_common *epc, enum iwch_ep_state new)
 {
 	epc->state = new;
 }
@@ -1459,7 +1458,7 @@ static int peer_close(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 /*
  * Returns whether an ABORT_REQ_RSS message is a negative advice.
  */
-static inline int is_neg_adv_abort(unsigned int status)
+static int is_neg_adv_abort(unsigned int status)
 {
 	return status == CPL_ERR_RTX_NEG_ADVICE ||
 	       status == CPL_ERR_PERSIST_NEG_ADVICE;
@@ -1635,6 +1634,7 @@ static int ec_status(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 
 		printk(KERN_ERR MOD "%s BAD CLOSE - Aborting tid %u\n",
 		       __FUNCTION__, ep->hwtid);
+		stop_ep_timer(ep);
 		attrs.next_state = IWCH_QP_STATE_ERROR;
 		iwch_modify_qp(ep->com.qp->rhp,
 			       ep->com.qp, IWCH_QP_ATTR_NEXT_STATE,
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index 2aef122..9947a14 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -948,7 +948,7 @@ void iwch_qp_rem_ref(struct ib_qp *qp)
 	        wake_up(&(to_iwch_qp(qp)->wait));
 }
 
-struct ib_qp *iwch_get_qp(struct ib_device *dev, int qpn)
+static struct ib_qp *iwch_get_qp(struct ib_device *dev, int qpn)
 {
 	PDBG("%s ib_dev %p qpn 0x%x\n", __FUNCTION__, dev, qpn);
 	return (struct ib_qp *)get_qhp(to_iwch_dev(dev), qpn);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h
index 2af3e93..de0fe1b 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.h
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.h
@@ -178,7 +178,6 @@ static inline struct iwch_qp *to_iwch_qp(struct ib_qp *ibqp)
 
 void iwch_qp_add_ref(struct ib_qp *qp);
 void iwch_qp_rem_ref(struct ib_qp *qp);
-struct ib_qp *iwch_get_qp(struct ib_device *dev, int qpn);
 
 struct iwch_ucontext {
 	struct ib_ucontext ibucontext;
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 4dda2f6..9ea00cc 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -36,8 +36,8 @@
 
 #define NO_SUPPORT -1
 
-static inline int iwch_build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr,
-				       u8 * flit_cnt)
+static int iwch_build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr,
+				u8 * flit_cnt)
 {
 	int i;
 	u32 plen;
@@ -96,8 +96,8 @@ static inline int iwch_build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr,
 	return 0;
 }
 
-static inline int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr,
-					u8 *flit_cnt)
+static int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr,
+				 u8 *flit_cnt)
 {
 	int i;
 	u32 plen;
@@ -137,8 +137,8 @@ static inline int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr,
 	return 0;
 }
 
-static inline int iwch_build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr,
-				       u8 *flit_cnt)
+static int iwch_build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr,
+				u8 *flit_cnt)
 {
 	if (wr->num_sge > 1)
 		return -EINVAL;
@@ -158,9 +158,8 @@ static inline int iwch_build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr,
 /*
  * TBD: this is going to be moved to firmware. Missing pdid/qpid check for now.
  */
-static inline int iwch_sgl2pbl_map(struct iwch_dev *rhp,
-				   struct ib_sge *sg_list, u32 num_sgle,
-				   u32 * pbl_addr, u8 * page_size)
+static int iwch_sgl2pbl_map(struct iwch_dev *rhp, struct ib_sge *sg_list,
+			    u32 num_sgle, u32 * pbl_addr, u8 * page_size)
 {
 	int i;
 	struct iwch_mr *mhp;
@@ -206,9 +205,8 @@ static inline int iwch_sgl2pbl_map(struct iwch_dev *rhp,
 	return 0;
 }
 
-static inline int iwch_build_rdma_recv(struct iwch_dev *rhp,
-						    union t3_wr *wqe,
-						    struct ib_recv_wr *wr)
+static int iwch_build_rdma_recv(struct iwch_dev *rhp, union t3_wr *wqe,
+				struct ib_recv_wr *wr)
 {
 	int i, err = 0;
 	u32 pbl_addr[4];
@@ -473,8 +471,7 @@ int iwch_bind_mw(struct ib_qp *qp,
 	return err;
 }
 
-static inline void build_term_codes(int t3err, u8 *layer_type, u8 *ecode,
-				    int tagged)
+static void build_term_codes(int t3err, u8 *layer_type, u8 *ecode, int tagged)
 {
 	switch (t3err) {
 	case TPT_ERR_STAG:
@@ -672,7 +669,7 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag)
 	spin_lock_irqsave(&qhp->lock, *flag);
 }
 
-static inline void flush_qp(struct iwch_qp *qhp, unsigned long *flag)
+static void flush_qp(struct iwch_qp *qhp, unsigned long *flag)
 {
 	if (t3b_device(qhp->rhp))
 		cxio_set_wq_in_error(&qhp->wq);
@@ -684,7 +681,7 @@ static inline void flush_qp(struct iwch_qp *qhp, unsigned long *flag)
 /*
  * Return non zero if at least one RECV was pre-posted.
  */
-static inline int rqes_posted(struct iwch_qp *qhp)
+static int rqes_posted(struct iwch_qp *qhp)
 {
 	return fw_riwrh_opcode((struct fw_riwrh *)qhp->wq.queue) == T3_WR_RCV;
 }
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index 6037dd3..8e4846b 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -310,8 +310,9 @@ int mthca_write_mtt_size(struct mthca_dev *dev)
 	return mthca_is_memfree(dev) ? (PAGE_SIZE / sizeof (u64)) : 0x7ffffff;
 }
 
-void mthca_tavor_write_mtt_seg(struct mthca_dev *dev, struct mthca_mtt *mtt,
-			      int start_index, u64 *buffer_list, int list_len)
+static void mthca_tavor_write_mtt_seg(struct mthca_dev *dev,
+				      struct mthca_mtt *mtt, int start_index,
+				      u64 *buffer_list, int list_len)
 {
 	u64 __iomem *mtts;
 	int i;
@@ -323,8 +324,9 @@ void mthca_tavor_write_mtt_seg(struct mthca_dev *dev, struct mthca_mtt *mtt,
 				  mtts + i);
 }
 
-void mthca_arbel_write_mtt_seg(struct mthca_dev *dev, struct mthca_mtt *mtt,
-			      int start_index, u64 *buffer_list, int list_len)
+static void mthca_arbel_write_mtt_seg(struct mthca_dev *dev,
+				      struct mthca_mtt *mtt, int start_index,
+				      u64 *buffer_list, int list_len)
 {
 	__be64 *mtts;
 	dma_addr_t dma_handle;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 2594db2..fd55826 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -219,7 +219,6 @@ struct ipoib_dev_priv {
 
 	union ib_gid local_gid;
 	u16          local_lid;
-	u8           local_rate;
 
 	unsigned int admin_mtu;
 	unsigned int mcast_mtu;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 4d59682..3484e8b 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -65,14 +65,14 @@ struct ipoib_cm_id {
 static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
 			       struct ib_cm_event *event);
 
-static void ipoib_cm_dma_unmap_rx(struct ipoib_dev_priv *priv,
+static void ipoib_cm_dma_unmap_rx(struct ipoib_dev_priv *priv, int frags,
 				  u64 mapping[IPOIB_CM_RX_SG])
 {
 	int i;
 
 	ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);
 
-	for (i = 0; i < IPOIB_CM_RX_SG - 1; ++i)
+	for (i = 0; i < frags; ++i)
 		ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
 }
 
@@ -90,7 +90,8 @@ static int ipoib_cm_post_receive(struct net_device *dev, int id)
 	ret = ib_post_srq_recv(priv->cm.srq, &priv->cm.rx_wr, &bad_wr);
 	if (unlikely(ret)) {
 		ipoib_warn(priv, "post srq failed for buf %d (%d)\n", id, ret);
-		ipoib_cm_dma_unmap_rx(priv, priv->cm.srq_ring[id].mapping);
+		ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,
+				      priv->cm.srq_ring[id].mapping);
 		dev_kfree_skb_any(priv->cm.srq_ring[id].skb);
 		priv->cm.srq_ring[id].skb = NULL;
 	}
@@ -98,8 +99,8 @@ static int ipoib_cm_post_receive(struct net_device *dev, int id)
 	return ret;
 }
 
-static int ipoib_cm_alloc_rx_skb(struct net_device *dev, int id,
-				 u64 mapping[IPOIB_CM_RX_SG])
+static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev, int id, int frags,
+					     u64 mapping[IPOIB_CM_RX_SG])
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	struct sk_buff *skb;
@@ -107,7 +108,7 @@ static int ipoib_cm_alloc_rx_skb(struct net_device *dev, int id,
 
 	skb = dev_alloc_skb(IPOIB_CM_HEAD_SIZE + 12);
 	if (unlikely(!skb))
-		return -ENOMEM;
+		return NULL;
 
 	/*
 	 * IPoIB adds a 4 byte header. So we need 12 more bytes to align the
@@ -119,10 +120,10 @@ static int ipoib_cm_alloc_rx_skb(struct net_device *dev, int id,
 				       DMA_FROM_DEVICE);
 	if (unlikely(ib_dma_mapping_error(priv->ca, mapping[0]))) {
 		dev_kfree_skb_any(skb);
-		return -EIO;
+		return NULL;
 	}
 
-	for (i = 0; i < IPOIB_CM_RX_SG - 1; i++) {
+	for (i = 0; i < frags; i++) {
 		struct page *page = alloc_page(GFP_ATOMIC);
 
 		if (!page)
@@ -136,7 +137,7 @@ static int ipoib_cm_alloc_rx_skb(struct net_device *dev, int id,
 	}
 
 	priv->cm.srq_ring[id].skb = skb;
-	return 0;
+	return skb;
 
 partial_error:
 
@@ -146,7 +147,7 @@ partial_error:
 		ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
 
 	dev_kfree_skb_any(skb);
-	return -ENOMEM;
+	return NULL;
 }
 
 static struct ib_qp *ipoib_cm_create_rx_qp(struct net_device *dev,
@@ -309,7 +310,7 @@ static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id,
 }
 /* Adjust length of skb with fragments to match received data */
 static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
-			  unsigned int length)
+			  unsigned int length, struct sk_buff *toskb)
 {
 	int i, num_frags;
 	unsigned int size;
@@ -326,7 +327,7 @@ static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
 
 		if (length == 0) {
 			/* don't need this page */
-			__free_page(frag->page);
+			skb_fill_page_desc(toskb, i, frag->page, 0, PAGE_SIZE);
 			--skb_shinfo(skb)->nr_frags;
 		} else {
 			size = min(length, (unsigned) PAGE_SIZE);
@@ -344,10 +345,11 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
 {
 	struct ipoib_dev_priv *priv = netdev_priv(dev);
 	unsigned int wr_id = wc->wr_id & ~IPOIB_CM_OP_SRQ;
-	struct sk_buff *skb;
+	struct sk_buff *skb, *newskb;
 	struct ipoib_cm_rx *p;
 	unsigned long flags;
 	u64 mapping[IPOIB_CM_RX_SG];
+	int frags;
 
 	ipoib_dbg_data(priv, "cm recv completion: id %d, op %d, status: %d\n",
 		       wr_id, wc->opcode, wc->status);
@@ -383,7 +385,11 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
 		}
 	}
 
-	if (unlikely(ipoib_cm_alloc_rx_skb(dev, wr_id, mapping))) {
+	frags = PAGE_ALIGN(wc->byte_len - min(wc->byte_len,
+					      (unsigned)IPOIB_CM_HEAD_SIZE)) / PAGE_SIZE;
+
+	newskb = ipoib_cm_alloc_rx_skb(dev, wr_id, frags, mapping);
+	if (unlikely(!newskb)) {
 		/*
 		 * If we can't allocate a new RX buffer, dump
 		 * this packet and reuse the old buffer.
@@ -393,13 +399,13 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
 		goto repost;
 	}
 
-	ipoib_cm_dma_unmap_rx(priv, priv->cm.srq_ring[wr_id].mapping);
-	memcpy(priv->cm.srq_ring[wr_id].mapping, mapping, sizeof mapping);
+	ipoib_cm_dma_unmap_rx(priv, frags, priv->cm.srq_ring[wr_id].mapping);
+	memcpy(priv->cm.srq_ring[wr_id].mapping, mapping, (frags + 1) * sizeof *mapping);
 
 	ipoib_dbg_data(priv, "received %d bytes, SLID 0x%04x\n",
 		       wc->byte_len, wc->slid);
 
-	skb_put_frags(skb, IPOIB_CM_HEAD_SIZE, wc->byte_len);
+	skb_put_frags(skb, IPOIB_CM_HEAD_SIZE, wc->byte_len, newskb);
 
 	skb->protocol = ((struct ipoib_header *) skb->data)->proto;
 	skb->mac.raw = skb->data;
@@ -1193,7 +1199,8 @@ int ipoib_cm_dev_init(struct net_device *dev)
 	priv->cm.rx_wr.num_sge = IPOIB_CM_RX_SG;
 
 	for (i = 0; i < ipoib_recvq_size; ++i) {
-		if (ipoib_cm_alloc_rx_skb(dev, i, priv->cm.srq_ring[i].mapping)) {
+		if (!ipoib_cm_alloc_rx_skb(dev, i, IPOIB_CM_RX_SG - 1,
+					   priv->cm.srq_ring[i].mapping)) {
 			ipoib_warn(priv, "failed to allocate receive buffer %d\n", i);
 			ipoib_cm_dev_cleanup(dev);
 			return -ENOMEM;
@@ -1228,7 +1235,8 @@ void ipoib_cm_dev_cleanup(struct net_device *dev)
 		return;
 	for (i = 0; i < ipoib_recvq_size; ++i)
 		if (priv->cm.srq_ring[i].skb) {
-			ipoib_cm_dma_unmap_rx(priv, priv->cm.srq_ring[i].mapping);
+			ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,
+					      priv->cm.srq_ring[i].mapping);
 			dev_kfree_skb_any(priv->cm.srq_ring[i].skb);
 			priv->cm.srq_ring[i].skb = NULL;
 		}
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 18d27fd..f9dbc6f 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -385,7 +385,7 @@ static void path_rec_completion(int status,
 	struct sk_buff *skb;
 	unsigned long flags;
 
-	if (pathrec)
+	if (!status)
 		ipoib_dbg(priv, "PathRec LID 0x%04x for GID " IPOIB_GID_FMT "\n",
 			  be16_to_cpu(pathrec->dlid), IPOIB_GID_ARG(pathrec->dgid));
 	else
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index b303ce6..bb2e3d5 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -527,11 +527,9 @@ void ipoib_mcast_join_task(struct work_struct *work)
 	{
 		struct ib_port_attr attr;
 
-		if (!ib_query_port(priv->ca, priv->port, &attr)) {
-			priv->local_lid  = attr.lid;
-			priv->local_rate = attr.active_speed *
-				ib_width_enum_to_int(attr.active_width);
-		} else
+		if (!ib_query_port(priv->ca, priv->port, &attr))
+			priv->local_lid = attr.lid;
+		else
 			ipoib_warn(priv, "ib_query_port failed\n");
 	}
 

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

* [GIT PULL] please pull infiniband.git
@ 2007-02-16 23:48 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-02-16 23:48 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This adds IB multicast tracking, to allow userspace to use multicast
groups in a sane way, an ehca interrupt handling fixup, and a few
other minor things.  I don't think there is anything major left, so we
should be good for 2.6.21-rc1 after this pull.

Dotan Barak (1):
      IB/mthca: Allow the QP state transition RESET->RESET

Hoang-Nam Nguyen (4):
      IB/ehca: Rework irq handler
      IB/ehca: Fix race condition/locking issues in scaling code
      IB/ehca: Allow en/disabling scaling code via module parameter
      IB/ehca: Change query_port() to return LINK_UP instead UNKNOWN

Michael S. Tsirkin (1):
      IPoIB: CM error handling thinko fix

Roland Dreier (5):
      IB/mthca: Fix allocation of ICM chunks in coherent memory
      IPoIB: Only allow root to change between datagram and connected mode
      IB/core: Fix sparse warnings about shadowed declarations
      IB/ipath: Make ipath_map_sg() static
      IB/core: Set static rate in ib_init_ah_from_path()

Sean Hefty (2):
      IB/sa: Track multicast join/leave requests
      RDMA/cma: Add multicast communication support

Steve Wise (3):
      RDMA/iwcm: iw_cm_id destruction race fixes
      RDMA/cxgb3: Fail posts synchronously when in TERMINATE state
      RDMA/cxgb3: Remove Open Grid Computing copyrights in iw_cxgb3 driver

 drivers/infiniband/core/Makefile               |    2 +-
 drivers/infiniband/core/cma.c                  |  359 +++++++++--
 drivers/infiniband/core/fmr_pool.c             |    4 +-
 drivers/infiniband/core/iwcm.c                 |   47 +-
 drivers/infiniband/core/multicast.c            |  837 ++++++++++++++++++++++++
 drivers/infiniband/core/sa.h                   |   66 ++
 drivers/infiniband/core/sa_query.c             |   30 +-
 drivers/infiniband/core/sysfs.c                |    2 -
 drivers/infiniband/core/ucma.c                 |  204 ++++++-
 drivers/infiniband/hw/cxgb3/cxio_dbg.c         |    1 -
 drivers/infiniband/hw/cxgb3/cxio_hal.c         |    1 -
 drivers/infiniband/hw/cxgb3/cxio_hal.h         |    1 -
 drivers/infiniband/hw/cxgb3/cxio_resource.c    |    1 -
 drivers/infiniband/hw/cxgb3/cxio_resource.h    |    1 -
 drivers/infiniband/hw/cxgb3/cxio_wr.h          |    1 -
 drivers/infiniband/hw/cxgb3/iwch.c             |    1 -
 drivers/infiniband/hw/cxgb3/iwch.h             |    1 -
 drivers/infiniband/hw/cxgb3/iwch_cm.c          |    1 -
 drivers/infiniband/hw/cxgb3/iwch_cm.h          |    1 -
 drivers/infiniband/hw/cxgb3/iwch_cq.c          |    1 -
 drivers/infiniband/hw/cxgb3/iwch_ev.c          |    1 -
 drivers/infiniband/hw/cxgb3/iwch_mem.c         |    1 -
 drivers/infiniband/hw/cxgb3/iwch_provider.c    |    1 -
 drivers/infiniband/hw/cxgb3/iwch_provider.h    |    1 -
 drivers/infiniband/hw/cxgb3/iwch_qp.c          |    3 +-
 drivers/infiniband/hw/cxgb3/iwch_user.h        |    1 -
 drivers/infiniband/hw/ehca/Kconfig             |    8 -
 drivers/infiniband/hw/ehca/ehca_classes.h      |   19 +-
 drivers/infiniband/hw/ehca/ehca_eq.c           |    1 +
 drivers/infiniband/hw/ehca/ehca_hca.c          |    3 +
 drivers/infiniband/hw/ehca/ehca_irq.c          |  307 +++++----
 drivers/infiniband/hw/ehca/ehca_irq.h          |    1 +
 drivers/infiniband/hw/ehca/ehca_main.c         |   32 +-
 drivers/infiniband/hw/ehca/ipz_pt_fn.h         |   11 +-
 drivers/infiniband/hw/ipath/ipath_dma.c        |    4 +-
 drivers/infiniband/hw/mthca/mthca_memfree.c    |    4 +-
 drivers/infiniband/hw/mthca/mthca_qp.c         |    5 +
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |  195 ++----
 include/rdma/ib_addr.h                         |    6 +
 include/rdma/ib_sa.h                           |  159 ++---
 include/rdma/rdma_cm.h                         |   21 +-
 include/rdma/rdma_cm_ib.h                      |    4 +-
 include/rdma/rdma_user_cm.h                    |   13 +-
 44 files changed, 1889 insertions(+), 478 deletions(-)
 create mode 100644 drivers/infiniband/core/multicast.c
 create mode 100644 drivers/infiniband/core/sa.h

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

* [GIT PULL] please pull infiniband.git
@ 2007-02-13  0:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-02-13  0:18 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will add the new cxgb3 RDMA driver for Chelsio T3 NICs, as well
as IPoIB connected mode and various other smaller changes:

Ahmed S. Darwish (1):
      IB/core: Use ARRAY_SIZE macro for mandatory_table

Akinobu Mita (1):
      IB/ehca: Fix memleak on module unloading

David Howells (1):
      IB/mthca: Work around gcc bug on sparc64

Michael S. Tsirkin (6):
      IPoIB: Connected mode experimental support
      IB/mthca: Fix reserved MTTs calculation on mem-free HCAs
      IB/mthca: Give reserved MTTs a separate cache line
      IB/mthca: Fix access to MTT and MPT tables on non-cache-coherent CPUs
      IB/mthca: Merge MR and FMR space on 64-bit systems
      IB/mthca: Always fill MTTs from CPU

Roland Dreier (1):
      IB/mthca: Use correct structure size in call to memset()

Sean Hefty (2):
      RDMA/cma: Increment port number after close to avoid re-use
      IB: Remove redundant "_wq" from workqueue names

Steve Wise (1):
      RDMA/cxgb3: Add driver for Chelsio T3 RNIC

 drivers/infiniband/Kconfig                     |    1 +
 drivers/infiniband/Makefile                    |    1 +
 drivers/infiniband/core/addr.c                 |    2 +-
 drivers/infiniband/core/cma.c                  |   68 +-
 drivers/infiniband/core/device.c               |    3 +-
 drivers/infiniband/hw/cxgb3/Kconfig            |   27 +
 drivers/infiniband/hw/cxgb3/Makefile           |   12 +
 drivers/infiniband/hw/cxgb3/cxio_dbg.c         |  207 +++
 drivers/infiniband/hw/cxgb3/cxio_hal.c         | 1280 +++++++++++++++
 drivers/infiniband/hw/cxgb3/cxio_hal.h         |  201 +++
 drivers/infiniband/hw/cxgb3/cxio_resource.c    |  331 ++++
 drivers/infiniband/hw/cxgb3/cxio_resource.h    |   70 +
 drivers/infiniband/hw/cxgb3/cxio_wr.h          |  685 ++++++++
 drivers/infiniband/hw/cxgb3/iwch.c             |  189 +++
 drivers/infiniband/hw/cxgb3/iwch.h             |  177 ++
 drivers/infiniband/hw/cxgb3/iwch_cm.c          | 2081 ++++++++++++++++++++++++
 drivers/infiniband/hw/cxgb3/iwch_cm.h          |  223 +++
 drivers/infiniband/hw/cxgb3/iwch_cq.c          |  225 +++
 drivers/infiniband/hw/cxgb3/iwch_ev.c          |  231 +++
 drivers/infiniband/hw/cxgb3/iwch_mem.c         |  172 ++
 drivers/infiniband/hw/cxgb3/iwch_provider.c    | 1203 ++++++++++++++
 drivers/infiniband/hw/cxgb3/iwch_provider.h    |  367 +++++
 drivers/infiniband/hw/cxgb3/iwch_qp.c          | 1007 ++++++++++++
 drivers/infiniband/hw/cxgb3/iwch_user.h        |   67 +
 drivers/infiniband/hw/cxgb3/tcb.h              |  632 +++++++
 drivers/infiniband/hw/ehca/ehca_irq.c          |    2 +
 drivers/infiniband/hw/mthca/mthca_cmd.c        |    6 +-
 drivers/infiniband/hw/mthca/mthca_dev.h        |    2 +
 drivers/infiniband/hw/mthca/mthca_main.c       |   40 +-
 drivers/infiniband/hw/mthca/mthca_memfree.c    |  127 ++-
 drivers/infiniband/hw/mthca/mthca_memfree.h    |    9 +-
 drivers/infiniband/hw/mthca/mthca_mr.c         |  110 ++-
 drivers/infiniband/hw/mthca/mthca_profile.c    |    2 +-
 drivers/infiniband/hw/mthca/mthca_provider.c   |   14 +-
 drivers/infiniband/hw/mthca/mthca_provider.h   |    1 +
 drivers/infiniband/hw/mthca/mthca_qp.c         |    2 +-
 drivers/infiniband/hw/mthca/mthca_srq.c        |    9 +-
 drivers/infiniband/ulp/ipoib/Kconfig           |   16 +-
 drivers/infiniband/ulp/ipoib/Makefile          |    1 +
 drivers/infiniband/ulp/ipoib/ipoib.h           |  215 +++
 drivers/infiniband/ulp/ipoib/ipoib_cm.c        | 1237 ++++++++++++++
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |   29 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   63 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |   40 +-
 drivers/infiniband/ulp/ipoib/ipoib_vlan.c      |    2 +
 46 files changed, 11279 insertions(+), 114 deletions(-)
 create mode 100644 drivers/infiniband/hw/cxgb3/Kconfig
 create mode 100644 drivers/infiniband/hw/cxgb3/Makefile
 create mode 100644 drivers/infiniband/hw/cxgb3/cxio_dbg.c
 create mode 100644 drivers/infiniband/hw/cxgb3/cxio_hal.c
 create mode 100644 drivers/infiniband/hw/cxgb3/cxio_hal.h
 create mode 100644 drivers/infiniband/hw/cxgb3/cxio_resource.c
 create mode 100644 drivers/infiniband/hw/cxgb3/cxio_resource.h
 create mode 100644 drivers/infiniband/hw/cxgb3/cxio_wr.h
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch.h
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_cm.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_cm.h
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_cq.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_ev.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_mem.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_provider.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_provider.h
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_qp.c
 create mode 100644 drivers/infiniband/hw/cxgb3/iwch_user.h
 create mode 100644 drivers/infiniband/hw/cxgb3/tcb.h
 create mode 100644 drivers/infiniband/ulp/ipoib/ipoib_cm.c

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

* [GIT PULL] please pull infiniband.git
@ 2007-02-05 10:15 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-02-05 10:15 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This is my first merge for 2.6.21:

Hoang-Nam Nguyen (2):
      IB/ehca: Remove use of do_mmap()
      IB/ehca: Remove obsolete prototypes

Ishai Rabinovitz (1):
      IB/srp: Don't wait for response when QP is in error state.

Jason Gunthorpe (1):
      IB: Make sure struct ib_user_mad.data is aligned

Michael S. Tsirkin (2):
      IB: Include <linux/kref.h> explicitly in <rdma/ib_verbs.h>
      IB: Return qp pointer as part of ib_wc

Steve Wise (1):
      RDMA/addr: Handle ethernet neighbour updates during route resolution

 drivers/infiniband/core/addr.c            |    3 +-
 drivers/infiniband/core/mad.c             |   11 +-
 drivers/infiniband/core/uverbs_cmd.c      |    2 +-
 drivers/infiniband/hw/amso1100/c2_cq.c    |    2 +-
 drivers/infiniband/hw/ehca/ehca_classes.h |   29 +--
 drivers/infiniband/hw/ehca/ehca_cq.c      |   65 ++----
 drivers/infiniband/hw/ehca/ehca_iverbs.h  |    8 -
 drivers/infiniband/hw/ehca/ehca_main.c    |    6 +-
 drivers/infiniband/hw/ehca/ehca_qp.c      |   78 +-----
 drivers/infiniband/hw/ehca/ehca_reqs.c    |    2 +-
 drivers/infiniband/hw/ehca/ehca_uverbs.c  |  395 ++++++++++++-----------------
 drivers/infiniband/hw/ipath/ipath_qp.c    |    2 +-
 drivers/infiniband/hw/ipath/ipath_rc.c    |    8 +-
 drivers/infiniband/hw/ipath/ipath_ruc.c   |    8 +-
 drivers/infiniband/hw/ipath/ipath_uc.c    |    4 +-
 drivers/infiniband/hw/ipath/ipath_ud.c    |    8 +-
 drivers/infiniband/hw/mthca/mthca_cmd.c   |    2 +-
 drivers/infiniband/hw/mthca/mthca_cq.c    |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c       |    7 +
 drivers/infiniband/ulp/srp/ib_srp.h       |    1 +
 include/rdma/ib_user_mad.h                |    2 +-
 include/rdma/ib_verbs.h                   |    3 +-
 22 files changed, 243 insertions(+), 405 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2007-01-23 15:10 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-01-23 15:10 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will pick up three small fixes:

Hoang-Nam Nguyen (2):
      IB/ehca: Fix improper use of yield() with spinlock held
      IB/ehca: Fix mismatched spin_unlock in irq handler

Ishai Rabinovitz (1):
      IB/srp: Check match_strdup() return

 drivers/infiniband/hw/ehca/ehca_cq.c  |    5 ++++-
 drivers/infiniband/hw/ehca/ehca_irq.c |    3 ++-
 drivers/infiniband/ulp/srp/ib_srp.c   |   20 ++++++++++++++++++++
 3 files changed, 26 insertions(+), 2 deletions(-)


diff --git a/drivers/infiniband/hw/ehca/ehca_cq.c b/drivers/infiniband/hw/ehca/ehca_cq.c
index 93995b6..6074c89 100644
--- a/drivers/infiniband/hw/ehca/ehca_cq.c
+++ b/drivers/infiniband/hw/ehca/ehca_cq.c
@@ -344,8 +344,11 @@ int ehca_destroy_cq(struct ib_cq *cq)
 	unsigned long flags;
 
 	spin_lock_irqsave(&ehca_cq_idr_lock, flags);
-	while (my_cq->nr_callbacks)
+	while (my_cq->nr_callbacks) {
+		spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
 		yield();
+		spin_lock_irqsave(&ehca_cq_idr_lock, flags);
+	}
 
 	idr_remove(&ehca_cq_idr, my_cq->token);
 	spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index e7209af..c069be8 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -440,7 +440,8 @@ void ehca_tasklet_eq(unsigned long data)
 					cq = idr_find(&ehca_cq_idr, token);
 
 					if (cq == NULL) {
-						spin_unlock(&ehca_cq_idr_lock);
+						spin_unlock_irqrestore(&ehca_cq_idr_lock,
+								       flags);
 						break;
 					}
 
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index cdecbf5..72611fd 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -1621,18 +1621,30 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
 		switch (token) {
 		case SRP_OPT_ID_EXT:
 			p = match_strdup(args);
+			if (!p) {
+				ret = -ENOMEM;
+				goto out;
+			}
 			target->id_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
 			kfree(p);
 			break;
 
 		case SRP_OPT_IOC_GUID:
 			p = match_strdup(args);
+			if (!p) {
+				ret = -ENOMEM;
+				goto out;
+			}
 			target->ioc_guid = cpu_to_be64(simple_strtoull(p, NULL, 16));
 			kfree(p);
 			break;
 
 		case SRP_OPT_DGID:
 			p = match_strdup(args);
+			if (!p) {
+				ret = -ENOMEM;
+				goto out;
+			}
 			if (strlen(p) != 32) {
 				printk(KERN_WARNING PFX "bad dest GID parameter '%s'\n", p);
 				kfree(p);
@@ -1656,6 +1668,10 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
 
 		case SRP_OPT_SERVICE_ID:
 			p = match_strdup(args);
+			if (!p) {
+				ret = -ENOMEM;
+				goto out;
+			}
 			target->service_id = cpu_to_be64(simple_strtoull(p, NULL, 16));
 			kfree(p);
 			break;
@@ -1693,6 +1709,10 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
 
 		case SRP_OPT_INITIATOR_EXT:
 			p = match_strdup(args);
+			if (!p) {
+				ret = -ENOMEM;
+				goto out;
+			}
 			target->initiator_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
 			kfree(p);
 			break;

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

* [GIT PULL] please pull infiniband.git
@ 2007-01-09 22:18 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-01-09 22:18 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This includes the small patches from my previous pull request that you
seem to have dropped, plus two more fixes:

Dotan Barak (1):
      IB/mthca: Don't execute QUERY_QP firmware command for QP in RESET state

Erez Zilber (1):
      IB/iser: Return error code when PDUs may not be sent

Hoang-Nam Nguyen (1):
      IB/ehca: Use proper GFP_ flags for get_zeroed_page()

Jack Morgenstein (1):
      IB/mthca: Fix PRM compliance problem in atomic-send completions

Michael S. Tsirkin (1):
      IB/mthca: Fix off-by-one in FMR handling on memfree

Sean Hefty (2):
      RDMA/ucma: Fix struct ucma_event leak when backlog is full
      RDMA/ucma: Don't report events with invalid user context

Steve Wise (1):
      RDMA/iwcm: iWARP connection timeouts shouldn't be reported as rejects

 drivers/infiniband/core/cma.c                |   17 ++++++++++++++---
 drivers/infiniband/core/ucma.c               |   11 +++++++++++
 drivers/infiniband/hw/ehca/ehca_hca.c        |    8 ++++----
 drivers/infiniband/hw/ehca/ehca_irq.c        |    2 +-
 drivers/infiniband/hw/ehca/ehca_iverbs.h     |    4 ++--
 drivers/infiniband/hw/ehca/ehca_main.c       |   10 +++++-----
 drivers/infiniband/hw/ehca/ehca_mrmw.c       |    4 ++--
 drivers/infiniband/hw/ehca/ehca_qp.c         |    4 ++--
 drivers/infiniband/hw/mthca/mthca_cq.c       |    8 ++++++--
 drivers/infiniband/hw/mthca/mthca_memfree.c  |    2 +-
 drivers/infiniband/hw/mthca/mthca_qp.c       |   26 +++++++++++++++++---------
 drivers/infiniband/ulp/iser/iscsi_iser.c     |    4 ++--
 drivers/infiniband/ulp/iser/iser_initiator.c |   26 ++++++++++++--------------
 13 files changed, 79 insertions(+), 47 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 533193d..9e0ab04 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1088,10 +1088,21 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
 		*sin = iw_event->local_addr;
 		sin = (struct sockaddr_in *) &id_priv->id.route.addr.dst_addr;
 		*sin = iw_event->remote_addr;
-		if (iw_event->status)
-			event.event = RDMA_CM_EVENT_REJECTED;
-		else
+		switch (iw_event->status) {
+		case 0:
 			event.event = RDMA_CM_EVENT_ESTABLISHED;
+			break;
+		case -ECONNRESET:
+		case -ECONNREFUSED:
+			event.event = RDMA_CM_EVENT_REJECTED;
+			break;
+		case -ETIMEDOUT:
+			event.event = RDMA_CM_EVENT_UNREACHABLE;
+			break;
+		default:
+			event.event = RDMA_CM_EVENT_CONNECT_ERROR;
+			break;
+		}
 		break;
 	case IW_CM_EVENT_ESTABLISHED:
 		event.event = RDMA_CM_EVENT_ESTABLISHED;
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
index 81a5cdc..e2e8d32 100644
--- a/drivers/infiniband/core/ucma.c
+++ b/drivers/infiniband/core/ucma.c
@@ -209,10 +209,21 @@ static int ucma_event_handler(struct rdma_cm_id *cm_id,
 	if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) {
 		if (!ctx->backlog) {
 			ret = -EDQUOT;
+			kfree(uevent);
 			goto out;
 		}
 		ctx->backlog--;
+	} else if (!ctx->uid) {
+		/*
+		 * We ignore events for new connections until userspace has set
+		 * their context.  This can only happen if an error occurs on a
+		 * new connection before the user accepts it.  This is okay,
+		 * since the accept will just fail later.
+		 */
+		kfree(uevent);
+		goto out;
 	}
+
 	list_add_tail(&uevent->list, &ctx->file->event_list);
 	wake_up_interruptible(&ctx->file->poll_wait);
 out:
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
index e1b618c..b7be950 100644
--- a/drivers/infiniband/hw/ehca/ehca_hca.c
+++ b/drivers/infiniband/hw/ehca/ehca_hca.c
@@ -50,7 +50,7 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
 					      ib_device);
 	struct hipz_query_hca *rblock;
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -110,7 +110,7 @@ int ehca_query_port(struct ib_device *ibdev,
 					      ib_device);
 	struct hipz_query_port *rblock;
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -179,7 +179,7 @@ int ehca_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
 		return -EINVAL;
 	}
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_err(&shca->ib_device,  "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -212,7 +212,7 @@ int ehca_query_gid(struct ib_device *ibdev, u8 port,
 		return -EINVAL;
 	}
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index c3ea746..e7209af 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -138,7 +138,7 @@ int ehca_error_data(struct ehca_shca *shca, void *data,
 	u64 *rblock;
 	unsigned long block_count;
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_ATOMIC);
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Cannot allocate rblock memory.");
 		ret = -ENOMEM;
diff --git a/drivers/infiniband/hw/ehca/ehca_iverbs.h b/drivers/infiniband/hw/ehca/ehca_iverbs.h
index 3720e30..cd7789f 100644
--- a/drivers/infiniband/hw/ehca/ehca_iverbs.h
+++ b/drivers/infiniband/hw/ehca/ehca_iverbs.h
@@ -180,10 +180,10 @@ int ehca_mmap_register(u64 physical,void **mapped,
 int ehca_munmap(unsigned long addr, size_t len);
 
 #ifdef CONFIG_PPC_64K_PAGES
-void *ehca_alloc_fw_ctrlblock(void);
+void *ehca_alloc_fw_ctrlblock(gfp_t flags);
 void ehca_free_fw_ctrlblock(void *ptr);
 #else
-#define ehca_alloc_fw_ctrlblock() ((void *) get_zeroed_page(GFP_KERNEL))
+#define ehca_alloc_fw_ctrlblock(flags) ((void *) get_zeroed_page(flags))
 #define ehca_free_fw_ctrlblock(ptr) free_page((unsigned long)(ptr))
 #endif
 
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index cc47e4c..6574fbb 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -106,9 +106,9 @@ static struct timer_list poll_eqs_timer;
 #ifdef CONFIG_PPC_64K_PAGES
 static struct kmem_cache *ctblk_cache = NULL;
 
-void *ehca_alloc_fw_ctrlblock(void)
+void *ehca_alloc_fw_ctrlblock(gfp_t flags)
 {
-	void *ret = kmem_cache_zalloc(ctblk_cache, GFP_KERNEL);
+	void *ret = kmem_cache_zalloc(ctblk_cache, flags);
 	if (!ret)
 		ehca_gen_err("Out of memory for ctblk");
 	return ret;
@@ -206,7 +206,7 @@ int ehca_sense_attributes(struct ehca_shca *shca)
 	u64 h_ret;
 	struct hipz_query_hca *rblock;
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_gen_err("Cannot allocate rblock memory.");
 		return -ENOMEM;
@@ -258,7 +258,7 @@ static int init_node_guid(struct ehca_shca *shca)
 	int ret = 0;
 	struct hipz_query_hca *rblock;
 
-	rblock = ehca_alloc_fw_ctrlblock();
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -469,7 +469,7 @@ static ssize_t  ehca_show_##name(struct device *dev,                       \
 									   \
 	shca = dev->driver_data;					   \
 									   \
-	rblock = ehca_alloc_fw_ctrlblock();				   \
+	rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);			   \
 	if (!rblock) {						           \
 		dev_err(dev, "Can't allocate rblock memory.");		   \
 		return 0;						   \
diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c b/drivers/infiniband/hw/ehca/ehca_mrmw.c
index 0a5e221..cfb362a 100644
--- a/drivers/infiniband/hw/ehca/ehca_mrmw.c
+++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c
@@ -1013,7 +1013,7 @@ int ehca_reg_mr_rpages(struct ehca_shca *shca,
 	u32 i;
 	u64 *kpage;
 
-	kpage = ehca_alloc_fw_ctrlblock();
+	kpage = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!kpage) {
 		ehca_err(&shca->ib_device, "kpage alloc failed");
 		ret = -ENOMEM;
@@ -1124,7 +1124,7 @@ inline int ehca_rereg_mr_rereg1(struct ehca_shca *shca,
 	ehca_mrmw_map_acl(acl, &hipz_acl);
 	ehca_mrmw_set_pgsize_hipz_acl(&hipz_acl);
 
-	kpage = ehca_alloc_fw_ctrlblock();
+	kpage = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!kpage) {
 		ehca_err(&shca->ib_device, "kpage alloc failed");
 		ret = -ENOMEM;
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index c6c9cef..34b8555 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -807,7 +807,7 @@ static int internal_modify_qp(struct ib_qp *ibqp,
 	unsigned long spl_flags = 0;
 
 	/* do query_qp to obtain current attr values */
-	mqpcb = ehca_alloc_fw_ctrlblock();
+	mqpcb = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!mqpcb) {
 		ehca_err(ibqp->device, "Could not get zeroed page for mqpcb "
 			 "ehca_qp=%p qp_num=%x ", my_qp, ibqp->qp_num);
@@ -1273,7 +1273,7 @@ int ehca_query_qp(struct ib_qp *qp,
 		return -EINVAL;
 	}
 
-	qpcb = ehca_alloc_fw_ctrlblock();
+	qpcb = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
 	if (!qpcb) {
 		ehca_err(qp->device,"Out of memory for qpcb "
 			 "ehca_qp=%p qp_num=%x", my_qp, qp->qp_num);
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index 283d50b..1159c8a 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -54,6 +54,10 @@ enum {
 	MTHCA_CQ_ENTRY_SIZE = 0x20
 };
 
+enum {
+	MTHCA_ATOMIC_BYTE_LEN = 8
+};
+
 /*
  * Must be packed because start is 64 bits but only aligned to 32 bits.
  */
@@ -599,11 +603,11 @@ static inline int mthca_poll_one(struct mthca_dev *dev,
 			break;
 		case MTHCA_OPCODE_ATOMIC_CS:
 			entry->opcode    = IB_WC_COMP_SWAP;
-			entry->byte_len  = be32_to_cpu(cqe->byte_cnt);
+			entry->byte_len  = MTHCA_ATOMIC_BYTE_LEN;
 			break;
 		case MTHCA_OPCODE_ATOMIC_FA:
 			entry->opcode    = IB_WC_FETCH_ADD;
-			entry->byte_len  = be32_to_cpu(cqe->byte_cnt);
+			entry->byte_len  = MTHCA_ATOMIC_BYTE_LEN;
 			break;
 		case MTHCA_OPCODE_BIND_MW:
 			entry->opcode    = IB_WC_BIND_MW;
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c
index 15cc2f6..6b19645 100644
--- a/drivers/infiniband/hw/mthca/mthca_memfree.c
+++ b/drivers/infiniband/hw/mthca/mthca_memfree.c
@@ -232,7 +232,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj)
 
 	list_for_each_entry(chunk, &icm->chunk_list, list) {
 		for (i = 0; i < chunk->npages; ++i) {
-			if (chunk->mem[i].length >= offset) {
+			if (chunk->mem[i].length > offset) {
 				page = chunk->mem[i].page;
 				goto out;
 			}
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index d844a25..5f5214c 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -429,13 +429,18 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m
 {
 	struct mthca_dev *dev = to_mdev(ibqp->device);
 	struct mthca_qp *qp = to_mqp(ibqp);
-	int err;
-	struct mthca_mailbox *mailbox;
+	int err = 0;
+	struct mthca_mailbox *mailbox = NULL;
 	struct mthca_qp_param *qp_param;
 	struct mthca_qp_context *context;
 	int mthca_state;
 	u8 status;
 
+	if (qp->state == IB_QPS_RESET) {
+		qp_attr->qp_state = IB_QPS_RESET;
+		goto done;
+	}
+
 	mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
 	if (IS_ERR(mailbox))
 		return PTR_ERR(mailbox);
@@ -454,7 +459,6 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m
 	mthca_state = be32_to_cpu(context->flags) >> 28;
 
 	qp_attr->qp_state 	     = to_ib_qp_state(mthca_state);
-	qp_attr->cur_qp_state 	     = qp_attr->qp_state;
 	qp_attr->path_mtu 	     = context->mtu_msgmax >> 5;
 	qp_attr->path_mig_state      =
 		to_ib_mig_state((be32_to_cpu(context->flags) >> 11) & 0x3);
@@ -464,11 +468,6 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m
 	qp_attr->dest_qp_num 	     = be32_to_cpu(context->remote_qpn) & 0xffffff;
 	qp_attr->qp_access_flags     =
 		to_ib_qp_access_flags(be32_to_cpu(context->params2));
-	qp_attr->cap.max_send_wr     = qp->sq.max;
-	qp_attr->cap.max_recv_wr     = qp->rq.max;
-	qp_attr->cap.max_send_sge    = qp->sq.max_gs;
-	qp_attr->cap.max_recv_sge    = qp->rq.max_gs;
-	qp_attr->cap.max_inline_data = qp->max_inline_data;
 
 	if (qp->transport == RC || qp->transport == UC) {
 		to_ib_ah_attr(dev, &qp_attr->ah_attr, &context->pri_path);
@@ -495,7 +494,16 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m
 	qp_attr->retry_cnt 	    = (be32_to_cpu(context->params1) >> 16) & 0x7;
 	qp_attr->rnr_retry 	    = context->pri_path.rnr_retry >> 5;
 	qp_attr->alt_timeout 	    = context->alt_path.ackto >> 3;
-	qp_init_attr->cap 	    = qp_attr->cap;
+
+done:
+	qp_attr->cur_qp_state	     = qp_attr->qp_state;
+	qp_attr->cap.max_send_wr     = qp->sq.max;
+	qp_attr->cap.max_recv_wr     = qp->rq.max;
+	qp_attr->cap.max_send_sge    = qp->sq.max_gs;
+	qp_attr->cap.max_recv_sge    = qp->rq.max_gs;
+	qp_attr->cap.max_inline_data = qp->max_inline_data;
+
+	qp_init_attr->cap	     = qp_attr->cap;
 
 out:
 	mthca_free_mailbox(dev, mailbox);
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 9b2041e..dd221ed 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -177,7 +177,7 @@ iscsi_iser_mtask_xmit(struct iscsi_conn *conn,
 	 * - if yes, the mtask is recycled at iscsi_complete_pdu
 	 * - if no,  the mtask is recycled at iser_snd_completion
 	 */
-	if (error && error != -EAGAIN)
+	if (error && error != -ENOBUFS)
 		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
 
 	return error;
@@ -241,7 +241,7 @@ iscsi_iser_ctask_xmit(struct iscsi_conn *conn,
 		error = iscsi_iser_ctask_xmit_unsol_data(conn, ctask);
 
  iscsi_iser_ctask_xmit_exit:
-	if (error && error != -EAGAIN)
+	if (error && error != -ENOBUFS)
 		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
 	return error;
 }
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index e73c87b..0a7d1ab 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -304,18 +304,14 @@ int iser_conn_set_full_featured_mode(struct iscsi_conn *conn)
 static int
 iser_check_xmit(struct iscsi_conn *conn, void *task)
 {
-	int rc = 0;
 	struct iscsi_iser_conn *iser_conn = conn->dd_data;
 
-	write_lock_bh(conn->recv_lock);
 	if (atomic_read(&iser_conn->ib_conn->post_send_buf_count) ==
 	    ISER_QP_MAX_REQ_DTOS) {
-		iser_dbg("%ld can't xmit task %p, suspending tx\n",jiffies,task);
-		set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
-		rc = -EAGAIN;
+		iser_dbg("%ld can't xmit task %p\n",jiffies,task);
+		return -ENOBUFS;
 	}
-	write_unlock_bh(conn->recv_lock);
-	return rc;
+	return 0;
 }
 
 
@@ -340,7 +336,7 @@ int iser_send_command(struct iscsi_conn     *conn,
 		return -EPERM;
 	}
 	if (iser_check_xmit(conn, ctask))
-		return -EAGAIN;
+		return -ENOBUFS;
 
 	edtl = ntohl(hdr->data_length);
 
@@ -426,7 +422,7 @@ int iser_send_data_out(struct iscsi_conn     *conn,
 	}
 
 	if (iser_check_xmit(conn, ctask))
-		return -EAGAIN;
+		return -ENOBUFS;
 
 	itt = ntohl(hdr->itt);
 	data_seg_len = ntoh24(hdr->dlength);
@@ -498,7 +494,7 @@ int iser_send_control(struct iscsi_conn *conn,
 	}
 
 	if (iser_check_xmit(conn,mtask))
-		return -EAGAIN;
+		return -ENOBUFS;
 
 	/* build the tx desc regd header and add it to the tx desc dto */
 	mdesc->type = ISCSI_TX_CONTROL;
@@ -605,6 +601,7 @@ void iser_snd_completion(struct iser_desc *tx_desc)
 	struct iscsi_iser_conn *iser_conn = ib_conn->iser_conn;
 	struct iscsi_conn      *conn = iser_conn->iscsi_conn;
 	struct iscsi_mgmt_task *mtask;
+	int resume_tx = 0;
 
 	iser_dbg("Initiator, Data sent dto=0x%p\n", dto);
 
@@ -613,15 +610,16 @@ void iser_snd_completion(struct iser_desc *tx_desc)
 	if (tx_desc->type == ISCSI_TX_DATAOUT)
 		kmem_cache_free(ig.desc_cache, tx_desc);
 
+	if (atomic_read(&iser_conn->ib_conn->post_send_buf_count) ==
+	    ISER_QP_MAX_REQ_DTOS)
+		resume_tx = 1;
+
 	atomic_dec(&ib_conn->post_send_buf_count);
 
-	write_lock(conn->recv_lock);
-	if (conn->suspend_tx) {
+	if (resume_tx) {
 		iser_dbg("%ld resuming tx\n",jiffies);
-		clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
 		scsi_queue_work(conn->session->host, &conn->xmitwork);
 	}
-	write_unlock(conn->recv_lock);
 
 	if (tx_desc->type == ISCSI_TX_CONTROL) {
 		/* this arithmetic is legal by libiscsi dd_data allocation */

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

* [GIT PULL] please pull infiniband.git
@ 2007-01-08  4:29 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2007-01-08  4:29 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

A few small fixes here and there:

Erez Zilber (1):
      IB/iser: Return error code when PDUs may not be sent

Jack Morgenstein (1):
      IB/mthca: Fix PRM compliance problem in atomic-send completions

Michael S. Tsirkin (1):
      IB/mthca: Fix off-by-one in FMR handling on memfree

Sean Hefty (2):
      RDMA/ucma: Fix struct ucma_event leak when backlog is full
      RDMA/ucma: Don't report events with invalid user context

Steve Wise (1):
      RDMA/iwcm: iWARP connection timeouts shouldn't be reported as rejects

 drivers/infiniband/core/cma.c                |   17 ++++++++++++++---
 drivers/infiniband/core/ucma.c               |   11 +++++++++++
 drivers/infiniband/hw/mthca/mthca_cq.c       |    8 ++++++--
 drivers/infiniband/hw/mthca/mthca_memfree.c  |    2 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c     |    4 ++--
 drivers/infiniband/ulp/iser/iser_initiator.c |   26 ++++++++++++--------------
 6 files changed, 46 insertions(+), 22 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 533193d..9e0ab04 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1088,10 +1088,21 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
 		*sin = iw_event->local_addr;
 		sin = (struct sockaddr_in *) &id_priv->id.route.addr.dst_addr;
 		*sin = iw_event->remote_addr;
-		if (iw_event->status)
-			event.event = RDMA_CM_EVENT_REJECTED;
-		else
+		switch (iw_event->status) {
+		case 0:
 			event.event = RDMA_CM_EVENT_ESTABLISHED;
+			break;
+		case -ECONNRESET:
+		case -ECONNREFUSED:
+			event.event = RDMA_CM_EVENT_REJECTED;
+			break;
+		case -ETIMEDOUT:
+			event.event = RDMA_CM_EVENT_UNREACHABLE;
+			break;
+		default:
+			event.event = RDMA_CM_EVENT_CONNECT_ERROR;
+			break;
+		}
 		break;
 	case IW_CM_EVENT_ESTABLISHED:
 		event.event = RDMA_CM_EVENT_ESTABLISHED;
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
index 81a5cdc..e2e8d32 100644
--- a/drivers/infiniband/core/ucma.c
+++ b/drivers/infiniband/core/ucma.c
@@ -209,10 +209,21 @@ static int ucma_event_handler(struct rdma_cm_id *cm_id,
 	if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) {
 		if (!ctx->backlog) {
 			ret = -EDQUOT;
+			kfree(uevent);
 			goto out;
 		}
 		ctx->backlog--;
+	} else if (!ctx->uid) {
+		/*
+		 * We ignore events for new connections until userspace has set
+		 * their context.  This can only happen if an error occurs on a
+		 * new connection before the user accepts it.  This is okay,
+		 * since the accept will just fail later.
+		 */
+		kfree(uevent);
+		goto out;
 	}
+
 	list_add_tail(&uevent->list, &ctx->file->event_list);
 	wake_up_interruptible(&ctx->file->poll_wait);
 out:
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index 283d50b..1159c8a 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -54,6 +54,10 @@ enum {
 	MTHCA_CQ_ENTRY_SIZE = 0x20
 };
 
+enum {
+	MTHCA_ATOMIC_BYTE_LEN = 8
+};
+
 /*
  * Must be packed because start is 64 bits but only aligned to 32 bits.
  */
@@ -599,11 +603,11 @@ static inline int mthca_poll_one(struct mthca_dev *dev,
 			break;
 		case MTHCA_OPCODE_ATOMIC_CS:
 			entry->opcode    = IB_WC_COMP_SWAP;
-			entry->byte_len  = be32_to_cpu(cqe->byte_cnt);
+			entry->byte_len  = MTHCA_ATOMIC_BYTE_LEN;
 			break;
 		case MTHCA_OPCODE_ATOMIC_FA:
 			entry->opcode    = IB_WC_FETCH_ADD;
-			entry->byte_len  = be32_to_cpu(cqe->byte_cnt);
+			entry->byte_len  = MTHCA_ATOMIC_BYTE_LEN;
 			break;
 		case MTHCA_OPCODE_BIND_MW:
 			entry->opcode    = IB_WC_BIND_MW;
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c
index 15cc2f6..6b19645 100644
--- a/drivers/infiniband/hw/mthca/mthca_memfree.c
+++ b/drivers/infiniband/hw/mthca/mthca_memfree.c
@@ -232,7 +232,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj)
 
 	list_for_each_entry(chunk, &icm->chunk_list, list) {
 		for (i = 0; i < chunk->npages; ++i) {
-			if (chunk->mem[i].length >= offset) {
+			if (chunk->mem[i].length > offset) {
 				page = chunk->mem[i].page;
 				goto out;
 			}
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 9b2041e..dd221ed 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -177,7 +177,7 @@ iscsi_iser_mtask_xmit(struct iscsi_conn *conn,
 	 * - if yes, the mtask is recycled at iscsi_complete_pdu
 	 * - if no,  the mtask is recycled at iser_snd_completion
 	 */
-	if (error && error != -EAGAIN)
+	if (error && error != -ENOBUFS)
 		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
 
 	return error;
@@ -241,7 +241,7 @@ iscsi_iser_ctask_xmit(struct iscsi_conn *conn,
 		error = iscsi_iser_ctask_xmit_unsol_data(conn, ctask);
 
  iscsi_iser_ctask_xmit_exit:
-	if (error && error != -EAGAIN)
+	if (error && error != -ENOBUFS)
 		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
 	return error;
 }
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index e73c87b..0a7d1ab 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -304,18 +304,14 @@ int iser_conn_set_full_featured_mode(struct iscsi_conn *conn)
 static int
 iser_check_xmit(struct iscsi_conn *conn, void *task)
 {
-	int rc = 0;
 	struct iscsi_iser_conn *iser_conn = conn->dd_data;
 
-	write_lock_bh(conn->recv_lock);
 	if (atomic_read(&iser_conn->ib_conn->post_send_buf_count) ==
 	    ISER_QP_MAX_REQ_DTOS) {
-		iser_dbg("%ld can't xmit task %p, suspending tx\n",jiffies,task);
-		set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
-		rc = -EAGAIN;
+		iser_dbg("%ld can't xmit task %p\n",jiffies,task);
+		return -ENOBUFS;
 	}
-	write_unlock_bh(conn->recv_lock);
-	return rc;
+	return 0;
 }
 
 
@@ -340,7 +336,7 @@ int iser_send_command(struct iscsi_conn     *conn,
 		return -EPERM;
 	}
 	if (iser_check_xmit(conn, ctask))
-		return -EAGAIN;
+		return -ENOBUFS;
 
 	edtl = ntohl(hdr->data_length);
 
@@ -426,7 +422,7 @@ int iser_send_data_out(struct iscsi_conn     *conn,
 	}
 
 	if (iser_check_xmit(conn, ctask))
-		return -EAGAIN;
+		return -ENOBUFS;
 
 	itt = ntohl(hdr->itt);
 	data_seg_len = ntoh24(hdr->dlength);
@@ -498,7 +494,7 @@ int iser_send_control(struct iscsi_conn *conn,
 	}
 
 	if (iser_check_xmit(conn,mtask))
-		return -EAGAIN;
+		return -ENOBUFS;
 
 	/* build the tx desc regd header and add it to the tx desc dto */
 	mdesc->type = ISCSI_TX_CONTROL;
@@ -605,6 +601,7 @@ void iser_snd_completion(struct iser_desc *tx_desc)
 	struct iscsi_iser_conn *iser_conn = ib_conn->iser_conn;
 	struct iscsi_conn      *conn = iser_conn->iscsi_conn;
 	struct iscsi_mgmt_task *mtask;
+	int resume_tx = 0;
 
 	iser_dbg("Initiator, Data sent dto=0x%p\n", dto);
 
@@ -613,15 +610,16 @@ void iser_snd_completion(struct iser_desc *tx_desc)
 	if (tx_desc->type == ISCSI_TX_DATAOUT)
 		kmem_cache_free(ig.desc_cache, tx_desc);
 
+	if (atomic_read(&iser_conn->ib_conn->post_send_buf_count) ==
+	    ISER_QP_MAX_REQ_DTOS)
+		resume_tx = 1;
+
 	atomic_dec(&ib_conn->post_send_buf_count);
 
-	write_lock(conn->recv_lock);
-	if (conn->suspend_tx) {
+	if (resume_tx) {
 		iser_dbg("%ld resuming tx\n",jiffies);
-		clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
 		scsi_queue_work(conn->session->host, &conn->xmitwork);
 	}
-	write_unlock(conn->recv_lock);
 
 	if (tx_desc->type == ISCSI_TX_CONTROL) {
 		/* this arithmetic is legal by libiscsi dd_data allocation */

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

* [GIT PULL] please pull infiniband.git
@ 2006-12-16  4:57 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-12-16  4:57 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

A couple of fixes for semi-nasty bugs on 32-bit architectures, plus
one small mthca driver update:

Leonid Arsh (1):
      IB/mthca: Add HCA profile module parameters

Roland Dreier (3):
      IB: Fix ib_dma_alloc_coherent() wrapper
      IB/srp: Fix FMR mapping for 32-bit kernels and addresses above 4G
      IB/mthca: Use DEFINE_MUTEX() instead of mutex_init()

 drivers/infiniband/hw/mthca/mthca_main.c |  113 +++++++++++++++++++++++++----
 drivers/infiniband/ulp/srp/ib_srp.c      |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.h      |    2 +-
 include/rdma/ib_verbs.h                  |    9 ++-
 4 files changed, 107 insertions(+), 19 deletions(-)


diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c
index 0491ec7..44bc6cc 100644
--- a/drivers/infiniband/hw/mthca/mthca_main.c
+++ b/drivers/infiniband/hw/mthca/mthca_main.c
@@ -80,24 +80,61 @@ static int tune_pci = 0;
 module_param(tune_pci, int, 0444);
 MODULE_PARM_DESC(tune_pci, "increase PCI burst from the default set by BIOS if nonzero");
 
-struct mutex mthca_device_mutex;
+DEFINE_MUTEX(mthca_device_mutex);
+
+#define MTHCA_DEFAULT_NUM_QP            (1 << 16)
+#define MTHCA_DEFAULT_RDB_PER_QP        (1 << 2)
+#define MTHCA_DEFAULT_NUM_CQ            (1 << 16)
+#define MTHCA_DEFAULT_NUM_MCG           (1 << 13)
+#define MTHCA_DEFAULT_NUM_MPT           (1 << 17)
+#define MTHCA_DEFAULT_NUM_MTT           (1 << 20)
+#define MTHCA_DEFAULT_NUM_UDAV          (1 << 15)
+#define MTHCA_DEFAULT_NUM_RESERVED_MTTS (1 << 18)
+#define MTHCA_DEFAULT_NUM_UARC_SIZE     (1 << 18)
+
+static struct mthca_profile hca_profile = {
+	.num_qp             = MTHCA_DEFAULT_NUM_QP,
+	.rdb_per_qp         = MTHCA_DEFAULT_RDB_PER_QP,
+	.num_cq             = MTHCA_DEFAULT_NUM_CQ,
+	.num_mcg            = MTHCA_DEFAULT_NUM_MCG,
+	.num_mpt            = MTHCA_DEFAULT_NUM_MPT,
+	.num_mtt            = MTHCA_DEFAULT_NUM_MTT,
+	.num_udav           = MTHCA_DEFAULT_NUM_UDAV,          /* Tavor only */
+	.fmr_reserved_mtts  = MTHCA_DEFAULT_NUM_RESERVED_MTTS, /* Tavor only */
+	.uarc_size          = MTHCA_DEFAULT_NUM_UARC_SIZE,     /* Arbel only */
+};
+
+module_param_named(num_qp, hca_profile.num_qp, int, 0444);
+MODULE_PARM_DESC(num_qp, "maximum number of QPs per HCA");
+
+module_param_named(rdb_per_qp, hca_profile.rdb_per_qp, int, 0444);
+MODULE_PARM_DESC(rdb_per_qp, "number of RDB buffers per QP");
+
+module_param_named(num_cq, hca_profile.num_cq, int, 0444);
+MODULE_PARM_DESC(num_cq, "maximum number of CQs per HCA");
+
+module_param_named(num_mcg, hca_profile.num_mcg, int, 0444);
+MODULE_PARM_DESC(num_mcg, "maximum number of multicast groups per HCA");
+
+module_param_named(num_mpt, hca_profile.num_mpt, int, 0444);
+MODULE_PARM_DESC(num_mpt,
+		"maximum number of memory protection table entries per HCA");
+
+module_param_named(num_mtt, hca_profile.num_mtt, int, 0444);
+MODULE_PARM_DESC(num_mtt,
+		 "maximum number of memory translation table segments per HCA");
+
+module_param_named(num_udav, hca_profile.num_udav, int, 0444);
+MODULE_PARM_DESC(num_udav, "maximum number of UD address vectors per HCA");
+
+module_param_named(fmr_reserved_mtts, hca_profile.fmr_reserved_mtts, int, 0444);
+MODULE_PARM_DESC(fmr_reserved_mtts,
+		 "number of memory translation table segments reserved for FMR");
 
 static const char mthca_version[] __devinitdata =
 	DRV_NAME ": Mellanox InfiniBand HCA driver v"
 	DRV_VERSION " (" DRV_RELDATE ")\n";
 
-static struct mthca_profile default_profile = {
-	.num_qp		   = 1 << 16,
-	.rdb_per_qp	   = 4,
-	.num_cq		   = 1 << 16,
-	.num_mcg	   = 1 << 13,
-	.num_mpt	   = 1 << 17,
-	.num_mtt	   = 1 << 20,
-	.num_udav	   = 1 << 15,	/* Tavor only */
-	.fmr_reserved_mtts = 1 << 18,	/* Tavor only */
-	.uarc_size	   = 1 << 18,	/* Arbel only */
-};
-
 static int mthca_tune_pci(struct mthca_dev *mdev)
 {
 	int cap;
@@ -303,7 +340,7 @@ static int mthca_init_tavor(struct mthca_dev *mdev)
 		goto err_disable;
 	}
 
-	profile = default_profile;
+	profile = hca_profile;
 	profile.num_uar   = dev_lim.uar_size / PAGE_SIZE;
 	profile.uarc_size = 0;
 	if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
@@ -621,7 +658,7 @@ static int mthca_init_arbel(struct mthca_dev *mdev)
 		goto err_stop_fw;
 	}
 
-	profile = default_profile;
+	profile = hca_profile;
 	profile.num_uar  = dev_lim.uar_size / PAGE_SIZE;
 	profile.num_udav = 0;
 	if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
@@ -1278,11 +1315,55 @@ static struct pci_driver mthca_driver = {
 	.remove		= __devexit_p(mthca_remove_one)
 };
 
+static void __init __mthca_check_profile_val(const char *name, int *pval,
+					     int pval_default)
+{
+	/* value must be positive and power of 2 */
+	int old_pval = *pval;
+
+	if (old_pval <= 0)
+		*pval = pval_default;
+	else
+		*pval = roundup_pow_of_two(old_pval);
+
+	if (old_pval != *pval) {
+		printk(KERN_WARNING PFX "Invalid value %d for %s in module parameter.\n",
+		       old_pval, name);
+		printk(KERN_WARNING PFX "Corrected %s to %d.\n", name, *pval);
+	}
+}
+
+#define mthca_check_profile_val(name, default)				\
+	__mthca_check_profile_val(#name, &hca_profile.name, default)
+
+static void __init mthca_validate_profile(void)
+{
+	mthca_check_profile_val(num_qp,            MTHCA_DEFAULT_NUM_QP);
+	mthca_check_profile_val(rdb_per_qp,        MTHCA_DEFAULT_RDB_PER_QP);
+	mthca_check_profile_val(num_cq,            MTHCA_DEFAULT_NUM_CQ);
+	mthca_check_profile_val(num_mcg, 	   MTHCA_DEFAULT_NUM_MCG);
+	mthca_check_profile_val(num_mpt, 	   MTHCA_DEFAULT_NUM_MPT);
+	mthca_check_profile_val(num_mtt, 	   MTHCA_DEFAULT_NUM_MTT);
+	mthca_check_profile_val(num_udav,          MTHCA_DEFAULT_NUM_UDAV);
+	mthca_check_profile_val(fmr_reserved_mtts, MTHCA_DEFAULT_NUM_RESERVED_MTTS);
+
+	if (hca_profile.fmr_reserved_mtts >= hca_profile.num_mtt) {
+		printk(KERN_WARNING PFX "Invalid fmr_reserved_mtts module parameter %d.\n",
+		       hca_profile.fmr_reserved_mtts);
+		printk(KERN_WARNING PFX "(Must be smaller than num_mtt %d)\n",
+		       hca_profile.num_mtt);
+		hca_profile.fmr_reserved_mtts = hca_profile.num_mtt / 2;
+		printk(KERN_WARNING PFX "Corrected fmr_reserved_mtts to %d.\n",
+		       hca_profile.fmr_reserved_mtts);
+	}
+}
+
 static int __init mthca_init(void)
 {
 	int ret;
 
-	mutex_init(&mthca_device_mutex);
+	mthca_validate_profile();
+
 	ret = mthca_catas_init();
 	if (ret)
 		return ret;
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index e9b6a6f..cdecbf5 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -1898,7 +1898,7 @@ static void srp_add_one(struct ib_device *device)
 	 */
 	srp_dev->fmr_page_shift = max(9, ffs(dev_attr->page_size_cap) - 1);
 	srp_dev->fmr_page_size  = 1 << srp_dev->fmr_page_shift;
-	srp_dev->fmr_page_mask  = ~((unsigned long) srp_dev->fmr_page_size - 1);
+	srp_dev->fmr_page_mask  = ~((u64) srp_dev->fmr_page_size - 1);
 
 	INIT_LIST_HEAD(&srp_dev->dev_list);
 
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h
index 868a540..c217723 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.h
+++ b/drivers/infiniband/ulp/srp/ib_srp.h
@@ -87,7 +87,7 @@ struct srp_device {
 	struct ib_fmr_pool     *fmr_pool;
 	int			fmr_page_shift;
 	int			fmr_page_size;
-	unsigned long		fmr_page_mask;
+	u64			fmr_page_mask;
 };
 
 struct srp_host {
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 3c2e105..0bfa332 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -1639,7 +1639,14 @@ static inline void *ib_dma_alloc_coherent(struct ib_device *dev,
 {
 	if (dev->dma_ops)
 		return dev->dma_ops->alloc_coherent(dev, size, dma_handle, flag);
-	return dma_alloc_coherent(dev->dma_device, size, dma_handle, flag);
+	else {
+		dma_addr_t handle;
+		void *ret;
+
+		ret = dma_alloc_coherent(dev->dma_device, size, &handle, flag);
+		*dma_handle = handle;
+		return ret;
+	}
 }
 
 /**

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

* [GIT PULL] please pull infiniband.git
@ 2006-11-29 23:37 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-11-29 23:37 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This is the first batch of post-2.6.19 fixes:

Arne Redlich (1):
      IB/srp: Increase supported CDB size

Dotan Barak (1):
      RDMA/cm: Remove setting local write as part of QP access flags

Eric Sesterhenn (1):
      IB: kmemdup() cleanup

Hoang-Nam Nguyen (1):
      IB/ehca: Use WQE offset instead of WQE addr for pending work reqs

Jack Morgenstein (1):
      IB/mthca: Fix initial SRQ logsize for mem-free HCAs

Krishna Kumar (11):
      RDMA/cma: Optimize cma_bind_loopback() to check for empty list
      RDMA/cma: Remove redundant check in cma_add_one
      RDMA/addr: Use time_after_eq() instead of time_after() in queue_req()
      RDMA/cma: Rewrite cma_req_handler() to encapsulate common code
      RDMA/iwcm: Fix memory corruption bug in cm_work_handler()
      RDMA/iwcm: Fix memory leak
      RDMA/iwcm: Remove unnecessary initializations
      RDMA/iwcm: Remove unnecessary function argument
      RDMA/iwcm: Fix comment for iwcm_deref_id() to match code
      RDMA/amso1100: Prevent deadlock in destroy QP
      RDMA/addr: Fix some cancellation problems in process_req()

Michael S. Tsirkin (2):
      IPoIB: Fix skb leak when freeing neighbour
      IB/ucm: Fix deadlock in cleanup

Roland Dreier (5):
      IB/mthca: Fix section mismatches
      RDMA/amso1100: Fix section mismatches
      IB/ipath: Fix typo in pma_counter_select subscript
      IB: Convert kmem_cache_t -> struct kmem_cache
      RDMA/addr: list_move() cleanups

Sean Hefty (1):
      IB/cm: Fix automatic path migration support

Vu Pham (1):
      IB/srp: Fix memory leak on reconnect

 drivers/infiniband/core/addr.c                 |   19 ++--
 drivers/infiniband/core/cm.c                   |  121 ++++++++++++++++++------
 drivers/infiniband/core/cma.c                  |   49 ++++------
 drivers/infiniband/core/iwcm.c                 |   43 +++++----
 drivers/infiniband/core/mad.c                  |    2 +-
 drivers/infiniband/core/ucm.c                  |   20 ++--
 drivers/infiniband/hw/amso1100/c2.h            |    2 +-
 drivers/infiniband/hw/amso1100/c2_qp.c         |   36 ++++++--
 drivers/infiniband/hw/amso1100/c2_rnic.c       |    4 +-
 drivers/infiniband/hw/ehca/ehca_main.c         |    4 +-
 drivers/infiniband/hw/ehca/ehca_qp.c           |   22 ++---
 drivers/infiniband/hw/ehca/ipz_pt_fn.c         |   13 +++
 drivers/infiniband/hw/ehca/ipz_pt_fn.h         |   15 +++
 drivers/infiniband/hw/ipath/ipath_verbs.c      |    2 +-
 drivers/infiniband/hw/mthca/mthca_av.c         |    3 +-
 drivers/infiniband/hw/mthca/mthca_cq.c         |    3 +-
 drivers/infiniband/hw/mthca/mthca_eq.c         |   21 ++--
 drivers/infiniband/hw/mthca/mthca_mad.c        |    2 +-
 drivers/infiniband/hw/mthca/mthca_main.c       |   29 +++---
 drivers/infiniband/hw/mthca/mthca_mcg.c        |    3 +-
 drivers/infiniband/hw/mthca/mthca_mr.c         |    5 +-
 drivers/infiniband/hw/mthca/mthca_pd.c         |    3 +-
 drivers/infiniband/hw/mthca/mthca_provider.c   |    3 +-
 drivers/infiniband/hw/mthca/mthca_qp.c         |    3 +-
 drivers/infiniband/hw/mthca/mthca_srq.c        |    4 +-
 drivers/infiniband/ulp/ipoib/ipoib.h           |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   19 +++-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    2 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h       |    2 +-
 drivers/infiniband/ulp/srp/ib_srp.c            |   11 ++-
 include/rdma/ib_cm.h                           |   16 +++-
 include/rdma/ib_user_cm.h                      |    7 +-
 32 files changed, 297 insertions(+), 193 deletions(-)


diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index e11187e..7767a11 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -139,7 +139,7 @@ static void queue_req(struct addr_req *r
 
 	mutex_lock(&lock);
 	list_for_each_entry_reverse(temp_req, &req_list, list) {
-		if (time_after(req->timeout, temp_req->timeout))
+		if (time_after_eq(req->timeout, temp_req->timeout))
 			break;
 	}
 
@@ -225,19 +225,17 @@ static void process_req(void *data)
 
 	mutex_lock(&lock);
 	list_for_each_entry_safe(req, temp_req, &req_list, list) {
-		if (req->status) {
+		if (req->status == -ENODATA) {
 			src_in = (struct sockaddr_in *) &req->src_addr;
 			dst_in = (struct sockaddr_in *) &req->dst_addr;
 			req->status = addr_resolve_remote(src_in, dst_in,
 							  req->addr);
+			if (req->status && time_after_eq(jiffies, req->timeout))
+				req->status = -ETIMEDOUT;
+			else if (req->status == -ENODATA)
+				continue;
 		}
-		if (req->status && time_after(jiffies, req->timeout))
-			req->status = -ETIMEDOUT;
-		else if (req->status == -ENODATA)
-			continue;
-
-		list_del(&req->list);
-		list_add_tail(&req->list, &done_list);
+		list_move_tail(&req->list, &done_list);
 	}
 
 	if (!list_empty(&req_list)) {
@@ -347,8 +345,7 @@ void rdma_addr_cancel(struct rdma_dev_ad
 		if (req->addr == addr) {
 			req->status = -ECANCELED;
 			req->timeout = jiffies;
-			list_del(&req->list);
-			list_add(&req->list, &req_list);
+			list_move(&req->list, &req_list);
 			set_timeout(req->timeout);
 			break;
 		}
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 25b1018..e5dc453 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -147,12 +147,12 @@ struct cm_id_private {
 	__be32 rq_psn;
 	int timeout_ms;
 	enum ib_mtu path_mtu;
+	__be16 pkey;
 	u8 private_data_len;
 	u8 max_cm_retries;
 	u8 peer_to_peer;
 	u8 responder_resources;
 	u8 initiator_depth;
-	u8 local_ack_timeout;
 	u8 retry_count;
 	u8 rnr_retry_count;
 	u8 service_timeout;
@@ -240,11 +240,10 @@ static void * cm_copy_private_data(const
 	if (!private_data || !private_data_len)
 		return NULL;
 
-	data = kmalloc(private_data_len, GFP_KERNEL);
+	data = kmemdup(private_data, private_data_len, GFP_KERNEL);
 	if (!data)
 		return ERR_PTR(-ENOMEM);
 
-	memcpy(data, private_data, private_data_len);
 	return data;
 }
 
@@ -691,7 +690,7 @@ static void cm_enter_timewait(struct cm_
 	 * timewait before notifying the user that we've exited timewait.
 	 */
 	cm_id_priv->id.state = IB_CM_TIMEWAIT;
-	wait_time = cm_convert_to_ms(cm_id_priv->local_ack_timeout);
+	wait_time = cm_convert_to_ms(cm_id_priv->av.packet_life_time + 1);
 	queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work,
 			   msecs_to_jiffies(wait_time));
 	cm_id_priv->timewait_info = NULL;
@@ -1010,6 +1009,7 @@ int ib_send_cm_req(struct ib_cm_id *cm_i
 	cm_id_priv->responder_resources = param->responder_resources;
 	cm_id_priv->retry_count = param->retry_count;
 	cm_id_priv->path_mtu = param->primary_path->mtu;
+	cm_id_priv->pkey = param->primary_path->pkey;
 	cm_id_priv->qp_type = param->qp_type;
 
 	ret = cm_alloc_msg(cm_id_priv, &cm_id_priv->msg);
@@ -1024,8 +1024,6 @@ int ib_send_cm_req(struct ib_cm_id *cm_i
 
 	cm_id_priv->local_qpn = cm_req_get_local_qpn(req_msg);
 	cm_id_priv->rq_psn = cm_req_get_starting_psn(req_msg);
-	cm_id_priv->local_ack_timeout =
-				cm_req_get_primary_local_ack_timeout(req_msg);
 
 	spin_lock_irqsave(&cm_id_priv->lock, flags);
 	ret = ib_post_send_mad(cm_id_priv->msg, NULL);
@@ -1410,9 +1408,8 @@ static int cm_req_handler(struct cm_work
 	cm_id_priv->initiator_depth = cm_req_get_resp_res(req_msg);
 	cm_id_priv->responder_resources = cm_req_get_init_depth(req_msg);
 	cm_id_priv->path_mtu = cm_req_get_path_mtu(req_msg);
+	cm_id_priv->pkey = req_msg->pkey;
 	cm_id_priv->sq_psn = cm_req_get_starting_psn(req_msg);
-	cm_id_priv->local_ack_timeout =
-				cm_req_get_primary_local_ack_timeout(req_msg);
 	cm_id_priv->retry_count = cm_req_get_retry_count(req_msg);
 	cm_id_priv->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg);
 	cm_id_priv->qp_type = cm_req_get_qp_type(req_msg);
@@ -1716,7 +1713,7 @@ static int cm_establish_handler(struct c
 	unsigned long flags;
 	int ret;
 
-	/* See comment in ib_cm_establish about lookup. */
+	/* See comment in cm_establish about lookup. */
 	cm_id_priv = cm_acquire_id(work->local_id, work->remote_id);
 	if (!cm_id_priv)
 		return -EINVAL;
@@ -2402,11 +2399,16 @@ int ib_send_cm_lap(struct ib_cm_id *cm_i
 	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
 	spin_lock_irqsave(&cm_id_priv->lock, flags);
 	if (cm_id->state != IB_CM_ESTABLISHED ||
-	    cm_id->lap_state != IB_CM_LAP_IDLE) {
+	    (cm_id->lap_state != IB_CM_LAP_UNINIT &&
+	     cm_id->lap_state != IB_CM_LAP_IDLE)) {
 		ret = -EINVAL;
 		goto out;
 	}
 
+	ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av);
+	if (ret)
+		goto out;
+
 	ret = cm_alloc_msg(cm_id_priv, &msg);
 	if (ret)
 		goto out;
@@ -2431,7 +2433,8 @@ out:	spin_unlock_irqrestore(&cm_id_priv-
 }
 EXPORT_SYMBOL(ib_send_cm_lap);
 
-static void cm_format_path_from_lap(struct ib_sa_path_rec *path,
+static void cm_format_path_from_lap(struct cm_id_private *cm_id_priv,
+				    struct ib_sa_path_rec *path,
 				    struct cm_lap_msg *lap_msg)
 {
 	memset(path, 0, sizeof *path);
@@ -2443,10 +2446,10 @@ static void cm_format_path_from_lap(stru
 	path->hop_limit = lap_msg->alt_hop_limit;
 	path->traffic_class = cm_lap_get_traffic_class(lap_msg);
 	path->reversible = 1;
-	/* pkey is same as in REQ */
+	path->pkey = cm_id_priv->pkey;
 	path->sl = cm_lap_get_sl(lap_msg);
 	path->mtu_selector = IB_SA_EQ;
-	/* mtu is same as in REQ */
+	path->mtu = cm_id_priv->path_mtu;
 	path->rate_selector = IB_SA_EQ;
 	path->rate = cm_lap_get_packet_rate(lap_msg);
 	path->packet_life_time_selector = IB_SA_EQ;
@@ -2472,7 +2475,7 @@ static int cm_lap_handler(struct cm_work
 
 	param = &work->cm_event.param.lap_rcvd;
 	param->alternate_path = &work->path[0];
-	cm_format_path_from_lap(param->alternate_path, lap_msg);
+	cm_format_path_from_lap(cm_id_priv, param->alternate_path, lap_msg);
 	work->cm_event.private_data = &lap_msg->private_data;
 
 	spin_lock_irqsave(&cm_id_priv->lock, flags);
@@ -2480,6 +2483,7 @@ static int cm_lap_handler(struct cm_work
 		goto unlock;
 
 	switch (cm_id_priv->id.lap_state) {
+	case IB_CM_LAP_UNINIT:
 	case IB_CM_LAP_IDLE:
 		break;
 	case IB_CM_MRA_LAP_SENT:
@@ -2502,6 +2506,10 @@ static int cm_lap_handler(struct cm_work
 
 	cm_id_priv->id.lap_state = IB_CM_LAP_RCVD;
 	cm_id_priv->tid = lap_msg->hdr.tid;
+	cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
+				work->mad_recv_wc->recv_buf.grh,
+				&cm_id_priv->av);
+	cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av);
 	ret = atomic_inc_and_test(&cm_id_priv->work_count);
 	if (!ret)
 		list_add_tail(&work->list, &cm_id_priv->work_list);
@@ -3040,7 +3048,7 @@ static void cm_work_handler(void *data)
 		cm_free_work(work);
 }
 
-int ib_cm_establish(struct ib_cm_id *cm_id)
+static int cm_establish(struct ib_cm_id *cm_id)
 {
 	struct cm_id_private *cm_id_priv;
 	struct cm_work *work;
@@ -3088,7 +3096,44 @@ int ib_cm_establish(struct ib_cm_id *cm_
 out:
 	return ret;
 }
-EXPORT_SYMBOL(ib_cm_establish);
+
+static int cm_migrate(struct ib_cm_id *cm_id)
+{
+	struct cm_id_private *cm_id_priv;
+	unsigned long flags;
+	int ret = 0;
+
+	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
+	spin_lock_irqsave(&cm_id_priv->lock, flags);
+	if (cm_id->state == IB_CM_ESTABLISHED &&
+	    (cm_id->lap_state == IB_CM_LAP_UNINIT ||
+	     cm_id->lap_state == IB_CM_LAP_IDLE)) {
+		cm_id->lap_state = IB_CM_LAP_IDLE;
+		cm_id_priv->av = cm_id_priv->alt_av;
+	} else
+		ret = -EINVAL;
+	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
+
+	return ret;
+}
+
+int ib_cm_notify(struct ib_cm_id *cm_id, enum ib_event_type event)
+{
+	int ret;
+
+	switch (event) {
+	case IB_EVENT_COMM_EST:
+		ret = cm_establish(cm_id);
+		break;
+	case IB_EVENT_PATH_MIG:
+		ret = cm_migrate(cm_id);
+		break;
+	default:
+		ret = -EINVAL;
+	}
+	return ret;
+}
+EXPORT_SYMBOL(ib_cm_notify);
 
 static void cm_recv_handler(struct ib_mad_agent *mad_agent,
 			    struct ib_mad_recv_wc *mad_recv_wc)
@@ -3173,8 +3218,7 @@ static int cm_init_qp_init_attr(struct c
 	case IB_CM_ESTABLISHED:
 		*qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS |
 				IB_QP_PKEY_INDEX | IB_QP_PORT;
-		qp_attr->qp_access_flags = IB_ACCESS_LOCAL_WRITE |
-					   IB_ACCESS_REMOTE_WRITE;
+		qp_attr->qp_access_flags = IB_ACCESS_REMOTE_WRITE;
 		if (cm_id_priv->responder_resources)
 			qp_attr->qp_access_flags |= IB_ACCESS_REMOTE_READ |
 						    IB_ACCESS_REMOTE_ATOMIC;
@@ -3222,6 +3266,9 @@ static int cm_init_qp_rtr_attr(struct cm
 		if (cm_id_priv->alt_av.ah_attr.dlid) {
 			*qp_attr_mask |= IB_QP_ALT_PATH;
 			qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num;
+			qp_attr->alt_pkey_index = cm_id_priv->alt_av.pkey_index;
+			qp_attr->alt_timeout =
+					cm_id_priv->alt_av.packet_life_time + 1;
 			qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr;
 		}
 		ret = 0;
@@ -3248,19 +3295,31 @@ static int cm_init_qp_rts_attr(struct cm
 	case IB_CM_REP_SENT:
 	case IB_CM_MRA_REP_RCVD:
 	case IB_CM_ESTABLISHED:
-		*qp_attr_mask = IB_QP_STATE | IB_QP_SQ_PSN;
-		qp_attr->sq_psn = be32_to_cpu(cm_id_priv->sq_psn);
-		if (cm_id_priv->qp_type == IB_QPT_RC) {
-			*qp_attr_mask |= IB_QP_TIMEOUT | IB_QP_RETRY_CNT |
-					 IB_QP_RNR_RETRY |
-					 IB_QP_MAX_QP_RD_ATOMIC;
-			qp_attr->timeout = cm_id_priv->local_ack_timeout;
-			qp_attr->retry_cnt = cm_id_priv->retry_count;
-			qp_attr->rnr_retry = cm_id_priv->rnr_retry_count;
-			qp_attr->max_rd_atomic = cm_id_priv->initiator_depth;
-		}
-		if (cm_id_priv->alt_av.ah_attr.dlid) {
-			*qp_attr_mask |= IB_QP_PATH_MIG_STATE;
+		if (cm_id_priv->id.lap_state == IB_CM_LAP_UNINIT) {
+			*qp_attr_mask = IB_QP_STATE | IB_QP_SQ_PSN;
+			qp_attr->sq_psn = be32_to_cpu(cm_id_priv->sq_psn);
+			if (cm_id_priv->qp_type == IB_QPT_RC) {
+				*qp_attr_mask |= IB_QP_TIMEOUT | IB_QP_RETRY_CNT |
+						 IB_QP_RNR_RETRY |
+						 IB_QP_MAX_QP_RD_ATOMIC;
+				qp_attr->timeout =
+					cm_id_priv->av.packet_life_time + 1;
+				qp_attr->retry_cnt = cm_id_priv->retry_count;
+				qp_attr->rnr_retry = cm_id_priv->rnr_retry_count;
+				qp_attr->max_rd_atomic =
+					cm_id_priv->initiator_depth;
+			}
+			if (cm_id_priv->alt_av.ah_attr.dlid) {
+				*qp_attr_mask |= IB_QP_PATH_MIG_STATE;
+				qp_attr->path_mig_state = IB_MIG_REARM;
+			}
+		} else {
+			*qp_attr_mask = IB_QP_ALT_PATH | IB_QP_PATH_MIG_STATE;
+			qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num;
+			qp_attr->alt_pkey_index = cm_id_priv->alt_av.pkey_index;
+			qp_attr->alt_timeout =
+				cm_id_priv->alt_av.packet_life_time + 1;
+			qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr;
 			qp_attr->path_mig_state = IB_MIG_REARM;
 		}
 		ret = 0;
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 845090b..cf48f26 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -344,7 +344,7 @@ static int cma_init_ib_qp(struct rdma_id
 		return ret;
 
 	qp_attr.qp_state = IB_QPS_INIT;
-	qp_attr.qp_access_flags = IB_ACCESS_LOCAL_WRITE;
+	qp_attr.qp_access_flags = 0;
 	qp_attr.port_num = id_priv->id.port_num;
 	return ib_modify_qp(qp, &qp_attr, IB_QP_STATE | IB_QP_ACCESS_FLAGS |
 					  IB_QP_PKEY_INDEX | IB_QP_PORT);
@@ -935,13 +935,8 @@ static int cma_req_handler(struct ib_cm_
 	mutex_lock(&lock);
 	ret = cma_acquire_dev(conn_id);
 	mutex_unlock(&lock);
-	if (ret) {
-		ret = -ENODEV;
-		cma_exch(conn_id, CMA_DESTROYING);
-		cma_release_remove(conn_id);
-		rdma_destroy_id(&conn_id->id);
-		goto out;
-	}
+	if (ret)
+		goto release_conn_id;
 
 	conn_id->cm_id.ib = cm_id;
 	cm_id->context = conn_id;
@@ -951,13 +946,17 @@ static int cma_req_handler(struct ib_cm_
 	ret = cma_notify_user(conn_id, RDMA_CM_EVENT_CONNECT_REQUEST, 0,
 			      ib_event->private_data + offset,
 			      IB_CM_REQ_PRIVATE_DATA_SIZE - offset);
-	if (ret) {
-		/* Destroy the CM ID by returning a non-zero value. */
-		conn_id->cm_id.ib = NULL;
-		cma_exch(conn_id, CMA_DESTROYING);
-		cma_release_remove(conn_id);
-		rdma_destroy_id(&conn_id->id);
-	}
+	if (!ret)
+		goto out;
+
+	/* Destroy the CM ID by returning a non-zero value. */
+	conn_id->cm_id.ib = NULL;
+
+release_conn_id:
+	cma_exch(conn_id, CMA_DESTROYING);
+	cma_release_remove(conn_id);
+	rdma_destroy_id(&conn_id->id);
+
 out:
 	cma_release_remove(listen_id);
 	return ret;
@@ -1481,19 +1480,18 @@ static int cma_bind_loopback(struct rdma
 	u8 p;
 
 	mutex_lock(&lock);
+	if (list_empty(&dev_list)) {
+		ret = -ENODEV;
+		goto out;
+	}
 	list_for_each_entry(cma_dev, &dev_list, list)
 		for (p = 1; p <= cma_dev->device->phys_port_cnt; ++p)
-			if (!ib_query_port (cma_dev->device, p, &port_attr) &&
+			if (!ib_query_port(cma_dev->device, p, &port_attr) &&
 			    port_attr.state == IB_PORT_ACTIVE)
 				goto port_found;
 
-	if (!list_empty(&dev_list)) {
-		p = 1;
-		cma_dev = list_entry(dev_list.next, struct cma_device, list);
-	} else {
-		ret = -ENODEV;
-		goto out;
-	}
+	p = 1;
+	cma_dev = list_entry(dev_list.next, struct cma_device, list);
 
 port_found:
 	ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid);
@@ -2123,8 +2121,6 @@ static void cma_add_one(struct ib_device
 
 	cma_dev->device = device;
 	cma_dev->node_guid = device->node_guid;
-	if (!cma_dev->node_guid)
-		goto err;
 
 	init_completion(&cma_dev->comp);
 	atomic_set(&cma_dev->refcount, 1);
@@ -2136,9 +2132,6 @@ static void cma_add_one(struct ib_device
 	list_for_each_entry(id_priv, &listen_any_list, list)
 		cma_listen_on_dev(id_priv, cma_dev);
 	mutex_unlock(&lock);
-	return;
-err:
-	kfree(cma_dev);
 }
 
 static int cma_remove_id_dev(struct rdma_id_private *id_priv)
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index c3fb304..cf797d7 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -80,7 +80,7 @@ struct iwcm_work {
  * 1) in the event upcall, cm_event_handler(), for a listening cm_id.  If
  *    the backlog is exceeded, then no more connection request events will
  *    be processed.  cm_event_handler() returns -ENOMEM in this case.  Its up
- *    to the provider to reject the connectino request.
+ *    to the provider to reject the connection request.
  * 2) in the connection request workqueue handler, cm_conn_req_handler().
  *    If work elements cannot be allocated for the new connect request cm_id,
  *    then IWCM will call the provider reject method.  This is ok since
@@ -131,26 +131,25 @@ static int alloc_work_entries(struct iwc
 }
 
 /*
- * Save private data from incoming connection requests in the
- * cm_id_priv so the low level driver doesn't have to.  Adjust
+ * Save private data from incoming connection requests to
+ * iw_cm_event, so the low level driver doesn't have to. Adjust
  * the event ptr to point to the local copy.
  */
-static int copy_private_data(struct iwcm_id_private *cm_id_priv,
-		       struct iw_cm_event *event)
+static int copy_private_data(struct iw_cm_event *event)
 {
 	void *p;
 
-	p = kmalloc(event->private_data_len, GFP_ATOMIC);
+	p = kmemdup(event->private_data, event->private_data_len, GFP_ATOMIC);
 	if (!p)
 		return -ENOMEM;
-	memcpy(p, event->private_data, event->private_data_len);
 	event->private_data = p;
 	return 0;
 }
 
 /*
- * Release a reference on cm_id. If the last reference is being removed
- * and iw_destroy_cm_id is waiting, wake up the waiting thread.
+ * Release a reference on cm_id. If the last reference is being
+ * released, enable the waiting thread (in iw_destroy_cm_id) to
+ * get woken up, and return 1 if a thread is already waiting.
  */
 static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv)
 {
@@ -243,7 +242,7 @@ static int iwcm_modify_qp_sqd(struct ib_
 /*
  * CM_ID <-- CLOSING
  *
- * Block if a passive or active connection is currenlty being processed. Then
+ * Block if a passive or active connection is currently being processed. Then
  * process the event as follows:
  * - If we are ESTABLISHED, move to CLOSING and modify the QP state
  *   based on the abrupt flag
@@ -408,7 +407,7 @@ int iw_cm_listen(struct iw_cm_id *cm_id,
 {
 	struct iwcm_id_private *cm_id_priv;
 	unsigned long flags;
-	int ret = 0;
+	int ret;
 
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
 
@@ -535,7 +534,7 @@ EXPORT_SYMBOL(iw_cm_accept);
 int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param)
 {
 	struct iwcm_id_private *cm_id_priv;
-	int ret = 0;
+	int ret;
 	unsigned long flags;
 	struct ib_qp *qp;
 
@@ -620,7 +619,7 @@ static void cm_conn_req_handler(struct i
 	spin_lock_irqsave(&listen_id_priv->lock, flags);
 	if (listen_id_priv->state != IW_CM_STATE_LISTEN) {
 		spin_unlock_irqrestore(&listen_id_priv->lock, flags);
-		return;
+		goto out;
 	}
 	spin_unlock_irqrestore(&listen_id_priv->lock, flags);
 
@@ -629,7 +628,7 @@ static void cm_conn_req_handler(struct i
 				listen_id_priv->id.context);
 	/* If the cm_id could not be created, ignore the request */
 	if (IS_ERR(cm_id))
-		return;
+		goto out;
 
 	cm_id->provider_data = iw_event->provider_data;
 	cm_id->local_addr = iw_event->local_addr;
@@ -642,7 +641,7 @@ static void cm_conn_req_handler(struct i
 	if (ret) {
 		iw_cm_reject(cm_id, NULL, 0);
 		iw_destroy_cm_id(cm_id);
-		return;
+		goto out;
 	}
 
 	/* Call the client CM handler */
@@ -654,6 +653,7 @@ static void cm_conn_req_handler(struct i
 			kfree(cm_id);
 	}
 
+out:
 	if (iw_event->private_data_len)
 		kfree(iw_event->private_data);
 }
@@ -674,7 +674,7 @@ static int cm_conn_est_handler(struct iw
 			       struct iw_cm_event *iw_event)
 {
 	unsigned long flags;
-	int ret = 0;
+	int ret;
 
 	spin_lock_irqsave(&cm_id_priv->lock, flags);
 
@@ -704,7 +704,7 @@ static int cm_conn_rep_handler(struct iw
 			       struct iw_cm_event *iw_event)
 {
 	unsigned long flags;
-	int ret = 0;
+	int ret;
 
 	spin_lock_irqsave(&cm_id_priv->lock, flags);
 	/*
@@ -830,7 +830,8 @@ static int process_event(struct iwcm_id_
  */
 static void cm_work_handler(void *arg)
 {
-	struct iwcm_work *work = arg, lwork;
+	struct iwcm_work *work = arg;
+	struct iw_cm_event levent;
 	struct iwcm_id_private *cm_id_priv = work->cm_id;
 	unsigned long flags;
 	int empty;
@@ -843,11 +844,11 @@ static void cm_work_handler(void *arg)
 				  struct iwcm_work, list);
 		list_del_init(&work->list);
 		empty = list_empty(&cm_id_priv->work_list);
-		lwork = *work;
+		levent = work->event;
 		put_work(work);
 		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
 
-		ret = process_event(cm_id_priv, &work->event);
+		ret = process_event(cm_id_priv, &levent);
 		if (ret) {
 			set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
 			destroy_cm_id(&cm_id_priv->id);
@@ -906,7 +907,7 @@ static int cm_event_handler(struct iw_cm
 	if ((work->event.event == IW_CM_EVENT_CONNECT_REQUEST ||
 	     work->event.event == IW_CM_EVENT_CONNECT_REPLY) &&
 	    work->event.private_data_len) {
-		ret = copy_private_data(cm_id_priv, &work->event);
+		ret = copy_private_data(&work->event);
 		if (ret) {
 			put_work(work);
 			goto out;
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index a72bcea..3f9c162 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -46,7 +46,7 @@ MODULE_DESCRIPTION("kernel IB MAD API");
 MODULE_AUTHOR("Hal Rosenstock");
 MODULE_AUTHOR("Sean Hefty");
 
-static kmem_cache_t *ib_mad_cache;
+static struct kmem_cache *ib_mad_cache;
 
 static struct list_head ib_mad_port_list;
 static u32 ib_mad_client_id = 0;
diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c
index ad4f4d5..f15220a 100644
--- a/drivers/infiniband/core/ucm.c
+++ b/drivers/infiniband/core/ucm.c
@@ -161,12 +161,14 @@ static void ib_ucm_cleanup_events(struct
 				    struct ib_ucm_event, ctx_list);
 		list_del(&uevent->file_list);
 		list_del(&uevent->ctx_list);
+		mutex_unlock(&ctx->file->file_mutex);
 
 		/* clear incoming connections. */
 		if (ib_ucm_new_cm_id(uevent->resp.event))
 			ib_destroy_cm_id(uevent->cm_id);
 
 		kfree(uevent);
+		mutex_lock(&ctx->file->file_mutex);
 	}
 	mutex_unlock(&ctx->file->file_mutex);
 }
@@ -328,20 +330,18 @@ static int ib_ucm_event_process(struct i
 	}
 
 	if (uvt->data_len) {
-		uvt->data = kmalloc(uvt->data_len, GFP_KERNEL);
+		uvt->data = kmemdup(evt->private_data, uvt->data_len, GFP_KERNEL);
 		if (!uvt->data)
 			goto err1;
 
-		memcpy(uvt->data, evt->private_data, uvt->data_len);
 		uvt->resp.present |= IB_UCM_PRES_DATA;
 	}
 
 	if (uvt->info_len) {
-		uvt->info = kmalloc(uvt->info_len, GFP_KERNEL);
+		uvt->info = kmemdup(info, uvt->info_len, GFP_KERNEL);
 		if (!uvt->info)
 			goto err2;
 
-		memcpy(uvt->info, info, uvt->info_len);
 		uvt->resp.present |= IB_UCM_PRES_INFO;
 	}
 	return 0;
@@ -685,11 +685,11 @@ out:
 	return result;
 }
 
-static ssize_t ib_ucm_establish(struct ib_ucm_file *file,
-				const char __user *inbuf,
-				int in_len, int out_len)
+static ssize_t ib_ucm_notify(struct ib_ucm_file *file,
+			     const char __user *inbuf,
+			     int in_len, int out_len)
 {
-	struct ib_ucm_establish cmd;
+	struct ib_ucm_notify cmd;
 	struct ib_ucm_context *ctx;
 	int result;
 
@@ -700,7 +700,7 @@ static ssize_t ib_ucm_establish(struct i
 	if (IS_ERR(ctx))
 		return PTR_ERR(ctx);
 
-	result = ib_cm_establish(ctx->cm_id);
+	result = ib_cm_notify(ctx->cm_id, (enum ib_event_type) cmd.event);
 	ib_ucm_ctx_put(ctx);
 	return result;
 }
@@ -1107,7 +1107,7 @@ static ssize_t (*ucm_cmd_table[])(struct
 	[IB_USER_CM_CMD_DESTROY_ID]    = ib_ucm_destroy_id,
 	[IB_USER_CM_CMD_ATTR_ID]       = ib_ucm_attr_id,
 	[IB_USER_CM_CMD_LISTEN]        = ib_ucm_listen,
-	[IB_USER_CM_CMD_ESTABLISH]     = ib_ucm_establish,
+	[IB_USER_CM_CMD_NOTIFY]        = ib_ucm_notify,
 	[IB_USER_CM_CMD_SEND_REQ]      = ib_ucm_send_req,
 	[IB_USER_CM_CMD_SEND_REP]      = ib_ucm_send_rep,
 	[IB_USER_CM_CMD_SEND_RTU]      = ib_ucm_send_rtu,
diff --git a/drivers/infiniband/hw/amso1100/c2.h b/drivers/infiniband/hw/amso1100/c2.h
index 1b17dcd..04a9db5 100644
--- a/drivers/infiniband/hw/amso1100/c2.h
+++ b/drivers/infiniband/hw/amso1100/c2.h
@@ -302,7 +302,7 @@ struct c2_dev {
 	unsigned long pa;	/* PA device memory */
 	void **qptr_array;
 
-	kmem_cache_t *host_msg_cache;
+	struct kmem_cache *host_msg_cache;
 
 	struct list_head cca_link;		/* adapter list */
 	struct list_head eh_wakeup_list;	/* event wakeup list */
diff --git a/drivers/infiniband/hw/amso1100/c2_qp.c b/drivers/infiniband/hw/amso1100/c2_qp.c
index 5bcf697..179d005 100644
--- a/drivers/infiniband/hw/amso1100/c2_qp.c
+++ b/drivers/infiniband/hw/amso1100/c2_qp.c
@@ -564,6 +564,32 @@ int c2_alloc_qp(struct c2_dev *c2dev,
 	return err;
 }
 
+static inline void c2_lock_cqs(struct c2_cq *send_cq, struct c2_cq *recv_cq)
+{
+	if (send_cq == recv_cq)
+		spin_lock_irq(&send_cq->lock);
+	else if (send_cq > recv_cq) {
+		spin_lock_irq(&send_cq->lock);
+		spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
+	} else {
+		spin_lock_irq(&recv_cq->lock);
+		spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
+	}
+}
+
+static inline void c2_unlock_cqs(struct c2_cq *send_cq, struct c2_cq *recv_cq)
+{
+	if (send_cq == recv_cq)
+		spin_unlock_irq(&send_cq->lock);
+	else if (send_cq > recv_cq) {
+		spin_unlock(&recv_cq->lock);
+		spin_unlock_irq(&send_cq->lock);
+	} else {
+		spin_unlock(&send_cq->lock);
+		spin_unlock_irq(&recv_cq->lock);
+	}
+}
+
 void c2_free_qp(struct c2_dev *c2dev, struct c2_qp *qp)
 {
 	struct c2_cq *send_cq;
@@ -576,15 +602,9 @@ void c2_free_qp(struct c2_dev *c2dev, st
 	 * Lock CQs here, so that CQ polling code can do QP lookup
 	 * without taking a lock.
 	 */
-	spin_lock_irq(&send_cq->lock);
-	if (send_cq != recv_cq)
-		spin_lock(&recv_cq->lock);
-
+	c2_lock_cqs(send_cq, recv_cq);
 	c2_free_qpn(c2dev, qp->qpn);
-
-	if (send_cq != recv_cq)
-		spin_unlock(&recv_cq->lock);
-	spin_unlock_irq(&send_cq->lock);
+	c2_unlock_cqs(send_cq, recv_cq);
 
 	/*
 	 * Destory qp in the rnic...
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index 623dc95..1687c51 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -441,7 +441,7 @@ static int c2_rnic_close(struct c2_dev *
  * involves initalizing the various limits and resouce pools that
  * comprise the RNIC instance.
  */
-int c2_rnic_init(struct c2_dev *c2dev)
+int __devinit c2_rnic_init(struct c2_dev *c2dev)
 {
 	int err;
 	u32 qsize, msgsize;
@@ -611,7 +611,7 @@ int c2_rnic_init(struct c2_dev *c2dev)
 /*
  * Called by c2_remove to cleanup the RNIC resources.
  */
-void c2_rnic_term(struct c2_dev *c2dev)
+void __devexit c2_rnic_term(struct c2_dev *c2dev)
 {
 
 	/* Close the open adapter instance */
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 01f5aa9..3d1c1c5 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -52,7 +52,7 @@ #include "hcp_if.h"
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
 MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
-MODULE_VERSION("SVNEHCA_0018");
+MODULE_VERSION("SVNEHCA_0019");
 
 int ehca_open_aqp1     = 0;
 int ehca_debug_level   = 0;
@@ -790,7 +790,7 @@ int __init ehca_module_init(void)
 	int ret;
 
 	printk(KERN_INFO "eHCA Infiniband Device Driver "
-	                 "(Rel.: SVNEHCA_0018)\n");
+	                 "(Rel.: SVNEHCA_0019)\n");
 	idr_init(&ehca_qp_idr);
 	idr_init(&ehca_cq_idr);
 	spin_lock_init(&ehca_qp_idr_lock);
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index cf3e50e..8682aa5 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -732,8 +732,7 @@ static int prepare_sqe_rts(struct ehca_q
 	u64 h_ret;
 	struct ipz_queue *squeue;
 	void *bad_send_wqe_p, *bad_send_wqe_v;
-	void *squeue_start_p, *squeue_end_p;
-	void *squeue_start_v, *squeue_end_v;
+	u64 q_ofs;
 	struct ehca_wqe *wqe;
 	int qp_num = my_qp->ib_qp.qp_num;
 
@@ -755,26 +754,23 @@ static int prepare_sqe_rts(struct ehca_q
 	if (ehca_debug_level)
 		ehca_dmp(bad_send_wqe_v, 32, "qp_num=%x bad_wqe", qp_num);
 	squeue = &my_qp->ipz_squeue;
-	squeue_start_p = (void*)virt_to_abs(ipz_qeit_calc(squeue, 0L));
-	squeue_end_p = squeue_start_p+squeue->queue_length;
-	squeue_start_v = abs_to_virt((u64)squeue_start_p);
-	squeue_end_v = abs_to_virt((u64)squeue_end_p);
-	ehca_dbg(&shca->ib_device, "qp_num=%x squeue_start_v=%p squeue_end_v=%p",
-		 qp_num, squeue_start_v, squeue_end_v);
+	if (ipz_queue_abs_to_offset(squeue, (u64)bad_send_wqe_p, &q_ofs)) {
+		ehca_err(&shca->ib_device, "failed to get wqe offset qp_num=%x"
+			 " bad_send_wqe_p=%p", qp_num, bad_send_wqe_p);
+		return -EFAULT;
+	}
 
 	/* loop sets wqe's purge bit */
-	wqe = (struct ehca_wqe*)bad_send_wqe_v;
+	wqe = (struct ehca_wqe*)ipz_qeit_calc(squeue, q_ofs);
 	*bad_wqe_cnt = 0;
 	while (wqe->optype != 0xff && wqe->wqef != 0xff) {
 		if (ehca_debug_level)
 			ehca_dmp(wqe, 32, "qp_num=%x wqe", qp_num);
 		wqe->nr_of_data_seg = 0; /* suppress data access */
 		wqe->wqef = WQEF_PURGE; /* WQE to be purged */
-		wqe = (struct ehca_wqe*)((u8*)wqe+squeue->qe_size);
+		q_ofs = ipz_queue_advance_offset(squeue, q_ofs);
+		wqe = (struct ehca_wqe*)ipz_qeit_calc(squeue, q_ofs);
 		*bad_wqe_cnt = (*bad_wqe_cnt)+1;
-		if ((void*)wqe >= squeue_end_v) {
-			wqe = squeue_start_v;
-		}
 	}
 	/*
 	 * bad wqe will be reprocessed and ignored when pol_cq() is called,
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.c b/drivers/infiniband/hw/ehca/ipz_pt_fn.c
index e028ff1..bf7a400 100644
--- a/drivers/infiniband/hw/ehca/ipz_pt_fn.c
+++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.c
@@ -70,6 +70,19 @@ void *ipz_qeit_eq_get_inc(struct ipz_que
 	return ret;
 }
 
+int ipz_queue_abs_to_offset(struct ipz_queue *queue, u64 addr, u64 *q_offset)
+{
+	int i;
+	for (i = 0; i < queue->queue_length / queue->pagesize; i++) {
+		u64 page = (u64)virt_to_abs(queue->queue_pages[i]);
+		if (addr >= page && addr < page + queue->pagesize) {
+			*q_offset = addr - page + i * queue->pagesize;
+			return 0;
+		}
+	}
+	return -EINVAL;
+}
+
 int ipz_queue_ctor(struct ipz_queue *queue,
 		   const u32 nr_of_pages,
 		   const u32 pagesize, const u32 qe_size, const u32 nr_of_sg)
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.h b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
index 2f13509..dc3bda2 100644
--- a/drivers/infiniband/hw/ehca/ipz_pt_fn.h
+++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
@@ -150,6 +150,21 @@ static inline void *ipz_qeit_reset(struc
 	return ipz_qeit_get(queue);
 }
 
+/*
+ * return the q_offset corresponding to an absolute address
+ */
+int ipz_queue_abs_to_offset(struct ipz_queue *queue, u64 addr, u64 *q_offset);
+
+/*
+ * return the next queue offset. don't modify the queue.
+ */
+static inline u64 ipz_queue_advance_offset(struct ipz_queue *queue, u64 offset)
+{
+	offset += queue->qe_size;
+	if (offset >= queue->queue_length) offset = 0;
+	return offset;
+}
+
 /* struct generic page table */
 struct ipz_pt {
 	u64 entries[EHCA_PT_ENTRIES];
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
index a545610..acdee33 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
@@ -1487,7 +1487,7 @@ int ipath_register_ib_device(struct ipat
 	idev->pma_counter_select[1] = IB_PMA_PORT_RCV_DATA;
 	idev->pma_counter_select[2] = IB_PMA_PORT_XMIT_PKTS;
 	idev->pma_counter_select[3] = IB_PMA_PORT_RCV_PKTS;
-	idev->pma_counter_select[5] = IB_PMA_PORT_XMIT_WAIT;
+	idev->pma_counter_select[4] = IB_PMA_PORT_XMIT_WAIT;
 	idev->link_width_enabled = 3;	/* 1x or 4x */
 
 	/* Snapshot current HW counters to "clear" them. */
diff --git a/drivers/infiniband/hw/mthca/mthca_av.c b/drivers/infiniband/hw/mthca/mthca_av.c
index 6959945..57cdc1b 100644
--- a/drivers/infiniband/hw/mthca/mthca_av.c
+++ b/drivers/infiniband/hw/mthca/mthca_av.c
@@ -33,7 +33,6 @@
  * $Id: mthca_av.c 1349 2004-12-16 21:09:43Z roland $
  */
 
-#include <linux/init.h>
 #include <linux/string.h>
 #include <linux/slab.h>
 
@@ -323,7 +322,7 @@ int mthca_ah_query(struct ib_ah *ibah, s
 	return 0;
 }
 
-int __devinit mthca_init_av_table(struct mthca_dev *dev)
+int mthca_init_av_table(struct mthca_dev *dev)
 {
 	int err;
 
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index 149b369..283d50b 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -36,7 +36,6 @@
  * $Id: mthca_cq.c 1369 2004-12-20 16:17:07Z roland $
  */
 
-#include <linux/init.h>
 #include <linux/hardirq.h>
 
 #include <asm/io.h>
@@ -970,7 +969,7 @@ void mthca_free_cq(struct mthca_dev *dev
 	mthca_free_mailbox(dev, mailbox);
 }
 
-int __devinit mthca_init_cq_table(struct mthca_dev *dev)
+int mthca_init_cq_table(struct mthca_dev *dev)
 {
 	int err;
 
diff --git a/drivers/infiniband/hw/mthca/mthca_eq.c b/drivers/infiniband/hw/mthca/mthca_eq.c
index e284e06..8ec9fa1 100644
--- a/drivers/infiniband/hw/mthca/mthca_eq.c
+++ b/drivers/infiniband/hw/mthca/mthca_eq.c
@@ -33,7 +33,6 @@
  * $Id: mthca_eq.c 1382 2004-12-24 02:21:02Z roland $
  */
 
-#include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
 #include <linux/pci.h>
@@ -479,10 +478,10 @@ static irqreturn_t mthca_arbel_msi_x_int
 	return IRQ_HANDLED;
 }
 
-static int __devinit mthca_create_eq(struct mthca_dev *dev,
-				     int nent,
-				     u8 intr,
-				     struct mthca_eq *eq)
+static int mthca_create_eq(struct mthca_dev *dev,
+			   int nent,
+			   u8 intr,
+			   struct mthca_eq *eq)
 {
 	int npages;
 	u64 *dma_list = NULL;
@@ -664,9 +663,9 @@ static void mthca_free_irqs(struct mthca
 				 dev->eq_table.eq + i);
 }
 
-static int __devinit mthca_map_reg(struct mthca_dev *dev,
-				   unsigned long offset, unsigned long size,
-				   void __iomem **map)
+static int mthca_map_reg(struct mthca_dev *dev,
+			 unsigned long offset, unsigned long size,
+			 void __iomem **map)
 {
 	unsigned long base = pci_resource_start(dev->pdev, 0);
 
@@ -691,7 +690,7 @@ static void mthca_unmap_reg(struct mthca
 	iounmap(map);
 }
 
-static int __devinit mthca_map_eq_regs(struct mthca_dev *dev)
+static int mthca_map_eq_regs(struct mthca_dev *dev)
 {
 	if (mthca_is_memfree(dev)) {
 		/*
@@ -781,7 +780,7 @@ static void mthca_unmap_eq_regs(struct m
 	}
 }
 
-int __devinit mthca_map_eq_icm(struct mthca_dev *dev, u64 icm_virt)
+int mthca_map_eq_icm(struct mthca_dev *dev, u64 icm_virt)
 {
 	int ret;
 	u8 status;
@@ -825,7 +824,7 @@ void mthca_unmap_eq_icm(struct mthca_dev
 	__free_page(dev->eq_table.icm_page);
 }
 
-int __devinit mthca_init_eq_table(struct mthca_dev *dev)
+int mthca_init_eq_table(struct mthca_dev *dev)
 {
 	int err;
 	u8 status;
diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c
index 45e106f..acfa41d 100644
--- a/drivers/infiniband/hw/mthca/mthca_mad.c
+++ b/drivers/infiniband/hw/mthca/mthca_mad.c
@@ -317,7 +317,7 @@ err:
 	return ret;
 }
 
-void __devexit mthca_free_agents(struct mthca_dev *dev)
+void mthca_free_agents(struct mthca_dev *dev)
 {
 	struct ib_mad_agent *agent;
 	int p, q;
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c
index 47ea021..0491ec7 100644
--- a/drivers/infiniband/hw/mthca/mthca_main.c
+++ b/drivers/infiniband/hw/mthca/mthca_main.c
@@ -98,7 +98,7 @@ static struct mthca_profile default_prof
 	.uarc_size	   = 1 << 18,	/* Arbel only */
 };
 
-static int __devinit mthca_tune_pci(struct mthca_dev *mdev)
+static int mthca_tune_pci(struct mthca_dev *mdev)
 {
 	int cap;
 	u16 val;
@@ -143,7 +143,7 @@ static int __devinit mthca_tune_pci(stru
 	return 0;
 }
 
-static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
+static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
 {
 	int err;
 	u8 status;
@@ -255,7 +255,7 @@ static int __devinit mthca_dev_lim(struc
 	return 0;
 }
 
-static int __devinit mthca_init_tavor(struct mthca_dev *mdev)
+static int mthca_init_tavor(struct mthca_dev *mdev)
 {
 	u8 status;
 	int err;
@@ -333,7 +333,7 @@ err_disable:
 	return err;
 }
 
-static int __devinit mthca_load_fw(struct mthca_dev *mdev)
+static int mthca_load_fw(struct mthca_dev *mdev)
 {
 	u8 status;
 	int err;
@@ -379,10 +379,10 @@ err_free:
 	return err;
 }
 
-static int __devinit mthca_init_icm(struct mthca_dev *mdev,
-				    struct mthca_dev_lim *dev_lim,
-				    struct mthca_init_hca_param *init_hca,
-				    u64 icm_size)
+static int mthca_init_icm(struct mthca_dev *mdev,
+			  struct mthca_dev_lim *dev_lim,
+			  struct mthca_init_hca_param *init_hca,
+			  u64 icm_size)
 {
 	u64 aux_pages;
 	u8 status;
@@ -575,7 +575,7 @@ static void mthca_free_icms(struct mthca
 	mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
 }
 
-static int __devinit mthca_init_arbel(struct mthca_dev *mdev)
+static int mthca_init_arbel(struct mthca_dev *mdev)
 {
 	struct mthca_dev_lim        dev_lim;
 	struct mthca_profile        profile;
@@ -683,7 +683,7 @@ static void mthca_close_hca(struct mthca
 		mthca_SYS_DIS(mdev, &status);
 }
 
-static int __devinit mthca_init_hca(struct mthca_dev *mdev)
+static int mthca_init_hca(struct mthca_dev *mdev)
 {
 	u8 status;
 	int err;
@@ -720,7 +720,7 @@ err_close:
 	return err;
 }
 
-static int __devinit mthca_setup_hca(struct mthca_dev *dev)
+static int mthca_setup_hca(struct mthca_dev *dev)
 {
 	int err;
 	u8 status;
@@ -875,8 +875,7 @@ err_uar_table_free:
 	return err;
 }
 
-static int __devinit mthca_request_regions(struct pci_dev *pdev,
-					   int ddr_hidden)
+static int mthca_request_regions(struct pci_dev *pdev, int ddr_hidden)
 {
 	int err;
 
@@ -928,7 +927,7 @@ static void mthca_release_regions(struct
 			   MTHCA_HCR_SIZE);
 }
 
-static int __devinit mthca_enable_msi_x(struct mthca_dev *mdev)
+static int mthca_enable_msi_x(struct mthca_dev *mdev)
 {
 	struct msix_entry entries[3];
 	int err;
@@ -1213,7 +1212,7 @@ int __mthca_restart_one(struct pci_dev *
 }
 
 static int __devinit mthca_init_one(struct pci_dev *pdev,
-			     const struct pci_device_id *id)
+				    const struct pci_device_id *id)
 {
 	static int mthca_version_printed = 0;
 	int ret;
diff --git a/drivers/infiniband/hw/mthca/mthca_mcg.c b/drivers/infiniband/hw/mthca/mthca_mcg.c
index 47ca8a9..a8ad072 100644
--- a/drivers/infiniband/hw/mthca/mthca_mcg.c
+++ b/drivers/infiniband/hw/mthca/mthca_mcg.c
@@ -32,7 +32,6 @@
  * $Id: mthca_mcg.c 1349 2004-12-16 21:09:43Z roland $
  */
 
-#include <linux/init.h>
 #include <linux/string.h>
 #include <linux/slab.h>
 
@@ -371,7 +370,7 @@ int mthca_multicast_detach(struct ib_qp
 	return err;
 }
 
-int __devinit mthca_init_mcg_table(struct mthca_dev *dev)
+int mthca_init_mcg_table(struct mthca_dev *dev)
 {
 	int err;
 	int table_size = dev->limits.num_mgms + dev->limits.num_amgms;
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index a486dec..f71ffa8 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -34,7 +34,6 @@
  */
 
 #include <linux/slab.h>
-#include <linux/init.h>
 #include <linux/errno.h>
 
 #include "mthca_dev.h"
@@ -135,7 +134,7 @@ static void mthca_buddy_free(struct mthc
 	spin_unlock(&buddy->lock);
 }
 
-static int __devinit mthca_buddy_init(struct mthca_buddy *buddy, int max_order)
+static int mthca_buddy_init(struct mthca_buddy *buddy, int max_order)
 {
 	int i, s;
 
@@ -759,7 +758,7 @@ void mthca_arbel_fmr_unmap(struct mthca_
 	*(u8 *) fmr->mem.arbel.mpt = MTHCA_MPT_STATUS_SW;
 }
 
-int __devinit mthca_init_mr_table(struct mthca_dev *dev)
+int mthca_init_mr_table(struct mthca_dev *dev)
 {
 	unsigned long addr;
 	int err, i;
diff --git a/drivers/infiniband/hw/mthca/mthca_pd.c b/drivers/infiniband/hw/mthca/mthca_pd.c
index 59df516..c1e9507 100644
--- a/drivers/infiniband/hw/mthca/mthca_pd.c
+++ b/drivers/infiniband/hw/mthca/mthca_pd.c
@@ -34,7 +34,6 @@
  * $Id: mthca_pd.c 1349 2004-12-16 21:09:43Z roland $
  */
 
-#include <linux/init.h>
 #include <linux/errno.h>
 
 #include "mthca_dev.h"
@@ -69,7 +68,7 @@ void mthca_pd_free(struct mthca_dev *dev
 	mthca_free(&dev->pd_table.alloc, pd->pd_num);
 }
 
-int __devinit mthca_init_pd_table(struct mthca_dev *dev)
+int mthca_init_pd_table(struct mthca_dev *dev)
 {
 	return mthca_alloc_init(&dev->pd_table.alloc,
 				dev->limits.num_pds,
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c
index fc67f78..21422a3 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -1100,11 +1100,10 @@ static struct ib_fmr *mthca_alloc_fmr(st
 	struct mthca_fmr *fmr;
 	int err;
 
-	fmr = kmalloc(sizeof *fmr, GFP_KERNEL);
+	fmr = kmemdup(fmr_attr, sizeof *fmr, GFP_KERNEL);
 	if (!fmr)
 		return ERR_PTR(-ENOMEM);
 
-	memcpy(&fmr->attr, fmr_attr, sizeof *fmr_attr);
 	err = mthca_fmr_alloc(to_mdev(pd->device), to_mpd(pd)->pd_num,
 			     convert_access(mr_access_flags), fmr);
 
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index 6a7822e..33e3ba7 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -35,7 +35,6 @@
  * $Id: mthca_qp.c 1355 2004-12-17 15:23:43Z roland $
  */
 
-#include <linux/init.h>
 #include <linux/string.h>
 #include <linux/slab.h>
 
@@ -2241,7 +2240,7 @@ void mthca_free_err_wqe(struct mthca_dev
 		*new_wqe = 0;
 }
 
-int __devinit mthca_init_qp_table(struct mthca_dev *dev)
+int mthca_init_qp_table(struct mthca_dev *dev)
 {
 	int err;
 	u8 status;
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c
index f5d7677..34d2c47 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -120,7 +120,7 @@ static void mthca_arbel_init_srq_context
 
 	memset(context, 0, sizeof *context);
 
-	logsize = long_log2(srq->max) + srq->wqe_shift;
+	logsize = long_log2(srq->max);
 	context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn);
 	context->lkey = cpu_to_be32(srq->mr.ibmr.lkey);
 	context->db_index = cpu_to_be32(srq->db_index);
@@ -715,7 +715,7 @@ int mthca_max_srq_sge(struct mthca_dev *
 		     sizeof (struct mthca_data_seg));
 }
 
-int __devinit mthca_init_srq_table(struct mthca_dev *dev)
+int mthca_init_srq_table(struct mthca_dev *dev)
 {
 	int err;
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 0b8a79d..f2b6185 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -233,7 +233,7 @@ static inline struct ipoib_neigh **to_ip
 }
 
 struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh);
-void ipoib_neigh_free(struct ipoib_neigh *neigh);
+void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh);
 
 extern struct workqueue_struct *ipoib_workqueue;
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 85522da..5ba3154 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -264,7 +264,7 @@ static void path_free(struct net_device
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 
-		ipoib_neigh_free(neigh);
+		ipoib_neigh_free(dev, neigh);
 	}
 
 	spin_unlock_irqrestore(&priv->lock, flags);
@@ -525,10 +525,11 @@ static void neigh_add_path(struct sk_buf
 		ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha));
 	} else {
 		neigh->ah  = NULL;
-		__skb_queue_tail(&neigh->queue, skb);
 
 		if (!path->query && path_rec_start(dev, path))
 			goto err_list;
+
+		__skb_queue_tail(&neigh->queue, skb);
 	}
 
 	spin_unlock(&priv->lock);
@@ -538,7 +539,7 @@ err_list:
 	list_del(&neigh->list);
 
 err_path:
-	ipoib_neigh_free(neigh);
+	ipoib_neigh_free(dev, neigh);
 	++priv->stats.tx_dropped;
 	dev_kfree_skb_any(skb);
 
@@ -655,7 +656,7 @@ static int ipoib_start_xmit(struct sk_bu
 				 */
 				ipoib_put_ah(neigh->ah);
 				list_del(&neigh->list);
-				ipoib_neigh_free(neigh);
+				ipoib_neigh_free(dev, neigh);
 				spin_unlock(&priv->lock);
 				ipoib_path_lookup(skb, dev);
 				goto out;
@@ -786,7 +787,7 @@ static void ipoib_neigh_destructor(struc
 		if (neigh->ah)
 			ah = neigh->ah;
 		list_del(&neigh->list);
-		ipoib_neigh_free(neigh);
+		ipoib_neigh_free(n->dev, neigh);
 	}
 
 	spin_unlock_irqrestore(&priv->lock, flags);
@@ -809,9 +810,15 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
 	return neigh;
 }
 
-void ipoib_neigh_free(struct ipoib_neigh *neigh)
+void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
 {
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+	struct sk_buff *skb;
 	*to_ipoib_neigh(neigh->neighbour) = NULL;
+	while ((skb = __skb_dequeue(&neigh->queue))) {
+		++priv->stats.tx_dropped;
+		dev_kfree_skb_any(skb);
+	}
 	kfree(neigh);
 }
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 3faa182..d282d65 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -114,7 +114,7 @@ static void ipoib_mcast_free(struct ipoi
 		 */
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
-		ipoib_neigh_free(neigh);
+		ipoib_neigh_free(dev, neigh);
 	}
 
 	spin_unlock_irqrestore(&priv->lock, flags);
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index 9c53916..234e5b0 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -283,7 +283,7 @@ struct iser_global {
 	struct mutex      connlist_mutex;
 	struct list_head  connlist;		/* all iSER IB connections */
 
-	kmem_cache_t *desc_cache;
+	struct kmem_cache *desc_cache;
 };
 
 extern struct iser_global ig;
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 4b09147..64ab5fc 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -1176,9 +1176,11 @@ static int srp_cm_handler(struct ib_cm_i
 			break;
 		}
 
-		target->status = srp_alloc_iu_bufs(target);
-		if (target->status)
-			break;
+		if (!target->rx_ring[0]) {
+			target->status = srp_alloc_iu_bufs(target);
+			if (target->status)
+				break;
+		}
 
 		qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL);
 		if (!qp_attr) {
@@ -1716,7 +1718,8 @@ static ssize_t srp_create_target(struct
 	if (!target_host)
 		return -ENOMEM;
 
-	target_host->max_lun = SRP_MAX_LUN;
+	target_host->max_lun     = SRP_MAX_LUN;
+	target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;
 
 	target = host_to_target(target_host);
 
diff --git a/include/rdma/ib_cm.h b/include/rdma/ib_cm.h
index c9b4738..5c07017 100644
--- a/include/rdma/ib_cm.h
+++ b/include/rdma/ib_cm.h
@@ -60,6 +60,7 @@ enum ib_cm_state {
 };
 
 enum ib_cm_lap_state {
+	IB_CM_LAP_UNINIT,
 	IB_CM_LAP_IDLE,
 	IB_CM_LAP_SENT,
 	IB_CM_LAP_RCVD,
@@ -443,13 +444,20 @@ int ib_send_cm_drep(struct ib_cm_id *cm_
 		    u8 private_data_len);
 
 /**
- * ib_cm_establish - Forces a connection state to established.
+ * ib_cm_notify - Notifies the CM of an event reported to the consumer.
  * @cm_id: Connection identifier to transition to established.
+ * @event: Type of event.
  *
- * This routine should be invoked by users who receive messages on a
- * connected QP before an RTU has been received.
+ * This routine should be invoked by users to notify the CM of relevant
+ * communication events.  Events that should be reported to the CM and
+ * when to report them are:
+ *
+ * IB_EVENT_COMM_EST - Used when a message is received on a connected
+ *    QP before an RTU has been received.
+ * IB_EVENT_PATH_MIG - Notifies the CM that the connection has failed over
+ *   to the alternate path.
  */
-int ib_cm_establish(struct ib_cm_id *cm_id);
+int ib_cm_notify(struct ib_cm_id *cm_id, enum ib_event_type event);
 
 /**
  * ib_send_cm_rej - Sends a connection rejection message to the
diff --git a/include/rdma/ib_user_cm.h b/include/rdma/ib_user_cm.h
index 066c20b..37650af 100644
--- a/include/rdma/ib_user_cm.h
+++ b/include/rdma/ib_user_cm.h
@@ -38,7 +38,7 @@ #define IB_USER_CM_H
 
 #include <rdma/ib_user_sa.h>
 
-#define IB_USER_CM_ABI_VERSION 4
+#define IB_USER_CM_ABI_VERSION 5
 
 enum {
 	IB_USER_CM_CMD_CREATE_ID,
@@ -46,7 +46,7 @@ enum {
 	IB_USER_CM_CMD_ATTR_ID,
 
 	IB_USER_CM_CMD_LISTEN,
-	IB_USER_CM_CMD_ESTABLISH,
+	IB_USER_CM_CMD_NOTIFY,
 
 	IB_USER_CM_CMD_SEND_REQ,
 	IB_USER_CM_CMD_SEND_REP,
@@ -117,8 +117,9 @@ struct ib_ucm_listen {
 	__u32 reserved;
 };
 
-struct ib_ucm_establish {
+struct ib_ucm_notify {
 	__u32 id;
+	__u32 event;
 };
 
 struct ib_ucm_private_data {

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

* [GIT PULL] please pull infiniband.git
@ 2006-11-20 18:44 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-11-20 18:44 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This includes one small fixes for 2.6.19-rc6:

Michael S. Tsirkin (1):
      IPoIB: Clear high octet in QP number

 drivers/infiniband/ulp/ipoib/ipoib_main.c |   15 +++++++--------
 1 files changed, 7 insertions(+), 8 deletions(-)


commit 073ae841d6a5098f7c6e17fc1f329350d950d1ce
Author: Michael S. Tsirkin <mst@mellanox.co.il>
Date:   Thu Nov 16 10:59:12 2006 +0200

    IPoIB: Clear high octet in QP number
    
    IPoIB assumes that high (reserved) octet in the hardware address is 0,
    and copies it into the QPN.  This violates RFC 4391 (which requires
    that the high 8 bits are ignored on receive), and will result in an
    invalid QPN being used when interoperating with IPoIB connected mode.
    
    Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 1eaf00e..85522da 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -49,6 +49,8 @@ #include <linux/in.h>
 
 #include <net/dst.h>
 
+#define IPOIB_QPN(ha) (be32_to_cpup((__be32 *) ha) & 0xffffff)
+
 MODULE_AUTHOR("Roland Dreier");
 MODULE_DESCRIPTION("IP-over-InfiniBand net driver");
 MODULE_LICENSE("Dual BSD/GPL");
@@ -520,8 +522,7 @@ static void neigh_add_path(struct sk_buf
 		memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw,
 		       sizeof(union ib_gid));
 
-		ipoib_send(dev, skb, path->ah,
-			   be32_to_cpup((__be32 *) skb->dst->neighbour->ha));
+		ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha));
 	} else {
 		neigh->ah  = NULL;
 		__skb_queue_tail(&neigh->queue, skb);
@@ -599,8 +600,7 @@ static void unicast_arp_send(struct sk_b
 		ipoib_dbg(priv, "Send unicast ARP to %04x\n",
 			  be16_to_cpu(path->pathrec.dlid));
 
-		ipoib_send(dev, skb, path->ah,
-			   be32_to_cpup((__be32 *) phdr->hwaddr));
+		ipoib_send(dev, skb, path->ah, IPOIB_QPN(phdr->hwaddr));
 	} else if ((path->query || !path_rec_start(dev, path)) &&
 		   skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
 		/* put pseudoheader back on for next time */
@@ -661,8 +661,7 @@ static int ipoib_start_xmit(struct sk_bu
 				goto out;
 			}
 
-			ipoib_send(dev, skb, neigh->ah,
-				   be32_to_cpup((__be32 *) skb->dst->neighbour->ha));
+			ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb->dst->neighbour->ha));
 			goto out;
 		}
 
@@ -694,7 +693,7 @@ static int ipoib_start_xmit(struct sk_bu
 					   IPOIB_GID_FMT "\n",
 					   skb->dst ? "neigh" : "dst",
 					   be16_to_cpup((__be16 *) skb->data),
-					   be32_to_cpup((__be32 *) phdr->hwaddr),
+					   IPOIB_QPN(phdr->hwaddr),
 					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
 				dev_kfree_skb_any(skb);
 				++priv->stats.tx_dropped;
@@ -777,7 +776,7 @@ static void ipoib_neigh_destructor(struc
 
 	ipoib_dbg(priv,
 		  "neigh_destructor for %06x " IPOIB_GID_FMT "\n",
-		  be32_to_cpup((__be32 *) n->ha),
+		  IPOIB_QPN(n->ha),
 		  IPOIB_GID_RAW_ARG(n->ha + 4));
 
 	spin_lock_irqsave(&priv->lock, flags);

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

* [GIT PULL] please pull infiniband.git
@ 2006-11-13 17:42 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-11-13 17:42 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This includes various small fixes for 2.6.19-rc6:

Hoang-Nam Nguyen (3):
      IB/ehca: Assure 4K alignment for firmware control blocks
      IB/ehca: Use named constant for max mtu
      IB/ehca: Activate scaling code by default

Jean Delvare (1):
      RDMA/amso1100: Fix && typo

Roland Dreier (1):
      IB/mad: Fix race between cancel and receive completion

Tom Tucker (1):
      RDMA/amso1100: Fix unitialized pseudo_netdev accessed in c2_register_device

 drivers/infiniband/core/mad.c                |    2 +-
 drivers/infiniband/hw/amso1100/c2.c          |    3 +-
 drivers/infiniband/hw/amso1100/c2_provider.c |   39 +++++++++---------
 drivers/infiniband/hw/amso1100/c2_rnic.c     |    4 +-
 drivers/infiniband/hw/ehca/Kconfig           |    1 +
 drivers/infiniband/hw/ehca/ehca_av.c         |    5 +-
 drivers/infiniband/hw/ehca/ehca_hca.c        |   17 ++++----
 drivers/infiniband/hw/ehca/ehca_irq.c        |   17 ++++----
 drivers/infiniband/hw/ehca/ehca_iverbs.h     |    8 ++++
 drivers/infiniband/hw/ehca/ehca_main.c       |   56 +++++++++++++++++++++----
 drivers/infiniband/hw/ehca/ehca_mrmw.c       |    8 ++--
 drivers/infiniband/hw/ehca/ehca_qp.c         |   10 ++--
 drivers/infiniband/hw/ehca/hipz_hw.h         |    2 +
 13 files changed, 111 insertions(+), 61 deletions(-)

The full log and patch is below:

commit 39798695b4bcc7b145f8910ca56195808d3a7637
Author: Roland Dreier <rolandd@cisco.com>
Date:   Mon Nov 13 09:38:07 2006 -0800

    IB/mad: Fix race between cancel and receive completion
    
    When ib_cancel_mad() is called, it puts the canceled send on a list
    and schedules a "flushed" callback from process context.  However,
    this leaves a window where a receive completion could be processed
    before the send is fully flushed.
    
    This is fine, except that ib_find_send_mad() will find the MAD and
    return it to the receive processing, which results in the sender
    getting both a successful receive and a "flushed" send completion for
    the same request.  Understandably, this confuses the sender, which is
    expecting only one of these two callbacks, and leads to grief such as
    a use-after-free in IPoIB.
    
    Fix this by changing ib_find_send_mad() to return a send struct only
    if the status is still successful (and not "flushed").  The search of
    the send_list already had this check, so this patch just adds the same
    check to the search of the wait_list.
    
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit b26c791e9ca3365616d40836000285931ca033d0
Author: Jean Delvare <khali@linux-fr.org>
Date:   Thu Nov 9 21:02:26 2006 +0100

    RDMA/amso1100: Fix && typo
    
    Fix the AMSO1100 firmware version computation, which was broken
    due to "&&" being used where "&" should have.
    
    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit 2ffcab6ae44b02679229ca1852526d0a6e062dd2
Author: Tom Tucker <tom@opengridcomputing.com>
Date:   Wed Nov 8 14:23:22 2006 -0600

    RDMA/amso1100: Fix unitialized pseudo_netdev accessed in c2_register_device
    
    Rework some load-time error handling: c2_register_device() leaked when
    it failed, and the function that called it didn't check the return code.
    
    Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit f2c238a0c5e155acd49752c5fb93fb8d8534232b
Author: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Date:   Sun Nov 5 21:42:20 2006 +0100

    IB/ehca: Activate scaling code by default
    
    Change ehca's Kconfig to activates scaling code as default.  After
    several measurements we saw that this feature prevents dropped packets
    (UD) in stress situation. Thus, enabling it helps to improve ehca's
    bandwidth through IPoIB.
    
    Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit c58121143f87930621c1a6fa9683b6862f2b42c9
Author: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Date:   Sun Nov 5 21:42:56 2006 +0100

    IB/ehca: Use named constant for max mtu
    
    Define and use a constant EHCA_MAX_MTU instead hardcoded value.
    
    Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit 7e28db5d8ff63b1cabc221c5cb84a5f45752f1c2
Author: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Date:   Tue Nov 7 00:56:39 2006 +0100

    IB/ehca: Assure 4K alignment for firmware control blocks
    
    Assure 4K alignment for firmware control blocks in 64K page mode,
    because kzalloc()'s result address might not be 4K aligned if 64K
    pages are enabled. Thus, we introduce wrappers called
    ehca_{alloc,free}_fw_ctrlblock(), which use a slab cache for objects
    with 4K length and 4K alignment in order to alloc/free firmware
    control blocks in 64K page mode. In 4K page mode those wrappers just
    are defines of get_zeroed_page() and free_page().
    
    Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit 39798695b4bcc7b145f8910ca56195808d3a7637
Author: Roland Dreier <rolandd@cisco.com>
Date:   Mon Nov 13 09:38:07 2006 -0800

    IB/mad: Fix race between cancel and receive completion
    
    When ib_cancel_mad() is called, it puts the canceled send on a list
    and schedules a "flushed" callback from process context.  However,
    this leaves a window where a receive completion could be processed
    before the send is fully flushed.
    
    This is fine, except that ib_find_send_mad() will find the MAD and
    return it to the receive processing, which results in the sender
    getting both a successful receive and a "flushed" send completion for
    the same request.  Understandably, this confuses the sender, which is
    expecting only one of these two callbacks, and leads to grief such as
    a use-after-free in IPoIB.
    
    Fix this by changing ib_find_send_mad() to return a send struct only
    if the status is still successful (and not "flushed").  The search of
    the send_list already had this check, so this patch just adds the same
    check to the search of the wait_list.
    
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit b26c791e9ca3365616d40836000285931ca033d0
Author: Jean Delvare <khali@linux-fr.org>
Date:   Thu Nov 9 21:02:26 2006 +0100

    RDMA/amso1100: Fix && typo
    
    Fix the AMSO1100 firmware version computation, which was broken
    due to "&&" being used where "&" should have.
    
    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit 2ffcab6ae44b02679229ca1852526d0a6e062dd2
Author: Tom Tucker <tom@opengridcomputing.com>
Date:   Wed Nov 8 14:23:22 2006 -0600

    RDMA/amso1100: Fix unitialized pseudo_netdev accessed in c2_register_device
    
    Rework some load-time error handling: c2_register_device() leaked when
    it failed, and the function that called it didn't check the return code.
    
    Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit f2c238a0c5e155acd49752c5fb93fb8d8534232b
Author: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Date:   Sun Nov 5 21:42:20 2006 +0100

    IB/ehca: Activate scaling code by default
    
    Change ehca's Kconfig to activates scaling code as default.  After
    several measurements we saw that this feature prevents dropped packets
    (UD) in stress situation. Thus, enabling it helps to improve ehca's
    bandwidth through IPoIB.
    
    Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit c58121143f87930621c1a6fa9683b6862f2b42c9
Author: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Date:   Sun Nov 5 21:42:56 2006 +0100

    IB/ehca: Use named constant for max mtu
    
    Define and use a constant EHCA_MAX_MTU instead hardcoded value.
    
    Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>

commit 7e28db5d8ff63b1cabc221c5cb84a5f45752f1c2
Author: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Date:   Tue Nov 7 00:56:39 2006 +0100

    IB/ehca: Assure 4K alignment for firmware control blocks
    
    Assure 4K alignment for firmware control blocks in 64K page mode,
    because kzalloc()'s result address might not be 4K aligned if 64K
    pages are enabled. Thus, we introduce wrappers called
    ehca_{alloc,free}_fw_ctrlblock(), which use a slab cache for objects
    with 4K length and 4K alignment in order to alloc/free firmware
    control blocks in 64K page mode. In 4K page mode those wrappers just
    are defines of get_zeroed_page() and free_page().
    
    Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
    Signed-off-by: Roland Dreier <rolandd@cisco.com>


diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index 493f4c6..a72bcea 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -1750,7 +1750,7 @@ ib_find_send_mad(struct ib_mad_agent_pri
 		     */
 		    (is_direct(wc->recv_buf.mad->mad_hdr.mgmt_class) ||
 		     rcv_has_same_gid(mad_agent_priv, wr, wc)))
-			return wr;
+			return (wr->status == IB_WC_SUCCESS) ? wr : NULL;
 	}
 
 	/*
diff --git a/drivers/infiniband/hw/amso1100/c2.c b/drivers/infiniband/hw/amso1100/c2.c
index 9e7bd94..27fe242 100644
--- a/drivers/infiniband/hw/amso1100/c2.c
+++ b/drivers/infiniband/hw/amso1100/c2.c
@@ -1155,7 +1155,8 @@ static int __devinit c2_probe(struct pci
 		goto bail10;
 	}
 
-	c2_register_device(c2dev);
+	if (c2_register_device(c2dev))
+		goto bail10;
 
 	return 0;
 
diff --git a/drivers/infiniband/hw/amso1100/c2_provider.c b/drivers/infiniband/hw/amso1100/c2_provider.c
index da98d9f..fef9727 100644
--- a/drivers/infiniband/hw/amso1100/c2_provider.c
+++ b/drivers/infiniband/hw/amso1100/c2_provider.c
@@ -757,20 +757,17 @@ #endif
 
 int c2_register_device(struct c2_dev *dev)
 {
-	int ret;
+	int ret = -ENOMEM;
 	int i;
 
 	/* Register pseudo network device */
 	dev->pseudo_netdev = c2_pseudo_netdev_init(dev);
-	if (dev->pseudo_netdev) {
-		ret = register_netdev(dev->pseudo_netdev);
-		if (ret) {
-			printk(KERN_ERR PFX
-				"Unable to register netdev, ret = %d\n", ret);
-			free_netdev(dev->pseudo_netdev);
-			return ret;
-		}
-	}
+	if (!dev->pseudo_netdev)
+		goto out3;
+
+	ret = register_netdev(dev->pseudo_netdev);
+	if (ret)
+		goto out2;
 
 	pr_debug("%s:%u\n", __FUNCTION__, __LINE__);
 	strlcpy(dev->ibdev.name, "amso%d", IB_DEVICE_NAME_MAX);
@@ -848,21 +845,25 @@ int c2_register_device(struct c2_dev *de
 
 	ret = ib_register_device(&dev->ibdev);
 	if (ret)
-		return ret;
+		goto out1;
 
 	for (i = 0; i < ARRAY_SIZE(c2_class_attributes); ++i) {
 		ret = class_device_create_file(&dev->ibdev.class_dev,
 					       c2_class_attributes[i]);
-		if (ret) {
-			unregister_netdev(dev->pseudo_netdev);
-			free_netdev(dev->pseudo_netdev);
-			ib_unregister_device(&dev->ibdev);
-			return ret;
-		}
+		if (ret)
+			goto out0;
 	}
+	goto out3;
 
-	pr_debug("%s:%u\n", __FUNCTION__, __LINE__);
-	return 0;
+out0:
+	ib_unregister_device(&dev->ibdev);
+out1:
+	unregister_netdev(dev->pseudo_netdev);
+out2:
+	free_netdev(dev->pseudo_netdev);
+out3:
+	pr_debug("%s:%u ret=%d\n", __FUNCTION__, __LINE__, ret);
+	return ret;
 }
 
 void c2_unregister_device(struct c2_dev *dev)
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index 21d9612..623dc95 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -157,8 +157,8 @@ static int c2_rnic_query(struct c2_dev *
 
 	props->fw_ver =
 		((u64)be32_to_cpu(reply->fw_ver_major) << 32) |
-		((be32_to_cpu(reply->fw_ver_minor) && 0xFFFF) << 16) |
-		(be32_to_cpu(reply->fw_ver_patch) && 0xFFFF);
+		((be32_to_cpu(reply->fw_ver_minor) & 0xFFFF) << 16) |
+		(be32_to_cpu(reply->fw_ver_patch) & 0xFFFF);
 	memcpy(&props->sys_image_guid, c2dev->netdev->dev_addr, 6);
 	props->max_mr_size         = 0xFFFFFFFF;
 	props->page_size_cap       = ~(C2_MIN_PAGESIZE-1);
diff --git a/drivers/infiniband/hw/ehca/Kconfig b/drivers/infiniband/hw/ehca/Kconfig
index 922389b..727b10d 100644
--- a/drivers/infiniband/hw/ehca/Kconfig
+++ b/drivers/infiniband/hw/ehca/Kconfig
@@ -10,6 +10,7 @@ config INFINIBAND_EHCA
 config INFINIBAND_EHCA_SCALING
 	bool "Scaling support (EXPERIMENTAL)"
 	depends on IBMEBUS && INFINIBAND_EHCA && HOTPLUG_CPU && EXPERIMENTAL
+	default y
 	---help---
 	eHCA scaling support schedules the CQ callbacks to different CPUs.
 
diff --git a/drivers/infiniband/hw/ehca/ehca_av.c b/drivers/infiniband/hw/ehca/ehca_av.c
index 3bac197..214e2fd 100644
--- a/drivers/infiniband/hw/ehca/ehca_av.c
+++ b/drivers/infiniband/hw/ehca/ehca_av.c
@@ -118,8 +118,7 @@ struct ib_ah *ehca_create_ah(struct ib_p
 		}
 		memcpy(&av->av.grh.word_1, &gid, sizeof(gid));
 	}
-	/* for the time being we use a hard coded PMTU of 2048 Bytes */
-	av->av.pmtu = 4;
+	av->av.pmtu = EHCA_MAX_MTU;
 
 	/* dgid comes in grh.word_3 */
 	memcpy(&av->av.grh.word_3, &ah_attr->grh.dgid,
@@ -193,7 +192,7 @@ int ehca_modify_ah(struct ib_ah *ah, str
 		memcpy(&new_ehca_av.grh.word_1, &gid, sizeof(gid));
 	}
 
-	new_ehca_av.pmtu = 4; /* see also comment in create_ah() */
+	new_ehca_av.pmtu = EHCA_MAX_MTU;
 
 	memcpy(&new_ehca_av.grh.word_3, &ah_attr->grh.dgid,
 	       sizeof(ah_attr->grh.dgid));
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
index 5eae6ac..e1b618c 100644
--- a/drivers/infiniband/hw/ehca/ehca_hca.c
+++ b/drivers/infiniband/hw/ehca/ehca_hca.c
@@ -40,6 +40,7 @@
  */
 
 #include "ehca_tools.h"
+#include "ehca_iverbs.h"
 #include "hcp_if.h"
 
 int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
@@ -49,7 +50,7 @@ int ehca_query_device(struct ib_device *
 					      ib_device);
 	struct hipz_query_hca *rblock;
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -96,7 +97,7 @@ int ehca_query_device(struct ib_device *
 		= min_t(int, rblock->max_total_mcast_qp_attach, INT_MAX);
 
 query_device1:
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 
 	return ret;
 }
@@ -109,7 +110,7 @@ int ehca_query_port(struct ib_device *ib
 					      ib_device);
 	struct hipz_query_port *rblock;
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -162,7 +163,7 @@ int ehca_query_port(struct ib_device *ib
 	props->active_speed    = 0x1;
 
 query_port1:
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 
 	return ret;
 }
@@ -178,7 +179,7 @@ int ehca_query_pkey(struct ib_device *ib
 		return -EINVAL;
 	}
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_err(&shca->ib_device,  "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -193,7 +194,7 @@ int ehca_query_pkey(struct ib_device *ib
 	memcpy(pkey, &rblock->pkey_entries + index, sizeof(u16));
 
 query_pkey1:
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 
 	return ret;
 }
@@ -211,7 +212,7 @@ int ehca_query_gid(struct ib_device *ibd
 		return -EINVAL;
 	}
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -227,7 +228,7 @@ int ehca_query_gid(struct ib_device *ibd
 	memcpy(&gid->raw[8], &rblock->guid_entries[index], sizeof(u64));
 
 query_gid1:
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 
 	return ret;
 }
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index 048cc44..c3ea746 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -45,6 +45,7 @@ #include "ehca_iverbs.h"
 #include "ehca_tools.h"
 #include "hcp_if.h"
 #include "hipz_fns.h"
+#include "ipz_pt_fn.h"
 
 #define EQE_COMPLETION_EVENT   EHCA_BMASK_IBM(1,1)
 #define EQE_CQ_QP_NUMBER       EHCA_BMASK_IBM(8,31)
@@ -137,38 +138,36 @@ int ehca_error_data(struct ehca_shca *sh
 	u64 *rblock;
 	unsigned long block_count;
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Cannot allocate rblock memory.");
 		ret = -ENOMEM;
 		goto error_data1;
 	}
 
+	/* rblock must be 4K aligned and should be 4K large */
 	ret = hipz_h_error_data(shca->ipz_hca_handle,
 				resource,
 				rblock,
 				&block_count);
 
-	if (ret == H_R_STATE) {
+	if (ret == H_R_STATE)
 		ehca_err(&shca->ib_device,
 			 "No error data is available: %lx.", resource);
-	}
 	else if (ret == H_SUCCESS) {
 		int length;
 
 		length = EHCA_BMASK_GET(ERROR_DATA_LENGTH, rblock[0]);
 
-		if (length > PAGE_SIZE)
-			length = PAGE_SIZE;
+		if (length > EHCA_PAGESIZE)
+			length = EHCA_PAGESIZE;
 
 		print_error_data(shca, data, rblock, length);
-	}
-	else {
+	} else
 		ehca_err(&shca->ib_device,
 			 "Error data could not be fetched: %lx", resource);
-	}
 
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 
 error_data1:
 	return ret;
diff --git a/drivers/infiniband/hw/ehca/ehca_iverbs.h b/drivers/infiniband/hw/ehca/ehca_iverbs.h
index 319c39d..3720e30 100644
--- a/drivers/infiniband/hw/ehca/ehca_iverbs.h
+++ b/drivers/infiniband/hw/ehca/ehca_iverbs.h
@@ -179,4 +179,12 @@ int ehca_mmap_register(u64 physical,void
 
 int ehca_munmap(unsigned long addr, size_t len);
 
+#ifdef CONFIG_PPC_64K_PAGES
+void *ehca_alloc_fw_ctrlblock(void);
+void ehca_free_fw_ctrlblock(void *ptr);
+#else
+#define ehca_alloc_fw_ctrlblock() ((void *) get_zeroed_page(GFP_KERNEL))
+#define ehca_free_fw_ctrlblock(ptr) free_page((unsigned long)(ptr))
+#endif
+
 #endif
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 024d511..01f5aa9 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -40,6 +40,9 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifdef CONFIG_PPC_64K_PAGES
+#include <linux/slab.h>
+#endif
 #include "ehca_classes.h"
 #include "ehca_iverbs.h"
 #include "ehca_mrmw.h"
@@ -49,7 +52,7 @@ #include "hcp_if.h"
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
 MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
-MODULE_VERSION("SVNEHCA_0017");
+MODULE_VERSION("SVNEHCA_0018");
 
 int ehca_open_aqp1     = 0;
 int ehca_debug_level   = 0;
@@ -94,11 +97,31 @@ spinlock_t ehca_cq_idr_lock;
 DEFINE_IDR(ehca_qp_idr);
 DEFINE_IDR(ehca_cq_idr);
 
+
 static struct list_head shca_list; /* list of all registered ehcas */
 static spinlock_t shca_list_lock;
 
 static struct timer_list poll_eqs_timer;
 
+#ifdef CONFIG_PPC_64K_PAGES
+static struct kmem_cache *ctblk_cache = NULL;
+
+void *ehca_alloc_fw_ctrlblock(void)
+{
+	void *ret = kmem_cache_zalloc(ctblk_cache, SLAB_KERNEL);
+	if (!ret)
+		ehca_gen_err("Out of memory for ctblk");
+	return ret;
+}
+
+void ehca_free_fw_ctrlblock(void *ptr)
+{
+	if (ptr)
+		kmem_cache_free(ctblk_cache, ptr);
+
+}
+#endif
+
 static int ehca_create_slab_caches(void)
 {
 	int ret;
@@ -133,6 +156,17 @@ static int ehca_create_slab_caches(void)
 		goto create_slab_caches5;
 	}
 
+#ifdef CONFIG_PPC_64K_PAGES
+	ctblk_cache = kmem_cache_create("ehca_cache_ctblk",
+					EHCA_PAGESIZE, H_CB_ALIGNMENT,
+					SLAB_HWCACHE_ALIGN,
+					NULL, NULL);
+	if (!ctblk_cache) {
+		ehca_gen_err("Cannot create ctblk SLAB cache.");
+		ehca_cleanup_mrmw_cache();
+		goto create_slab_caches5;
+	}
+#endif
 	return 0;
 
 create_slab_caches5:
@@ -157,6 +191,10 @@ static void ehca_destroy_slab_caches(voi
 	ehca_cleanup_qp_cache();
 	ehca_cleanup_cq_cache();
 	ehca_cleanup_pd_cache();
+#ifdef CONFIG_PPC_64K_PAGES
+	if (ctblk_cache)
+		kmem_cache_destroy(ctblk_cache);
+#endif
 }
 
 #define EHCA_HCAAVER  EHCA_BMASK_IBM(32,39)
@@ -168,7 +206,7 @@ int ehca_sense_attributes(struct ehca_sh
 	u64 h_ret;
 	struct hipz_query_hca *rblock;
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_gen_err("Cannot allocate rblock memory.");
 		return -ENOMEM;
@@ -211,7 +249,7 @@ int ehca_sense_attributes(struct ehca_sh
 	shca->sport[1].rate = IB_RATE_30_GBPS;
 
 num_ports1:
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 	return ret;
 }
 
@@ -220,7 +258,7 @@ static int init_node_guid(struct ehca_sh
 	int ret = 0;
 	struct hipz_query_hca *rblock;
 
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	rblock = ehca_alloc_fw_ctrlblock();
 	if (!rblock) {
 		ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
 		return -ENOMEM;
@@ -235,7 +273,7 @@ static int init_node_guid(struct ehca_sh
 	memcpy(&shca->ib_device.node_guid, &rblock->node_guid, sizeof(u64));
 
 init_node_guid1:
-	kfree(rblock);
+	ehca_free_fw_ctrlblock(rblock);
 	return ret;
 }
 
@@ -431,7 +469,7 @@ static ssize_t  ehca_show_##name(struct
 									   \
 	shca = dev->driver_data;					   \
 									   \
-	rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);			   \
+	rblock = ehca_alloc_fw_ctrlblock();				   \
 	if (!rblock) {						           \
 		dev_err(dev, "Can't allocate rblock memory.");		   \
 		return 0;						   \
@@ -439,12 +477,12 @@ static ssize_t  ehca_show_##name(struct
 									   \
 	if (hipz_h_query_hca(shca->ipz_hca_handle, rblock) != H_SUCCESS) { \
 		dev_err(dev, "Can't query device properties");	   	   \
-		kfree(rblock);					   	   \
+		ehca_free_fw_ctrlblock(rblock);			   	   \
 		return 0;					   	   \
 	}								   \
 									   \
 	data = rblock->name;                                               \
-	kfree(rblock);                                                     \
+	ehca_free_fw_ctrlblock(rblock);                                    \
 									   \
 	if ((strcmp(#name, "num_ports") == 0) && (ehca_nr_ports == 1))	   \
 		return snprintf(buf, 256, "1\n");			   \
@@ -752,7 +790,7 @@ int __init ehca_module_init(void)
 	int ret;
 
 	printk(KERN_INFO "eHCA Infiniband Device Driver "
-	                 "(Rel.: SVNEHCA_0017)\n");
+	                 "(Rel.: SVNEHCA_0018)\n");
 	idr_init(&ehca_qp_idr);
 	idr_init(&ehca_cq_idr);
 	spin_lock_init(&ehca_qp_idr_lock);
diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c b/drivers/infiniband/hw/ehca/ehca_mrmw.c
index 5ca6544..abce676 100644
--- a/drivers/infiniband/hw/ehca/ehca_mrmw.c
+++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c
@@ -1013,7 +1013,7 @@ int ehca_reg_mr_rpages(struct ehca_shca
 	u32 i;
 	u64 *kpage;
 
-	kpage = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	kpage = ehca_alloc_fw_ctrlblock();
 	if (!kpage) {
 		ehca_err(&shca->ib_device, "kpage alloc failed");
 		ret = -ENOMEM;
@@ -1092,7 +1092,7 @@ int ehca_reg_mr_rpages(struct ehca_shca
 
 
 ehca_reg_mr_rpages_exit1:
-	kfree(kpage);
+	ehca_free_fw_ctrlblock(kpage);
 ehca_reg_mr_rpages_exit0:
 	if (ret)
 		ehca_err(&shca->ib_device, "ret=%x shca=%p e_mr=%p pginfo=%p "
@@ -1124,7 +1124,7 @@ inline int ehca_rereg_mr_rereg1(struct e
 	ehca_mrmw_map_acl(acl, &hipz_acl);
 	ehca_mrmw_set_pgsize_hipz_acl(&hipz_acl);
 
-	kpage = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
+	kpage = ehca_alloc_fw_ctrlblock();
 	if (!kpage) {
 		ehca_err(&shca->ib_device, "kpage alloc failed");
 		ret = -ENOMEM;
@@ -1181,7 +1181,7 @@ inline int ehca_rereg_mr_rereg1(struct e
 	}
 
 ehca_rereg_mr_rereg1_exit1:
-	kfree(kpage);
+	ehca_free_fw_ctrlblock(kpage);
 ehca_rereg_mr_rereg1_exit0:
 	if ( ret && (ret != -EAGAIN) )
 		ehca_err(&shca->ib_device, "ret=%x lkey=%x rkey=%x "
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index 4394123..cf3e50e 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -811,8 +811,8 @@ static int internal_modify_qp(struct ib_
 	unsigned long spl_flags = 0;
 
 	/* do query_qp to obtain current attr values */
-	mqpcb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
-	if (mqpcb == NULL) {
+	mqpcb = ehca_alloc_fw_ctrlblock();
+	if (!mqpcb) {
 		ehca_err(ibqp->device, "Could not get zeroed page for mqpcb "
 			 "ehca_qp=%p qp_num=%x ", my_qp, ibqp->qp_num);
 		return -ENOMEM;
@@ -1225,7 +1225,7 @@ modify_qp_exit2:
 	}
 
 modify_qp_exit1:
-	kfree(mqpcb);
+	ehca_free_fw_ctrlblock(mqpcb);
 
 	return ret;
 }
@@ -1277,7 +1277,7 @@ int ehca_query_qp(struct ib_qp *qp,
 		return -EINVAL;
 	}
 
-	qpcb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL );
+	qpcb = ehca_alloc_fw_ctrlblock();
 	if (!qpcb) {
 		ehca_err(qp->device,"Out of memory for qpcb "
 			 "ehca_qp=%p qp_num=%x", my_qp, qp->qp_num);
@@ -1401,7 +1401,7 @@ int ehca_query_qp(struct ib_qp *qp,
 		ehca_dmp(qpcb, 4*70, "qp_num=%x", qp->qp_num);
 
 query_qp_exit1:
-	kfree(qpcb);
+	ehca_free_fw_ctrlblock(qpcb);
 
 	return ret;
 }
diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h
index 3fc92b0..fad9136 100644
--- a/drivers/infiniband/hw/ehca/hipz_hw.h
+++ b/drivers/infiniband/hw/ehca/hipz_hw.h
@@ -45,6 +45,8 @@ #define __HIPZ_HW_H__
 
 #include "ehca_tools.h"
 
+#define EHCA_MAX_MTU 4
+
 /* QP Table Entry Memory Map */
 struct hipz_qptemm {
 	u64 qpx_hcr;

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

* [GIT PULL] please pull infiniband.git
@ 2006-11-02 22:28 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-11-02 22:28 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This includes various fixes for 2.6.19-rc5:

Erez Zilber (1):
      IB/iser: Start connection after enabling iSER

Jack Morgenstein (1):
      IB/uverbs: Return sq_draining value in query_qp response

Krishna Kumar (1):
      RDMA/cma: rdma_bind_addr() leaks a cma_dev reference count

Michael S. Tsirkin (1):
      IB/mthca: Fix MAD extended header format for MAD_IFC firmware command

Paul Mackerras (1):
      IB/ehca: Fix eHCA driver compilation for uniprocessor

Sean Hefty (1):
      RDMA/addr: Use client registration to fix module unload race

Steve Wise (2):
      IB/amso1100: Use dma_alloc_coherent() instead of kmalloc/dma_map_single
      IB/amso1100: Fix incorrect pr_debug()

 drivers/infiniband/core/addr.c            |   28 ++++++++++++++-
 drivers/infiniband/core/cma.c             |   31 +++++++++++-----
 drivers/infiniband/core/uverbs_cmd.c      |    2 +-
 drivers/infiniband/hw/amso1100/c2_alloc.c |   13 +++----
 drivers/infiniband/hw/amso1100/c2_cq.c    |   18 +++------
 drivers/infiniband/hw/amso1100/c2_rnic.c  |   56 ++++++++++++-----------------
 drivers/infiniband/hw/ehca/ehca_tools.h   |    1 +
 drivers/infiniband/hw/mthca/mthca_cmd.c   |   14 ++++----
 drivers/infiniband/ulp/iser/iscsi_iser.c  |    4 +-
 include/rdma/ib_addr.h                    |   20 ++++++++++-
 include/rdma/ib_user_verbs.h              |    2 +-
 11 files changed, 114 insertions(+), 75 deletions(-)


diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index 60d3fbd..e11187e 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -47,6 +47,7 @@ struct addr_req {
 	struct sockaddr src_addr;
 	struct sockaddr dst_addr;
 	struct rdma_dev_addr *addr;
+	struct rdma_addr_client *client;
 	void *context;
 	void (*callback)(int status, struct sockaddr *src_addr,
 			 struct rdma_dev_addr *addr, void *context);
@@ -61,6 +62,26 @@ static LIST_HEAD(req_list);
 static DECLARE_WORK(work, process_req, NULL);
 static struct workqueue_struct *addr_wq;
 
+void rdma_addr_register_client(struct rdma_addr_client *client)
+{
+	atomic_set(&client->refcount, 1);
+	init_completion(&client->comp);
+}
+EXPORT_SYMBOL(rdma_addr_register_client);
+
+static inline void put_client(struct rdma_addr_client *client)
+{
+	if (atomic_dec_and_test(&client->refcount))
+		complete(&client->comp);
+}
+
+void rdma_addr_unregister_client(struct rdma_addr_client *client)
+{
+	put_client(client);
+	wait_for_completion(&client->comp);
+}
+EXPORT_SYMBOL(rdma_addr_unregister_client);
+
 int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev,
 		     const unsigned char *dst_dev_addr)
 {
@@ -229,6 +250,7 @@ static void process_req(void *data)
 		list_del(&req->list);
 		req->callback(req->status, &req->src_addr, req->addr,
 			      req->context);
+		put_client(req->client);
 		kfree(req);
 	}
 }
@@ -264,7 +286,8 @@ static int addr_resolve_local(struct soc
 	return ret;
 }
 
-int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
+int rdma_resolve_ip(struct rdma_addr_client *client,
+		    struct sockaddr *src_addr, struct sockaddr *dst_addr,
 		    struct rdma_dev_addr *addr, int timeout_ms,
 		    void (*callback)(int status, struct sockaddr *src_addr,
 				     struct rdma_dev_addr *addr, void *context),
@@ -285,6 +308,8 @@ int rdma_resolve_ip(struct sockaddr *src
 	req->addr = addr;
 	req->callback = callback;
 	req->context = context;
+	req->client = client;
+	atomic_inc(&client->refcount);
 
 	src_in = (struct sockaddr_in *) &req->src_addr;
 	dst_in = (struct sockaddr_in *) &req->dst_addr;
@@ -305,6 +330,7 @@ int rdma_resolve_ip(struct sockaddr *src
 		break;
 	default:
 		ret = req->status;
+		atomic_dec(&client->refcount);
 		kfree(req);
 		break;
 	}
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 9ae4f3a..845090b 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -63,6 +63,7 @@ static struct ib_client cma_client = {
 };
 
 static struct ib_sa_client sa_client;
+static struct rdma_addr_client addr_client;
 static LIST_HEAD(dev_list);
 static LIST_HEAD(listen_any_list);
 static DEFINE_MUTEX(lock);
@@ -1625,8 +1626,8 @@ int rdma_resolve_addr(struct rdma_cm_id
 	if (cma_any_addr(dst_addr))
 		ret = cma_resolve_loopback(id_priv);
 	else
-		ret = rdma_resolve_ip(&id->route.addr.src_addr, dst_addr,
-				      &id->route.addr.dev_addr,
+		ret = rdma_resolve_ip(&addr_client, &id->route.addr.src_addr,
+				      dst_addr, &id->route.addr.dev_addr,
 				      timeout_ms, addr_handler, id_priv);
 	if (ret)
 		goto err;
@@ -1762,22 +1763,29 @@ int rdma_bind_addr(struct rdma_cm_id *id
 
 	if (!cma_any_addr(addr)) {
 		ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
-		if (!ret) {
-			mutex_lock(&lock);
-			ret = cma_acquire_dev(id_priv);
-			mutex_unlock(&lock);
-		}
 		if (ret)
-			goto err;
+			goto err1;
+
+		mutex_lock(&lock);
+		ret = cma_acquire_dev(id_priv);
+		mutex_unlock(&lock);
+		if (ret)
+			goto err1;
 	}
 
 	memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
 	ret = cma_get_port(id_priv);
 	if (ret)
-		goto err;
+		goto err2;
 
 	return 0;
-err:
+err2:
+	if (!cma_any_addr(addr)) {
+		mutex_lock(&lock);
+		cma_detach_from_dev(id_priv);
+		mutex_unlock(&lock);
+	}
+err1:
 	cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
 	return ret;
 }
@@ -2210,6 +2218,7 @@ static int cma_init(void)
 		return -ENOMEM;
 
 	ib_sa_register_client(&sa_client);
+	rdma_addr_register_client(&addr_client);
 
 	ret = ib_register_client(&cma_client);
 	if (ret)
@@ -2217,6 +2226,7 @@ static int cma_init(void)
 	return 0;
 
 err:
+	rdma_addr_unregister_client(&addr_client);
 	ib_sa_unregister_client(&sa_client);
 	destroy_workqueue(cma_wq);
 	return ret;
@@ -2225,6 +2235,7 @@ err:
 static void cma_cleanup(void)
 {
 	ib_unregister_client(&cma_client);
+	rdma_addr_unregister_client(&addr_client);
 	ib_sa_unregister_client(&sa_client);
 	destroy_workqueue(cma_wq);
 	idr_destroy(&sdp_ps);
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index b72c7f6..743247e 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -1214,7 +1214,7 @@ ssize_t ib_uverbs_query_qp(struct ib_uve
 	resp.qp_access_flags        = attr->qp_access_flags;
 	resp.pkey_index             = attr->pkey_index;
 	resp.alt_pkey_index         = attr->alt_pkey_index;
-	resp.en_sqd_async_notify    = attr->en_sqd_async_notify;
+	resp.sq_draining            = attr->sq_draining;
 	resp.max_rd_atomic          = attr->max_rd_atomic;
 	resp.max_dest_rd_atomic     = attr->max_dest_rd_atomic;
 	resp.min_rnr_timer          = attr->min_rnr_timer;
diff --git a/drivers/infiniband/hw/amso1100/c2_alloc.c b/drivers/infiniband/hw/amso1100/c2_alloc.c
index 028a60b..0315f99 100644
--- a/drivers/infiniband/hw/amso1100/c2_alloc.c
+++ b/drivers/infiniband/hw/amso1100/c2_alloc.c
@@ -42,13 +42,14 @@ static int c2_alloc_mqsp_chunk(struct c2
 {
 	int i;
 	struct sp_chunk *new_head;
+	dma_addr_t dma_addr;
 
-	new_head = (struct sp_chunk *) __get_free_page(gfp_mask);
+	new_head = dma_alloc_coherent(&c2dev->pcidev->dev, PAGE_SIZE,
+				      &dma_addr, gfp_mask);
 	if (new_head == NULL)
 		return -ENOMEM;
 
-	new_head->dma_addr = dma_map_single(c2dev->ibdev.dma_device, new_head,
-					    PAGE_SIZE, DMA_FROM_DEVICE);
+	new_head->dma_addr = dma_addr;
 	pci_unmap_addr_set(new_head, mapping, new_head->dma_addr);
 
 	new_head->next = NULL;
@@ -80,10 +81,8 @@ void c2_free_mqsp_pool(struct c2_dev *c2
 
 	while (root) {
 		next = root->next;
-		dma_unmap_single(c2dev->ibdev.dma_device,
-				 pci_unmap_addr(root, mapping), PAGE_SIZE,
-			         DMA_FROM_DEVICE);
-		__free_page((struct page *) root);
+		dma_free_coherent(&c2dev->pcidev->dev, PAGE_SIZE, root,
+				  pci_unmap_addr(root, mapping));
 		root = next;
 	}
 }
diff --git a/drivers/infiniband/hw/amso1100/c2_cq.c b/drivers/infiniband/hw/amso1100/c2_cq.c
index 9d7bcc5..05c9154 100644
--- a/drivers/infiniband/hw/amso1100/c2_cq.c
+++ b/drivers/infiniband/hw/amso1100/c2_cq.c
@@ -246,20 +246,17 @@ int c2_arm_cq(struct ib_cq *ibcq, enum i
 
 static void c2_free_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq)
 {
-
-	dma_unmap_single(c2dev->ibdev.dma_device, pci_unmap_addr(mq, mapping),
-			 mq->q_size * mq->msg_size, DMA_FROM_DEVICE);
-	free_pages((unsigned long) mq->msg_pool.host,
-		   get_order(mq->q_size * mq->msg_size));
+	dma_free_coherent(&c2dev->pcidev->dev, mq->q_size * mq->msg_size,
+			  mq->msg_pool.host, pci_unmap_addr(mq, mapping));
 }
 
 static int c2_alloc_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq, int q_size,
 			   int msg_size)
 {
-	unsigned long pool_start;
+	u8 *pool_start;
 
-	pool_start = __get_free_pages(GFP_KERNEL,
-				      get_order(q_size * msg_size));
+	pool_start = dma_alloc_coherent(&c2dev->pcidev->dev, q_size * msg_size,
+					&mq->host_dma, GFP_KERNEL);
 	if (!pool_start)
 		return -ENOMEM;
 
@@ -267,13 +264,10 @@ static int c2_alloc_cq_buf(struct c2_dev
 		       0,		/* index (currently unknown) */
 		       q_size,
 		       msg_size,
-		       (u8 *) pool_start,
+		       pool_start,
 		       NULL,	/* peer (currently unknown) */
 		       C2_MQ_HOST_TARGET);
 
-	mq->host_dma = dma_map_single(c2dev->ibdev.dma_device,
-				      (void *)pool_start,
-				      q_size * msg_size, DMA_FROM_DEVICE);
 	pci_unmap_addr_set(mq, mapping, mq->host_dma);
 
 	return 0;
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index 30409e1..21d9612 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -517,14 +517,12 @@ int c2_rnic_init(struct c2_dev *c2dev)
 	/* Initialize the Verbs Reply Queue */
 	qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_QSIZE));
 	msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_MSGSIZE));
-	q1_pages = kmalloc(qsize * msgsize, GFP_KERNEL);
+	q1_pages = dma_alloc_coherent(&c2dev->pcidev->dev, qsize * msgsize,
+				      &c2dev->rep_vq.host_dma, GFP_KERNEL);
 	if (!q1_pages) {
 		err = -ENOMEM;
 		goto bail1;
 	}
-	c2dev->rep_vq.host_dma = dma_map_single(c2dev->ibdev.dma_device,
-					        (void *)q1_pages, qsize * msgsize,
-				      		DMA_FROM_DEVICE);
 	pci_unmap_addr_set(&c2dev->rep_vq, mapping, c2dev->rep_vq.host_dma);
 	pr_debug("%s rep_vq va %p dma %llx\n", __FUNCTION__, q1_pages,
 		 (unsigned long long) c2dev->rep_vq.host_dma);
@@ -540,17 +538,15 @@ int c2_rnic_init(struct c2_dev *c2dev)
 	/* Initialize the Asynchronus Event Queue */
 	qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_QSIZE));
 	msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_MSGSIZE));
-	q2_pages = kmalloc(qsize * msgsize, GFP_KERNEL);
+	q2_pages = dma_alloc_coherent(&c2dev->pcidev->dev, qsize * msgsize,
+				      &c2dev->aeq.host_dma, GFP_KERNEL);
 	if (!q2_pages) {
 		err = -ENOMEM;
 		goto bail2;
 	}
-	c2dev->aeq.host_dma = dma_map_single(c2dev->ibdev.dma_device,
-					        (void *)q2_pages, qsize * msgsize,
-				      		DMA_FROM_DEVICE);
 	pci_unmap_addr_set(&c2dev->aeq, mapping, c2dev->aeq.host_dma);
-	pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q1_pages,
-		 (unsigned long long) c2dev->rep_vq.host_dma);
+	pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q2_pages,
+		 (unsigned long long) c2dev->aeq.host_dma);
 	c2_mq_rep_init(&c2dev->aeq,
 		       2,
 		       qsize,
@@ -597,17 +593,13 @@ int c2_rnic_init(struct c2_dev *c2dev)
       bail4:
 	vq_term(c2dev);
       bail3:
-	dma_unmap_single(c2dev->ibdev.dma_device,
-			 pci_unmap_addr(&c2dev->aeq, mapping),
-			 c2dev->aeq.q_size * c2dev->aeq.msg_size,
-		  	 DMA_FROM_DEVICE);
-	kfree(q2_pages);
+	dma_free_coherent(&c2dev->pcidev->dev,
+			  c2dev->aeq.q_size * c2dev->aeq.msg_size,
+			  q2_pages, pci_unmap_addr(&c2dev->aeq, mapping));
       bail2:
-	dma_unmap_single(c2dev->ibdev.dma_device,
-			 pci_unmap_addr(&c2dev->rep_vq, mapping),
-			 c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size,
-		  	 DMA_FROM_DEVICE);
-	kfree(q1_pages);
+	dma_free_coherent(&c2dev->pcidev->dev,
+			  c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size,
+			  q1_pages, pci_unmap_addr(&c2dev->rep_vq, mapping));
       bail1:
 	c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool);
       bail0:
@@ -640,19 +632,17 @@ void c2_rnic_term(struct c2_dev *c2dev)
 	/* Free the verbs request allocator */
 	vq_term(c2dev);
 
-	/* Unmap and free the asynchronus event queue */
-	dma_unmap_single(c2dev->ibdev.dma_device,
-			 pci_unmap_addr(&c2dev->aeq, mapping),
-			 c2dev->aeq.q_size * c2dev->aeq.msg_size,
-		  	 DMA_FROM_DEVICE);
-	kfree(c2dev->aeq.msg_pool.host);
-
-	/* Unmap and free the verbs reply queue */
-	dma_unmap_single(c2dev->ibdev.dma_device,
-			 pci_unmap_addr(&c2dev->rep_vq, mapping),
-			 c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size,
-		  	 DMA_FROM_DEVICE);
-	kfree(c2dev->rep_vq.msg_pool.host);
+	/* Free the asynchronus event queue */
+	dma_free_coherent(&c2dev->pcidev->dev,
+			  c2dev->aeq.q_size * c2dev->aeq.msg_size,
+			  c2dev->aeq.msg_pool.host,
+			  pci_unmap_addr(&c2dev->aeq, mapping));
+
+	/* Free the verbs reply queue */
+	dma_free_coherent(&c2dev->pcidev->dev,
+			  c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size,
+			  c2dev->rep_vq.msg_pool.host,
+			  pci_unmap_addr(&c2dev->rep_vq, mapping));
 
 	/* Free the MQ shared pointer pool */
 	c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool);
diff --git a/drivers/infiniband/hw/ehca/ehca_tools.h b/drivers/infiniband/hw/ehca/ehca_tools.h
index 809da3e..973c4b5 100644
--- a/drivers/infiniband/hw/ehca/ehca_tools.h
+++ b/drivers/infiniband/hw/ehca/ehca_tools.h
@@ -63,6 +63,7 @@ #include <asm/abs_addr.h>
 #include <asm/ibmebus.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
+#include <asm/hvcall.h>
 
 extern int ehca_debug_level;
 
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c
index 99a94d7..768df72 100644
--- a/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -1820,11 +1820,11 @@ int mthca_MAD_IFC(struct mthca_dev *dev,
 
 #define MAD_IFC_BOX_SIZE      0x400
 #define MAD_IFC_MY_QPN_OFFSET 0x100
-#define MAD_IFC_RQPN_OFFSET   0x104
-#define MAD_IFC_SL_OFFSET     0x108
-#define MAD_IFC_G_PATH_OFFSET 0x109
-#define MAD_IFC_RLID_OFFSET   0x10a
-#define MAD_IFC_PKEY_OFFSET   0x10e
+#define MAD_IFC_RQPN_OFFSET   0x108
+#define MAD_IFC_SL_OFFSET     0x10c
+#define MAD_IFC_G_PATH_OFFSET 0x10d
+#define MAD_IFC_RLID_OFFSET   0x10e
+#define MAD_IFC_PKEY_OFFSET   0x112
 #define MAD_IFC_GRH_OFFSET    0x140
 
 	inmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
@@ -1862,7 +1862,7 @@ #define MAD_IFC_GRH_OFFSET    0x140
 
 		val = in_wc->dlid_path_bits |
 			(in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0);
-		MTHCA_PUT(inbox, val,               MAD_IFC_GRH_OFFSET);
+		MTHCA_PUT(inbox, val,               MAD_IFC_G_PATH_OFFSET);
 
 		MTHCA_PUT(inbox, in_wc->slid,       MAD_IFC_RLID_OFFSET);
 		MTHCA_PUT(inbox, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET);
@@ -1870,7 +1870,7 @@ #define MAD_IFC_GRH_OFFSET    0x140
 		if (in_grh)
 			memcpy(inbox + MAD_IFC_GRH_OFFSET, in_grh, 40);
 
-		op_modifier |= 0x10;
+		op_modifier |= 0x4;
 
 		in_modifier |= in_wc->slid << 16;
 	}
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index eb6f98d..9b2041e 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -363,11 +363,11 @@ iscsi_iser_conn_start(struct iscsi_cls_c
 	struct iscsi_conn *conn = cls_conn->dd_data;
 	int err;
 
-	err = iscsi_conn_start(cls_conn);
+	err = iser_conn_set_full_featured_mode(conn);
 	if (err)
 		return err;
 
-	return iser_conn_set_full_featured_mode(conn);
+	return iscsi_conn_start(cls_conn);
 }
 
 static struct iscsi_transport iscsi_iser_transport;
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h
index 81b6230..c094e50 100644
--- a/include/rdma/ib_addr.h
+++ b/include/rdma/ib_addr.h
@@ -36,6 +36,22 @@ #include <linux/netdevice.h>
 #include <linux/socket.h>
 #include <rdma/ib_verbs.h>
 
+struct rdma_addr_client {
+	atomic_t refcount;
+	struct completion comp;
+};
+
+/**
+ * rdma_addr_register_client - Register an address client.
+ */
+void rdma_addr_register_client(struct rdma_addr_client *client);
+
+/**
+ * rdma_addr_unregister_client - Deregister an address client.
+ * @client: Client object to deregister.
+ */
+void rdma_addr_unregister_client(struct rdma_addr_client *client);
+
 struct rdma_dev_addr {
 	unsigned char src_dev_addr[MAX_ADDR_LEN];
 	unsigned char dst_dev_addr[MAX_ADDR_LEN];
@@ -52,6 +68,7 @@ int rdma_translate_ip(struct sockaddr *a
 /**
  * rdma_resolve_ip - Resolve source and destination IP addresses to
  *   RDMA hardware addresses.
+ * @client: Address client associated with request.
  * @src_addr: An optional source address to use in the resolution.  If a
  *   source address is not provided, a usable address will be returned via
  *   the callback.
@@ -64,7 +81,8 @@ int rdma_translate_ip(struct sockaddr *a
  *   or been canceled.  A status of 0 indicates success.
  * @context: User-specified context associated with the call.
  */
-int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
+int rdma_resolve_ip(struct rdma_addr_client *client,
+		    struct sockaddr *src_addr, struct sockaddr *dst_addr,
 		    struct rdma_dev_addr *addr, int timeout_ms,
 		    void (*callback)(int status, struct sockaddr *src_addr,
 				     struct rdma_dev_addr *addr, void *context),
diff --git a/include/rdma/ib_user_verbs.h b/include/rdma/ib_user_verbs.h
index db1b814..64a721f 100644
--- a/include/rdma/ib_user_verbs.h
+++ b/include/rdma/ib_user_verbs.h
@@ -458,7 +458,7 @@ struct ib_uverbs_query_qp_resp {
 	__u8  cur_qp_state;
 	__u8  path_mtu;
 	__u8  path_mig_state;
-	__u8  en_sqd_async_notify;
+	__u8  sq_draining;
 	__u8  max_rd_atomic;
 	__u8  max_dest_rd_atomic;
 	__u8  min_rnr_timer;

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

* [GIT PULL] please pull infiniband.git
@ 2006-10-17 21:44 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-10-17 21:44 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This includes various fixes found since 2.6.19-rc2:

Adrian Bunk:
      RDMA/amso1100: Fix a NULL dereference in error path

Arthur Kepner:
      IB/mthca: Use mmiowb after doorbell ring

Henrik Kretzschmar:
      RDMA/amso1100: pci_module_init() conversion

Robert Walsh:
      IB/ipath: Initialize diagpkt file on device init only

 drivers/infiniband/hw/amso1100/c2.c        |    2 -
 drivers/infiniband/hw/amso1100/c2_rnic.c   |    4 +-
 drivers/infiniband/hw/ipath/ipath_diag.c   |   65 ++++++++++++++++------------
 drivers/infiniband/hw/ipath/ipath_driver.c |   10 ----
 drivers/infiniband/hw/ipath/ipath_kernel.h |    3 -
 drivers/infiniband/hw/mthca/mthca_cq.c     |    7 +++
 drivers/infiniband/hw/mthca/mthca_qp.c     |   19 ++++++++
 drivers/infiniband/hw/mthca/mthca_srq.c    |    8 +++
 8 files changed, 75 insertions(+), 43 deletions(-)


diff --git a/drivers/infiniband/hw/amso1100/c2.c b/drivers/infiniband/hw/amso1100/c2.c
index dc1ebea..9e7bd94 100644
--- a/drivers/infiniband/hw/amso1100/c2.c
+++ b/drivers/infiniband/hw/amso1100/c2.c
@@ -1243,7 +1243,7 @@ static struct pci_driver c2_pci_driver =
 
 static int __init c2_init_module(void)
 {
-	return pci_module_init(&c2_pci_driver);
+	return pci_register_driver(&c2_pci_driver);
 }
 
 static void __exit c2_exit_module(void)
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index e37c568..30409e1 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -150,8 +150,8 @@ static int c2_rnic_query(struct c2_dev *
 	    (struct c2wr_rnic_query_rep *) (unsigned long) (vq_req->reply_msg);
 	if (!reply)
 		err = -ENOMEM;
-
-	err = c2_errno(reply);
+	else
+		err = c2_errno(reply);
 	if (err)
 		goto bail2;
 
diff --git a/drivers/infiniband/hw/ipath/ipath_diag.c b/drivers/infiniband/hw/ipath/ipath_diag.c
index 29958b6..28c087b 100644
--- a/drivers/infiniband/hw/ipath/ipath_diag.c
+++ b/drivers/infiniband/hw/ipath/ipath_diag.c
@@ -67,19 +67,54 @@ static struct file_operations diag_file_
 	.release = ipath_diag_release
 };
 
+static ssize_t ipath_diagpkt_write(struct file *fp,
+				   const char __user *data,
+				   size_t count, loff_t *off);
+
+static struct file_operations diagpkt_file_ops = {
+	.owner = THIS_MODULE,
+	.write = ipath_diagpkt_write,
+};
+
+static atomic_t diagpkt_count = ATOMIC_INIT(0);
+static struct cdev *diagpkt_cdev;
+static struct class_device *diagpkt_class_dev;
+
 int ipath_diag_add(struct ipath_devdata *dd)
 {
 	char name[16];
+	int ret = 0;
+
+	if (atomic_inc_return(&diagpkt_count) == 1) {
+		ret = ipath_cdev_init(IPATH_DIAGPKT_MINOR,
+				      "ipath_diagpkt", &diagpkt_file_ops,
+				      &diagpkt_cdev, &diagpkt_class_dev);
+
+		if (ret) {
+			ipath_dev_err(dd, "Couldn't create ipath_diagpkt "
+				      "device: %d", ret);
+			goto done;
+		}
+	}
 
 	snprintf(name, sizeof(name), "ipath_diag%d", dd->ipath_unit);
 
-	return ipath_cdev_init(IPATH_DIAG_MINOR_BASE + dd->ipath_unit, name,
-			       &diag_file_ops, &dd->diag_cdev,
-			       &dd->diag_class_dev);
+	ret = ipath_cdev_init(IPATH_DIAG_MINOR_BASE + dd->ipath_unit, name,
+			      &diag_file_ops, &dd->diag_cdev,
+			      &dd->diag_class_dev);
+	if (ret)
+		ipath_dev_err(dd, "Couldn't create %s device: %d",
+			      name, ret);
+
+done:
+	return ret;
 }
 
 void ipath_diag_remove(struct ipath_devdata *dd)
 {
+	if (atomic_dec_and_test(&diagpkt_count))
+		ipath_cdev_cleanup(&diagpkt_cdev, &diagpkt_class_dev);
+
 	ipath_cdev_cleanup(&dd->diag_cdev, &dd->diag_class_dev);
 }
 
@@ -275,30 +310,6 @@ bail:
 	return ret;
 }
 
-static ssize_t ipath_diagpkt_write(struct file *fp,
-				   const char __user *data,
-				   size_t count, loff_t *off);
-
-static struct file_operations diagpkt_file_ops = {
-	.owner = THIS_MODULE,
-	.write = ipath_diagpkt_write,
-};
-
-static struct cdev *diagpkt_cdev;
-static struct class_device *diagpkt_class_dev;
-
-int __init ipath_diagpkt_add(void)
-{
-	return ipath_cdev_init(IPATH_DIAGPKT_MINOR,
-			       "ipath_diagpkt", &diagpkt_file_ops,
-			       &diagpkt_cdev, &diagpkt_class_dev);
-}
-
-void __exit ipath_diagpkt_remove(void)
-{
-	ipath_cdev_cleanup(&diagpkt_cdev, &diagpkt_class_dev);
-}
-
 /**
  * ipath_diagpkt_write - write an IB packet
  * @fp: the diag data device file pointer
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index 12cefa6..b4ffaa7 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -2005,18 +2005,8 @@ static int __init infinipath_init(void)
 		goto bail_group;
 	}
 
-	ret = ipath_diagpkt_add();
-	if (ret < 0) {
-		printk(KERN_ERR IPATH_DRV_NAME ": Unable to create "
-		       "diag data device: error %d\n", -ret);
-		goto bail_ipathfs;
-	}
-
 	goto bail;
 
-bail_ipathfs:
-	ipath_exit_ipathfs();
-
 bail_group:
 	ipath_driver_remove_group(&ipath_driver.driver);
 
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index 7c43669..06d5020 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -869,9 +869,6 @@ int ipath_device_create_group(struct dev
 void ipath_device_remove_group(struct device *, struct ipath_devdata *);
 int ipath_expose_reset(struct device *);
 
-int ipath_diagpkt_add(void);
-void ipath_diagpkt_remove(void);
-
 int ipath_init_ipathfs(void);
 void ipath_exit_ipathfs(void);
 int ipathfs_add_device(struct ipath_devdata *);
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index e393681..149b369 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -39,6 +39,8 @@
 #include <linux/init.h>
 #include <linux/hardirq.h>
 
+#include <asm/io.h>
+
 #include <rdma/ib_pack.h>
 
 #include "mthca_dev.h"
@@ -210,6 +212,11 @@ static inline void update_cons_index(str
 		mthca_write64(doorbell,
 			      dev->kar + MTHCA_CQ_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
+		/*
+		 * Make sure doorbells don't leak out of CQ spinlock
+		 * and reach the HCA out of order:
+		 */
+		mmiowb();
 	}
 }
 
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index 5e5c58b..6a7822e 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -39,6 +39,8 @@ #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/slab.h>
 
+#include <asm/io.h>
+
 #include <rdma/ib_verbs.h>
 #include <rdma/ib_cache.h>
 #include <rdma/ib_pack.h>
@@ -1732,6 +1734,11 @@ out:
 		mthca_write64(doorbell,
 			      dev->kar + MTHCA_SEND_DOORBELL,
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
+		/*
+		 * Make sure doorbells don't leak out of SQ spinlock
+		 * and reach the HCA out of order:
+		 */
+		mmiowb();
 	}
 
 	qp->sq.next_ind = ind;
@@ -1851,6 +1858,12 @@ out:
 	qp->rq.next_ind = ind;
 	qp->rq.head    += nreq;
 
+	/*
+	 * Make sure doorbells don't leak out of RQ spinlock and reach
+	 * the HCA out of order:
+	 */
+	mmiowb();
+
 	spin_unlock_irqrestore(&qp->rq.lock, flags);
 	return err;
 }
@@ -2112,6 +2125,12 @@ out:
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 	}
 
+	/*
+	 * Make sure doorbells don't leak out of SQ spinlock and reach
+	 * the HCA out of order:
+	 */
+	mmiowb();
+
 	spin_unlock_irqrestore(&qp->sq.lock, flags);
 	return err;
 }
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c
index 92a72f5..f5d7677 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -35,6 +35,8 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 
+#include <asm/io.h>
+
 #include "mthca_dev.h"
 #include "mthca_cmd.h"
 #include "mthca_memfree.h"
@@ -595,6 +597,12 @@ int mthca_tavor_post_srq_recv(struct ib_
 			      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 	}
 
+	/*
+	 * Make sure doorbells don't leak out of SRQ spinlock and
+	 * reach the HCA out of order:
+	 */
+	mmiowb();
+
 	spin_unlock_irqrestore(&srq->lock, flags);
 	return err;
 }

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

* [GIT PULL] please pull infiniband.git
@ 2006-10-10 21:03 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-10-10 21:03 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This includes various fixes found since 2.6.19-rc1:

Ishai Rabinovitz:
      IB/srp: Remove redundant memset()
      IB/srp: Enable multiple connections to the same target

Jack Morgenstein:
      IB/mthca: Query port fix

Michael S. Tsirkin:
      IB/mthca: Fix off-by-one in mthca SRQ creation

Roland Dreier:
      RDMA/amso1100: Fix build with debugging off
      IPoIB: Check for DMA mapping error for TX packets

Sean Hefty:
      IB/cm: Fix timewait crash after module unload
      IB/cm: Send DREP in response to unmatched DREQ

Tom Tucker:
      RDMA/amso1100: Add spinlocks to serialize ib_post_send/ib_post_recv

 drivers/infiniband/core/cm.c                 |   84 ++++++++++++++++++++------
 drivers/infiniband/hw/amso1100/c2_ae.c       |    2 -
 drivers/infiniband/hw/amso1100/c2_qp.c       |   16 ++++-
 drivers/infiniband/hw/mthca/mthca_provider.c |    2 +
 drivers/infiniband/hw/mthca/mthca_srq.c      |    6 +-
 drivers/infiniband/ulp/ipoib/ipoib_ib.c      |    5 ++
 drivers/infiniband/ulp/srp/ib_srp.c          |   27 +++++---
 drivers/infiniband/ulp/srp/ib_srp.h          |    2 -
 8 files changed, 106 insertions(+), 38 deletions(-)


diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index f35fcc4..25b1018 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -75,6 +75,7 @@ static struct ib_cm {
 	struct rb_root remote_sidr_table;
 	struct idr local_id_table;
 	__be32 random_id_operand;
+	struct list_head timewait_list;
 	struct workqueue_struct *wq;
 } cm;
 
@@ -112,6 +113,7 @@ struct cm_work {
 
 struct cm_timewait_info {
 	struct cm_work work;			/* Must be first. */
+	struct list_head list;
 	struct rb_node remote_qp_node;
 	struct rb_node remote_id_node;
 	__be64 remote_ca_guid;
@@ -647,13 +649,6 @@ static inline int cm_convert_to_ms(int i
 
 static void cm_cleanup_timewait(struct cm_timewait_info *timewait_info)
 {
-	unsigned long flags;
-
-	if (!timewait_info->inserted_remote_id &&
-	    !timewait_info->inserted_remote_qp)
-	    return;
-
-	spin_lock_irqsave(&cm.lock, flags);
 	if (timewait_info->inserted_remote_id) {
 		rb_erase(&timewait_info->remote_id_node, &cm.remote_id_table);
 		timewait_info->inserted_remote_id = 0;
@@ -663,7 +658,6 @@ static void cm_cleanup_timewait(struct c
 		rb_erase(&timewait_info->remote_qp_node, &cm.remote_qp_table);
 		timewait_info->inserted_remote_qp = 0;
 	}
-	spin_unlock_irqrestore(&cm.lock, flags);
 }
 
 static struct cm_timewait_info * cm_create_timewait_info(__be32 local_id)
@@ -684,8 +678,12 @@ static struct cm_timewait_info * cm_crea
 static void cm_enter_timewait(struct cm_id_private *cm_id_priv)
 {
 	int wait_time;
+	unsigned long flags;
 
+	spin_lock_irqsave(&cm.lock, flags);
 	cm_cleanup_timewait(cm_id_priv->timewait_info);
+	list_add_tail(&cm_id_priv->timewait_info->list, &cm.timewait_list);
+	spin_unlock_irqrestore(&cm.lock, flags);
 
 	/*
 	 * The cm_id could be destroyed by the user before we exit timewait.
@@ -701,9 +699,13 @@ static void cm_enter_timewait(struct cm_
 
 static void cm_reset_to_idle(struct cm_id_private *cm_id_priv)
 {
+	unsigned long flags;
+
 	cm_id_priv->id.state = IB_CM_IDLE;
 	if (cm_id_priv->timewait_info) {
+		spin_lock_irqsave(&cm.lock, flags);
 		cm_cleanup_timewait(cm_id_priv->timewait_info);
+		spin_unlock_irqrestore(&cm.lock, flags);
 		kfree(cm_id_priv->timewait_info);
 		cm_id_priv->timewait_info = NULL;
 	}
@@ -1307,6 +1309,7 @@ static struct cm_id_private * cm_match_r
 	if (timewait_info) {
 		cur_cm_id_priv = cm_get_id(timewait_info->work.local_id,
 					   timewait_info->work.remote_id);
+		cm_cleanup_timewait(cm_id_priv->timewait_info);
 		spin_unlock_irqrestore(&cm.lock, flags);
 		if (cur_cm_id_priv) {
 			cm_dup_req_handler(work, cur_cm_id_priv);
@@ -1315,7 +1318,8 @@ static struct cm_id_private * cm_match_r
 			cm_issue_rej(work->port, work->mad_recv_wc,
 				     IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ,
 				     NULL, 0);
-		goto error;
+		listen_cm_id_priv = NULL;
+		goto out;
 	}
 
 	/* Find matching listen request. */
@@ -1323,21 +1327,20 @@ static struct cm_id_private * cm_match_r
 					   req_msg->service_id,
 					   req_msg->private_data);
 	if (!listen_cm_id_priv) {
+		cm_cleanup_timewait(cm_id_priv->timewait_info);
 		spin_unlock_irqrestore(&cm.lock, flags);
 		cm_issue_rej(work->port, work->mad_recv_wc,
 			     IB_CM_REJ_INVALID_SERVICE_ID, CM_MSG_RESPONSE_REQ,
 			     NULL, 0);
-		goto error;
+		goto out;
 	}
 	atomic_inc(&listen_cm_id_priv->refcount);
 	atomic_inc(&cm_id_priv->refcount);
 	cm_id_priv->id.state = IB_CM_REQ_RCVD;
 	atomic_inc(&cm_id_priv->work_count);
 	spin_unlock_irqrestore(&cm.lock, flags);
+out:
 	return listen_cm_id_priv;
-
-error:	cm_cleanup_timewait(cm_id_priv->timewait_info);
-	return NULL;
 }
 
 static int cm_req_handler(struct cm_work *work)
@@ -1899,6 +1902,32 @@ out:	spin_unlock_irqrestore(&cm_id_priv-
 }
 EXPORT_SYMBOL(ib_send_cm_drep);
 
+static int cm_issue_drep(struct cm_port *port,
+			 struct ib_mad_recv_wc *mad_recv_wc)
+{
+	struct ib_mad_send_buf *msg = NULL;
+	struct cm_dreq_msg *dreq_msg;
+	struct cm_drep_msg *drep_msg;
+	int ret;
+
+	ret = cm_alloc_response_msg(port, mad_recv_wc, &msg);
+	if (ret)
+		return ret;
+
+	dreq_msg = (struct cm_dreq_msg *) mad_recv_wc->recv_buf.mad;
+	drep_msg = (struct cm_drep_msg *) msg->mad;
+
+	cm_format_mad_hdr(&drep_msg->hdr, CM_DREP_ATTR_ID, dreq_msg->hdr.tid);
+	drep_msg->remote_comm_id = dreq_msg->local_comm_id;
+	drep_msg->local_comm_id = dreq_msg->remote_comm_id;
+
+	ret = ib_post_send_mad(msg, NULL);
+	if (ret)
+		cm_free_msg(msg);
+
+	return ret;
+}
+
 static int cm_dreq_handler(struct cm_work *work)
 {
 	struct cm_id_private *cm_id_priv;
@@ -1910,8 +1939,10 @@ static int cm_dreq_handler(struct cm_wor
 	dreq_msg = (struct cm_dreq_msg *)work->mad_recv_wc->recv_buf.mad;
 	cm_id_priv = cm_acquire_id(dreq_msg->remote_comm_id,
 				   dreq_msg->local_comm_id);
-	if (!cm_id_priv)
+	if (!cm_id_priv) {
+		cm_issue_drep(work->port, work->mad_recv_wc);
 		return -EINVAL;
+	}
 
 	work->cm_event.private_data = &dreq_msg->private_data;
 
@@ -2601,28 +2632,29 @@ static int cm_timewait_handler(struct cm
 {
 	struct cm_timewait_info *timewait_info;
 	struct cm_id_private *cm_id_priv;
-	unsigned long flags;
 	int ret;
 
 	timewait_info = (struct cm_timewait_info *)work;
-	cm_cleanup_timewait(timewait_info);
+	spin_lock_irq(&cm.lock);
+	list_del(&timewait_info->list);
+	spin_unlock_irq(&cm.lock);
 
 	cm_id_priv = cm_acquire_id(timewait_info->work.local_id,
 				   timewait_info->work.remote_id);
 	if (!cm_id_priv)
 		return -EINVAL;
 
-	spin_lock_irqsave(&cm_id_priv->lock, flags);
+	spin_lock_irq(&cm_id_priv->lock);
 	if (cm_id_priv->id.state != IB_CM_TIMEWAIT ||
 	    cm_id_priv->remote_qpn != timewait_info->remote_qpn) {
-		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
+		spin_unlock_irq(&cm_id_priv->lock);
 		goto out;
 	}
 	cm_id_priv->id.state = IB_CM_IDLE;
 	ret = atomic_inc_and_test(&cm_id_priv->work_count);
 	if (!ret)
 		list_add_tail(&work->list, &cm_id_priv->work_list);
-	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
+	spin_unlock_irq(&cm_id_priv->lock);
 
 	if (ret)
 		cm_process_work(cm_id_priv, work);
@@ -3374,6 +3406,7 @@ static int __init ib_cm_init(void)
 	idr_init(&cm.local_id_table);
 	get_random_bytes(&cm.random_id_operand, sizeof cm.random_id_operand);
 	idr_pre_get(&cm.local_id_table, GFP_KERNEL);
+	INIT_LIST_HEAD(&cm.timewait_list);
 
 	cm.wq = create_workqueue("ib_cm");
 	if (!cm.wq)
@@ -3391,7 +3424,20 @@ error:
 
 static void __exit ib_cm_cleanup(void)
 {
+	struct cm_timewait_info *timewait_info, *tmp;
+
+	spin_lock_irq(&cm.lock);
+	list_for_each_entry(timewait_info, &cm.timewait_list, list)
+		cancel_delayed_work(&timewait_info->work.work);
+	spin_unlock_irq(&cm.lock);
+
 	destroy_workqueue(cm.wq);
+
+	list_for_each_entry_safe(timewait_info, tmp, &cm.timewait_list, list) {
+		list_del(&timewait_info->list);
+		kfree(timewait_info);
+	}
+
 	ib_unregister_client(&cm_client);
 	idr_destroy(&cm.local_id_table);
 }
diff --git a/drivers/infiniband/hw/amso1100/c2_ae.c b/drivers/infiniband/hw/amso1100/c2_ae.c
index 3aae497..a31439b 100644
--- a/drivers/infiniband/hw/amso1100/c2_ae.c
+++ b/drivers/infiniband/hw/amso1100/c2_ae.c
@@ -66,7 +66,6 @@ static int c2_convert_cm_status(u32 c2_s
 	}
 }
 
-#ifdef DEBUG
 static const char* to_event_str(int event)
 {
 	static const char* event_str[] = {
@@ -144,7 +143,6 @@ static const char *to_qp_state_str(int s
 		return "<invalid QP state>";
 	};
 }
-#endif
 
 void c2_ae_event(struct c2_dev *c2dev, u32 mq_index)
 {
diff --git a/drivers/infiniband/hw/amso1100/c2_qp.c b/drivers/infiniband/hw/amso1100/c2_qp.c
index 1226113..5bcf697 100644
--- a/drivers/infiniband/hw/amso1100/c2_qp.c
+++ b/drivers/infiniband/hw/amso1100/c2_qp.c
@@ -35,6 +35,8 @@
  *
  */
 
+#include <linux/delay.h>
+
 #include "c2.h"
 #include "c2_vq.h"
 #include "c2_status.h"
@@ -705,10 +707,8 @@ static inline void c2_activity(struct c2
 	 * cannot get on the bus and the card and system hang in a
 	 * deadlock -- thus the need for this code. [TOT]
 	 */
-	while (readl(c2dev->regs + PCI_BAR0_ADAPTER_HINT) & 0x80000000) {
-		set_current_state(TASK_UNINTERRUPTIBLE);
-		schedule_timeout(0);
-	}
+	while (readl(c2dev->regs + PCI_BAR0_ADAPTER_HINT) & 0x80000000)
+		udelay(10);
 
 	__raw_writel(C2_HINT_MAKE(mq_index, shared),
 		     c2dev->regs + PCI_BAR0_ADAPTER_HINT);
@@ -766,6 +766,7 @@ int c2_post_send(struct ib_qp *ibqp, str
 	struct c2_dev *c2dev = to_c2dev(ibqp->device);
 	struct c2_qp *qp = to_c2qp(ibqp);
 	union c2wr wr;
+	unsigned long lock_flags;
 	int err = 0;
 
 	u32 flags;
@@ -881,8 +882,10 @@ int c2_post_send(struct ib_qp *ibqp, str
 		/*
 		 * Post the puppy!
 		 */
+		spin_lock_irqsave(&qp->lock, lock_flags);
 		err = qp_wr_post(&qp->sq_mq, &wr, qp, msg_size);
 		if (err) {
+			spin_unlock_irqrestore(&qp->lock, lock_flags);
 			break;
 		}
 
@@ -890,6 +893,7 @@ int c2_post_send(struct ib_qp *ibqp, str
 		 * Enqueue mq index to activity FIFO.
 		 */
 		c2_activity(c2dev, qp->sq_mq.index, qp->sq_mq.hint_count);
+		spin_unlock_irqrestore(&qp->lock, lock_flags);
 
 		ib_wr = ib_wr->next;
 	}
@@ -905,6 +909,7 @@ int c2_post_receive(struct ib_qp *ibqp, 
 	struct c2_dev *c2dev = to_c2dev(ibqp->device);
 	struct c2_qp *qp = to_c2qp(ibqp);
 	union c2wr wr;
+	unsigned long lock_flags;
 	int err = 0;
 
 	if (qp->state > IB_QPS_RTS)
@@ -945,8 +950,10 @@ int c2_post_receive(struct ib_qp *ibqp, 
 			break;
 		}
 
+		spin_lock_irqsave(&qp->lock, lock_flags);
 		err = qp_wr_post(&qp->rq_mq, &wr, qp, qp->rq_mq.msg_size);
 		if (err) {
+			spin_unlock_irqrestore(&qp->lock, lock_flags);
 			break;
 		}
 
@@ -954,6 +961,7 @@ int c2_post_receive(struct ib_qp *ibqp, 
 		 * Enqueue mq index to activity FIFO
 		 */
 		c2_activity(c2dev, qp->rq_mq.index, qp->rq_mq.hint_count);
+		spin_unlock_irqrestore(&qp->lock, lock_flags);
 
 		ib_wr = ib_wr->next;
 	}
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c
index 981fe2e..fc67f78 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -179,6 +179,8 @@ static int mthca_query_port(struct ib_de
 	props->max_mtu           = out_mad->data[41] & 0xf;
 	props->active_mtu        = out_mad->data[36] >> 4;
 	props->subnet_timeout    = out_mad->data[51] & 0x1f;
+	props->max_vl_num        = out_mad->data[37] >> 4;
+	props->init_type_reply   = out_mad->data[41] >> 4;
 
  out:
 	kfree(in_mad);
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c
index 0f316c8..92a72f5 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -201,6 +201,8 @@ int mthca_alloc_srq(struct mthca_dev *de
 
 	if (mthca_is_memfree(dev))
 		srq->max = roundup_pow_of_two(srq->max + 1);
+	else
+		srq->max = srq->max + 1;
 
 	ds = max(64UL,
 		 roundup_pow_of_two(sizeof (struct mthca_next_seg) +
@@ -277,7 +279,7 @@ int mthca_alloc_srq(struct mthca_dev *de
 	srq->first_free = 0;
 	srq->last_free  = srq->max - 1;
 
-	attr->max_wr    = (mthca_is_memfree(dev)) ? srq->max - 1 : srq->max;
+	attr->max_wr    = srq->max - 1;
 	attr->max_sge   = srq->max_gs;
 
 	return 0;
@@ -413,7 +415,7 @@ int mthca_query_srq(struct ib_srq *ibsrq
 		srq_attr->srq_limit = be16_to_cpu(tavor_ctx->limit_watermark);
 	}
 
-	srq_attr->max_wr  = (mthca_is_memfree(dev)) ? srq->max - 1 : srq->max;
+	srq_attr->max_wr  = srq->max - 1;
 	srq_attr->max_sge = srq->max_gs;
 
 out:
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index f426a69..8bf5e9e 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -355,6 +355,11 @@ void ipoib_send(struct net_device *dev, 
 	tx_req->skb = skb;
 	addr = dma_map_single(priv->ca->dma_device, skb->data, skb->len,
 			      DMA_TO_DEVICE);
+	if (unlikely(dma_mapping_error(addr))) {
+		++priv->stats.tx_errors;
+		dev_kfree_skb_any(skb);
+		return;
+	}
 	pci_unmap_addr_set(tx_req, mapping, addr);
 
 	if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1),
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 44b9e5b..4b09147 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -343,29 +343,32 @@ static int srp_send_req(struct srp_targe
 	 */
 	if (target->io_class == SRP_REV10_IB_IO_CLASS) {
 		memcpy(req->priv.initiator_port_id,
-		       target->srp_host->initiator_port_id + 8, 8);
+		       &target->path.sgid.global.interface_id, 8);
 		memcpy(req->priv.initiator_port_id + 8,
-		       target->srp_host->initiator_port_id, 8);
+		       &target->initiator_ext, 8);
 		memcpy(req->priv.target_port_id,     &target->ioc_guid, 8);
 		memcpy(req->priv.target_port_id + 8, &target->id_ext, 8);
 	} else {
 		memcpy(req->priv.initiator_port_id,
-		       target->srp_host->initiator_port_id, 16);
+		       &target->initiator_ext, 8);
+		memcpy(req->priv.initiator_port_id + 8,
+		       &target->path.sgid.global.interface_id, 8);
 		memcpy(req->priv.target_port_id,     &target->id_ext, 8);
 		memcpy(req->priv.target_port_id + 8, &target->ioc_guid, 8);
 	}
 
 	/*
 	 * Topspin/Cisco SRP targets will reject our login unless we
-	 * zero out the first 8 bytes of our initiator port ID.  The
-	 * second 8 bytes must be our local node GUID, but we always
-	 * use that anyway.
+	 * zero out the first 8 bytes of our initiator port ID and set
+	 * the second 8 bytes to the local node GUID.
 	 */
 	if (topspin_workarounds && !memcmp(&target->ioc_guid, topspin_oui, 3)) {
 		printk(KERN_DEBUG PFX "Topspin/Cisco initiator port ID workaround "
 		       "activated for target GUID %016llx\n",
 		       (unsigned long long) be64_to_cpu(target->ioc_guid));
 		memset(req->priv.initiator_port_id, 0, 8);
+		memcpy(req->priv.initiator_port_id + 8,
+		       &target->srp_host->dev->dev->node_guid, 8);
 	}
 
 	status = ib_send_cm_req(target->cm_id, &req->param);
@@ -1553,6 +1556,7 @@ enum {
 	SRP_OPT_MAX_SECT	= 1 << 5,
 	SRP_OPT_MAX_CMD_PER_LUN	= 1 << 6,
 	SRP_OPT_IO_CLASS	= 1 << 7,
+	SRP_OPT_INITIATOR_EXT	= 1 << 8,
 	SRP_OPT_ALL		= (SRP_OPT_ID_EXT	|
 				   SRP_OPT_IOC_GUID	|
 				   SRP_OPT_DGID		|
@@ -1569,6 +1573,7 @@ static match_table_t srp_opt_tokens = {
 	{ SRP_OPT_MAX_SECT,		"max_sect=%d" 		},
 	{ SRP_OPT_MAX_CMD_PER_LUN,	"max_cmd_per_lun=%d" 	},
 	{ SRP_OPT_IO_CLASS,		"io_class=%x"		},
+	{ SRP_OPT_INITIATOR_EXT,	"initiator_ext=%s"	},
 	{ SRP_OPT_ERR,			NULL 			}
 };
 
@@ -1668,6 +1673,12 @@ static int srp_parse_options(const char 
 			target->io_class = token;
 			break;
 
+		case SRP_OPT_INITIATOR_EXT:
+			p = match_strdup(args);
+			target->initiator_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
+			kfree(p);
+			break;
+
 		default:
 			printk(KERN_WARNING PFX "unknown parameter or missing value "
 			       "'%s' in target creation request\n", p);
@@ -1708,7 +1719,6 @@ static ssize_t srp_create_target(struct 
 	target_host->max_lun = SRP_MAX_LUN;
 
 	target = host_to_target(target_host);
-	memset(target, 0, sizeof *target);
 
 	target->io_class   = SRP_REV16A_IB_IO_CLASS;
 	target->scsi_host  = target_host;
@@ -1815,9 +1825,6 @@ static struct srp_host *srp_add_port(str
 	host->dev  = device;
 	host->port = port;
 
-	host->initiator_port_id[7] = port;
-	memcpy(host->initiator_port_id + 8, &device->dev->node_guid, 8);
-
 	host->class_dev.class = &srp_class;
 	host->class_dev.dev   = device->dev->dma_device;
 	snprintf(host->class_dev.class_id, BUS_ID_SIZE, "srp-%s-%d",
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h
index 5b581fb..d4e35ef 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.h
+++ b/drivers/infiniband/ulp/srp/ib_srp.h
@@ -91,7 +91,6 @@ struct srp_device {
 };
 
 struct srp_host {
-	u8			initiator_port_id[16];
 	struct srp_device      *dev;
 	u8			port;
 	struct class_device	class_dev;
@@ -122,6 +121,7 @@ struct srp_target_port {
 	__be64			id_ext;
 	__be64			ioc_guid;
 	__be64			service_id;
+	__be64			initiator_ext;
 	u16			io_class;
 	struct srp_host	       *srp_host;
 	struct Scsi_Host       *scsi_host;

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

* [GIT PULL] please pull infiniband.git
@ 2006-10-02 21:57 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-10-02 21:57 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

We're through the bulk of our 2.6.19 merge, but this will get some
fixes for drivers and the RDMA CM:

Hoang-Nam Nguyen:
      IB/ehca: Fix device registration
      IB/ehca: Tweak trace message format

Krishna Kumar:
      RDMA/cma: Fix leak of cm_ids in case of failures
      RDMA/cma: Fix device removal race
      RDMA/cma: Eliminate unnecessary remove_list
      RDMA/cma: Optimize error handling

Ralph Campbell:
      IB/ipath: Fix RDMA reads

Sean Hefty:
      RDMA/cma: Set status correctly on route resolution error

 drivers/infiniband/core/cma.c           |   47 +++++++++++++++----------
 drivers/infiniband/hw/ehca/ehca_main.c  |   36 ++++++++++---------
 drivers/infiniband/hw/ehca/ehca_tools.h |    2 +
 drivers/infiniband/hw/ipath/ipath_rc.c  |   59 +++++++++++++++++--------------
 4 files changed, 80 insertions(+), 64 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 1178bd4..9ae4f3a 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -874,23 +874,25 @@ static struct rdma_id_private *cma_new_i
 	__u16 port;
 	u8 ip_ver;
 
+	if (cma_get_net_info(ib_event->private_data, listen_id->ps,
+			     &ip_ver, &port, &src, &dst))
+		goto err;
+
 	id = rdma_create_id(listen_id->event_handler, listen_id->context,
 			    listen_id->ps);
 	if (IS_ERR(id))
-		return NULL;
+		goto err;
+
+	cma_save_net_info(&id->route.addr, &listen_id->route.addr,
+			  ip_ver, port, src, dst);
 
 	rt = &id->route;
 	rt->num_paths = ib_event->param.req_rcvd.alternate_path ? 2 : 1;
-	rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths, GFP_KERNEL);
+	rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths,
+			       GFP_KERNEL);
 	if (!rt->path_rec)
-		goto err;
+		goto destroy_id;
 
-	if (cma_get_net_info(ib_event->private_data, listen_id->ps,
-			     &ip_ver, &port, &src, &dst))
-		goto err;
-
-	cma_save_net_info(&id->route.addr, &listen_id->route.addr,
-			  ip_ver, port, src, dst);
 	rt->path_rec[0] = *ib_event->param.req_rcvd.primary_path;
 	if (rt->num_paths == 2)
 		rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
@@ -903,8 +905,10 @@ static struct rdma_id_private *cma_new_i
 	id_priv = container_of(id, struct rdma_id_private, id);
 	id_priv->state = CMA_CONNECT;
 	return id_priv;
-err:
+
+destroy_id:
 	rdma_destroy_id(id);
+err:
 	return NULL;
 }
 
@@ -932,6 +936,7 @@ static int cma_req_handler(struct ib_cm_
 	mutex_unlock(&lock);
 	if (ret) {
 		ret = -ENODEV;
+		cma_exch(conn_id, CMA_DESTROYING);
 		cma_release_remove(conn_id);
 		rdma_destroy_id(&conn_id->id);
 		goto out;
@@ -1307,6 +1312,7 @@ static void cma_query_handler(int status
 		work->old_state = CMA_ROUTE_QUERY;
 		work->new_state = CMA_ADDR_RESOLVED;
 		work->event.event = RDMA_CM_EVENT_ROUTE_ERROR;
+		work->event.status = status;
 	}
 
 	queue_work(cma_wq, &work->work);
@@ -1862,6 +1868,11 @@ static int cma_connect_ib(struct rdma_id
 
 	ret = ib_send_cm_req(id_priv->cm_id.ib, &req);
 out:
+	if (ret && !IS_ERR(id_priv->cm_id.ib)) {
+		ib_destroy_cm_id(id_priv->cm_id.ib);
+		id_priv->cm_id.ib = NULL;
+	}
+
 	kfree(private_data);
 	return ret;
 }
@@ -1889,10 +1900,8 @@ static int cma_connect_iw(struct rdma_id
 	cm_id->remote_addr = *sin;
 
 	ret = cma_modify_qp_rtr(&id_priv->id);
-	if (ret) {
-		iw_destroy_cm_id(cm_id);
-		return ret;
-	}
+	if (ret)
+		goto out;
 
 	iw_param.ord = conn_param->initiator_depth;
 	iw_param.ird = conn_param->responder_resources;
@@ -1904,6 +1913,10 @@ static int cma_connect_iw(struct rdma_id
 		iw_param.qpn = conn_param->qp_num;
 	ret = iw_cm_connect(cm_id, &iw_param);
 out:
+	if (ret && !IS_ERR(cm_id)) {
+		iw_destroy_cm_id(cm_id);
+		id_priv->cm_id.iw = NULL;
+	}
 	return ret;
 }
 
@@ -2142,12 +2155,9 @@ static int cma_remove_id_dev(struct rdma
 
 static void cma_process_remove(struct cma_device *cma_dev)
 {
-	struct list_head remove_list;
 	struct rdma_id_private *id_priv;
 	int ret;
 
-	INIT_LIST_HEAD(&remove_list);
-
 	mutex_lock(&lock);
 	while (!list_empty(&cma_dev->id_list)) {
 		id_priv = list_entry(cma_dev->id_list.next,
@@ -2158,8 +2168,7 @@ static void cma_process_remove(struct cm
 			continue;
 		}
 
-		list_del(&id_priv->list);
-		list_add_tail(&id_priv->list, &remove_list);
+		list_del_init(&id_priv->list);
 		atomic_inc(&id_priv->refcount);
 		mutex_unlock(&lock);
 
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 2380994..024d511 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -49,7 +49,7 @@ #include "hcp_if.h"
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
 MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
-MODULE_VERSION("SVNEHCA_0016");
+MODULE_VERSION("SVNEHCA_0017");
 
 int ehca_open_aqp1     = 0;
 int ehca_debug_level   = 0;
@@ -239,7 +239,7 @@ init_node_guid1:
 	return ret;
 }
 
-int ehca_register_device(struct ehca_shca *shca)
+int ehca_init_device(struct ehca_shca *shca)
 {
 	int ret;
 
@@ -317,11 +317,6 @@ int ehca_register_device(struct ehca_shc
 	/* shca->ib_device.process_mad	    = ehca_process_mad;	    */
 	shca->ib_device.mmap		    = ehca_mmap;
 
-	ret = ib_register_device(&shca->ib_device);
-	if (ret)
-		ehca_err(&shca->ib_device,
-			 "ib_register_device() failed ret=%x", ret);
-
 	return ret;
 }
 
@@ -561,9 +556,9 @@ static int __devinit ehca_probe(struct i
 		goto probe1;
 	}
 
-	ret = ehca_register_device(shca);
+	ret = ehca_init_device(shca);
 	if (ret) {
-		ehca_gen_err("Cannot register Infiniband device");
+		ehca_gen_err("Cannot init ehca  device struct");
 		goto probe1;
 	}
 
@@ -571,7 +566,7 @@ static int __devinit ehca_probe(struct i
 	ret = ehca_create_eq(shca, &shca->eq, EHCA_EQ, 2048);
 	if (ret) {
 		ehca_err(&shca->ib_device, "Cannot create EQ.");
-		goto probe2;
+		goto probe1;
 	}
 
 	ret = ehca_create_eq(shca, &shca->neq, EHCA_NEQ, 513);
@@ -600,6 +595,13 @@ static int __devinit ehca_probe(struct i
 		goto probe5;
 	}
 
+	ret = ib_register_device(&shca->ib_device);
+	if (ret) {
+		ehca_err(&shca->ib_device,
+			 "ib_register_device() failed ret=%x", ret);
+		goto probe6;
+	}
+
 	/* create AQP1 for port 1 */
 	if (ehca_open_aqp1 == 1) {
 		shca->sport[0].port_state = IB_PORT_DOWN;
@@ -607,7 +609,7 @@ static int __devinit ehca_probe(struct i
 		if (ret) {
 			ehca_err(&shca->ib_device,
 				 "Cannot create AQP1 for port 1.");
-			goto probe6;
+			goto probe7;
 		}
 	}
 
@@ -618,7 +620,7 @@ static int __devinit ehca_probe(struct i
 		if (ret) {
 			ehca_err(&shca->ib_device,
 				 "Cannot create AQP1 for port 2.");
-			goto probe7;
+			goto probe8;
 		}
 	}
 
@@ -630,12 +632,15 @@ static int __devinit ehca_probe(struct i
 
 	return 0;
 
-probe7:
+probe8:
 	ret = ehca_destroy_aqp1(&shca->sport[0]);
 	if (ret)
 		ehca_err(&shca->ib_device,
 			 "Cannot destroy AQP1 for port 1. ret=%x", ret);
 
+probe7:
+	ib_unregister_device(&shca->ib_device);
+
 probe6:
 	ret = ehca_dereg_internal_maxmr(shca);
 	if (ret)
@@ -660,9 +665,6 @@ probe3:
 		ehca_err(&shca->ib_device,
 			 "Cannot destroy EQ. ret=%x", ret);
 
-probe2:
-	ib_unregister_device(&shca->ib_device);
-
 probe1:
 	ib_dealloc_device(&shca->ib_device);
 
@@ -750,7 +752,7 @@ int __init ehca_module_init(void)
 	int ret;
 
 	printk(KERN_INFO "eHCA Infiniband Device Driver "
-	                 "(Rel.: SVNEHCA_0016)\n");
+	                 "(Rel.: SVNEHCA_0017)\n");
 	idr_init(&ehca_qp_idr);
 	idr_init(&ehca_cq_idr);
 	spin_lock_init(&ehca_qp_idr_lock);
diff --git a/drivers/infiniband/hw/ehca/ehca_tools.h b/drivers/infiniband/hw/ehca/ehca_tools.h
index 9f56bb8..809da3e 100644
--- a/drivers/infiniband/hw/ehca/ehca_tools.h
+++ b/drivers/infiniband/hw/ehca/ehca_tools.h
@@ -117,7 +117,7 @@ #define ehca_dmp(adr, len, format, args.
 		unsigned int l = (unsigned int)(len); \
 		unsigned char *deb = (unsigned char*)(adr);	\
 		for (x = 0; x < l; x += 16) { \
-			printk("EHCA_DMP:%s" format \
+			printk("EHCA_DMP:%s " format \
 			       " adr=%p ofs=%04x %016lx %016lx\n", \
 			       __FUNCTION__, ##args, deb, x, \
 			       *((u64 *)&deb[0]), *((u64 *)&deb[8])); \
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c
index a504cf6..ce60387 100644
--- a/drivers/infiniband/hw/ipath/ipath_rc.c
+++ b/drivers/infiniband/hw/ipath/ipath_rc.c
@@ -241,10 +241,7 @@ int ipath_make_rc_req(struct ipath_qp *q
 		 * original work request since we may need to resend
 		 * it.
 		 */
-		qp->s_sge.sge = wqe->sg_list[0];
-		qp->s_sge.sg_list = wqe->sg_list + 1;
-		qp->s_sge.num_sge = wqe->wr.num_sge;
-		qp->s_len = len = wqe->length;
+		len = wqe->length;
 		ss = &qp->s_sge;
 		bth2 = 0;
 		switch (wqe->wr.opcode) {
@@ -368,14 +365,23 @@ int ipath_make_rc_req(struct ipath_qp *q
 		default:
 			goto done;
 		}
+		qp->s_sge.sge = wqe->sg_list[0];
+		qp->s_sge.sg_list = wqe->sg_list + 1;
+		qp->s_sge.num_sge = wqe->wr.num_sge;
+		qp->s_len = wqe->length;
 		if (newreq) {
 			qp->s_tail++;
 			if (qp->s_tail >= qp->s_size)
 				qp->s_tail = 0;
 		}
-		bth2 |= qp->s_psn++ & IPATH_PSN_MASK;
-		if ((int)(qp->s_psn - qp->s_next_psn) > 0)
-			qp->s_next_psn = qp->s_psn;
+		bth2 |= qp->s_psn & IPATH_PSN_MASK;
+		if (wqe->wr.opcode == IB_WR_RDMA_READ)
+			qp->s_psn = wqe->lpsn + 1;
+		else {
+			qp->s_psn++;
+			if ((int)(qp->s_psn - qp->s_next_psn) > 0)
+				qp->s_next_psn = qp->s_psn;
+		}
 		/*
 		 * Put the QP on the pending list so lost ACKs will cause
 		 * a retry.  More than one request can be pending so the
@@ -690,13 +696,6 @@ void ipath_restart_rc(struct ipath_qp *q
 	struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last);
 	struct ipath_ibdev *dev;
 
-	/*
-	 * If there are no requests pending, we are done.
-	 */
-	if (ipath_cmp24(psn, qp->s_next_psn) >= 0 ||
-	    qp->s_last == qp->s_tail)
-		goto done;
-
 	if (qp->s_retry == 0) {
 		wc->wr_id = wqe->wr.wr_id;
 		wc->status = IB_WC_RETRY_EXC_ERR;
@@ -731,8 +730,6 @@ void ipath_restart_rc(struct ipath_qp *q
 		dev->n_rc_resends += (int)qp->s_psn - (int)psn;
 
 	reset_psn(qp, psn);
-
-done:
 	tasklet_hi_schedule(&qp->s_task);
 
 bail:
@@ -765,6 +762,7 @@ static int do_rc_ack(struct ipath_qp *qp
 	struct ib_wc wc;
 	struct ipath_swqe *wqe;
 	int ret = 0;
+	u32 ack_psn;
 
 	/*
 	 * Remove the QP from the timeout queue (or RNR timeout queue).
@@ -777,26 +775,26 @@ static int do_rc_ack(struct ipath_qp *qp
 		list_del_init(&qp->timerwait);
 	spin_unlock(&dev->pending_lock);
 
+	/* Nothing is pending to ACK/NAK. */
+	if (unlikely(qp->s_last == qp->s_tail))
+		goto bail;
+
 	/*
 	 * Note that NAKs implicitly ACK outstanding SEND and RDMA write
 	 * requests and implicitly NAK RDMA read and atomic requests issued
 	 * before the NAK'ed request.  The MSN won't include the NAK'ed
 	 * request but will include an ACK'ed request(s).
 	 */
+	ack_psn = psn;
+	if (aeth >> 29)
+		ack_psn--;
 	wqe = get_swqe_ptr(qp, qp->s_last);
 
-	/* Nothing is pending to ACK/NAK. */
-	if (qp->s_last == qp->s_tail)
-		goto bail;
-
 	/*
 	 * The MSN might be for a later WQE than the PSN indicates so
 	 * only complete WQEs that the PSN finishes.
 	 */
-	while (ipath_cmp24(psn, wqe->lpsn) >= 0) {
-		/* If we are ACKing a WQE, the MSN should be >= the SSN. */
-		if (ipath_cmp24(aeth, wqe->ssn) < 0)
-			break;
+	while (ipath_cmp24(ack_psn, wqe->lpsn) >= 0) {
 		/*
 		 * If this request is a RDMA read or atomic, and the ACK is
 		 * for a later operation, this ACK NAKs the RDMA read or
@@ -807,7 +805,8 @@ static int do_rc_ack(struct ipath_qp *qp
 		 * is sent but before the response is received.
 		 */
 		if ((wqe->wr.opcode == IB_WR_RDMA_READ &&
-		     opcode != OP(RDMA_READ_RESPONSE_LAST)) ||
+		     (opcode != OP(RDMA_READ_RESPONSE_LAST) ||
+		       ipath_cmp24(ack_psn, wqe->lpsn) != 0)) ||
 		    ((wqe->wr.opcode == IB_WR_ATOMIC_CMP_AND_SWP ||
 		      wqe->wr.opcode == IB_WR_ATOMIC_FETCH_AND_ADD) &&
 		     (opcode != OP(ATOMIC_ACKNOWLEDGE) ||
@@ -825,6 +824,10 @@ static int do_rc_ack(struct ipath_qp *qp
 			 */
 			goto bail;
 		}
+		if (wqe->wr.opcode == IB_WR_RDMA_READ ||
+		    wqe->wr.opcode == IB_WR_ATOMIC_CMP_AND_SWP ||
+		    wqe->wr.opcode == IB_WR_ATOMIC_FETCH_AND_ADD)
+			tasklet_hi_schedule(&qp->s_task);
 		/* Post a send completion queue entry if requested. */
 		if (!test_bit(IPATH_S_SIGNAL_REQ_WR, &qp->s_flags) ||
 		    (wqe->wr.send_flags & IB_SEND_SIGNALED)) {
@@ -1055,7 +1058,8 @@ static inline void ipath_rc_rcv_resp(str
 		/* no AETH, no ACK */
 		if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) {
 			dev->n_rdma_seq++;
-			ipath_restart_rc(qp, qp->s_last_psn + 1, &wc);
+			if (qp->s_last != qp->s_tail)
+				ipath_restart_rc(qp, qp->s_last_psn + 1, &wc);
 			goto ack_done;
 		}
 	rdma_read:
@@ -1091,7 +1095,8 @@ static inline void ipath_rc_rcv_resp(str
 		/* ACKs READ req. */
 		if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) {
 			dev->n_rdma_seq++;
-			ipath_restart_rc(qp, qp->s_last_psn + 1, &wc);
+			if (qp->s_last != qp->s_tail)
+				ipath_restart_rc(qp, qp->s_last_psn + 1, &wc);
 			goto ack_done;
 		}
 		/* FALLTHROUGH */

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

* [GIT PULL] Please pull infiniband.git
@ 2006-09-28 18:20 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-09-28 18:20 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This will merge:
 - ipath updates
 - iSER updates
 - a few of amso1100 Coverity fixes and warning cleanups

Bryan O'Sullivan:
      IB/ipath: Limit # of packets sent without an ACK received
      IB/ipath: Fix memory leak if allocation fails
      IB/ipath: Driver support for userspace sharing of HW contexts
      IB/ipath: Support revision 2 InfiniPath PCIE devices
      IB/ipath: Unregister from IB core early
      IB/ipath: Clean up handling of GUID 0
      IB/ipath: Lock and count allocated CQs properly
      IB/ipath: Count SRQs properly
      IB/ipath: Only allow complete writes to flash
      IB/ipath: RC and UC should validate SLID and DLID
      IB/ipath: Ensure that PD of MR matches PD of QP checking the Rkey
      IB/ipath: Print more informative parity error messages
      IB/ipath: Fix compiler warnings and errors on non-x86_64 systems
      IB/ipath: Fix mismatch in shifts and masks for printing debug info
      IB/ipath: Support multiple simultaneous devices of different types
      IB/ipath: Drop unnecessary "(void *)" casts
      IB/ipath: Improved support for PowerPC
      IB/ipath: Flush RWQEs if access error or invalid error seen
      IB/ipath: Call mtrr_del with correct arguments
      IB/ipath: Clean up module exit code
      IB/ipath: Change HT CRC message to indicate how to resolve problem
      IB/ipath: Fix and recover TXE piobuf and PBC parity errors
      IB/ipath: Fix EEPROM read when driver is compiled with -Os
      IB/ipath: Set CPU affinity early
      IB/ipath: Support new PCIE device, QLE7142
      IB/ipath: Fix races with ib_resize_cq()
      IB/ipath: Fix lockdep error upon "ifconfig ibN down"

Erez Zilber:
      IB/iser: Have iSER data transaction object point to iSER conn
      IB/iser: DMA unmap unaligned for RDMA data before touching it
      IB/iser: Fix the description of iSER in Kconfig

Eric Sesterhenn:
      RDMA/amso1100: Fix error path in c2_llp_accept()

Roland Dreier:
      RDMA/amso1100: Fix compile warnings
      RDMA/amso1100: Fix memory leak in c2_reg_phys_mr()

 drivers/infiniband/hw/amso1100/c2_ae.c         |    2 
 drivers/infiniband/hw/amso1100/c2_alloc.c      |    2 
 drivers/infiniband/hw/amso1100/c2_cm.c         |   15 
 drivers/infiniband/hw/amso1100/c2_provider.c   |    8 
 drivers/infiniband/hw/amso1100/c2_rnic.c       |    4 
 drivers/infiniband/hw/ipath/ipath_common.h     |   54 +
 drivers/infiniband/hw/ipath/ipath_cq.c         |   48 +
 drivers/infiniband/hw/ipath/ipath_driver.c     |  359 ++++-----
 drivers/infiniband/hw/ipath/ipath_eeprom.c     |   17 
 drivers/infiniband/hw/ipath/ipath_file_ops.c   |  974 ++++++++++++++++++------
 drivers/infiniband/hw/ipath/ipath_fs.c         |    9 
 drivers/infiniband/hw/ipath/ipath_iba6110.c    |  132 ++-
 drivers/infiniband/hw/ipath/ipath_iba6120.c    |  263 ++++--
 drivers/infiniband/hw/ipath/ipath_init_chip.c  |   56 +
 drivers/infiniband/hw/ipath/ipath_intr.c       |  280 +++++--
 drivers/infiniband/hw/ipath/ipath_kernel.h     |  116 +++
 drivers/infiniband/hw/ipath/ipath_keys.c       |   12 
 drivers/infiniband/hw/ipath/ipath_mad.c        |   16 
 drivers/infiniband/hw/ipath/ipath_mr.c         |    3 
 drivers/infiniband/hw/ipath/ipath_qp.c         |   16 
 drivers/infiniband/hw/ipath/ipath_rc.c         |   77 +-
 drivers/infiniband/hw/ipath/ipath_registers.h  |   40 +
 drivers/infiniband/hw/ipath/ipath_ruc.c        |   14 
 drivers/infiniband/hw/ipath/ipath_srq.c        |   23 -
 drivers/infiniband/hw/ipath/ipath_sysfs.c      |   21 -
 drivers/infiniband/hw/ipath/ipath_uc.c         |    6 
 drivers/infiniband/hw/ipath/ipath_ud.c         |    6 
 drivers/infiniband/hw/ipath/ipath_user_pages.c |   56 +
 drivers/infiniband/hw/ipath/ipath_verbs.c      |   43 +
 drivers/infiniband/hw/ipath/ipath_verbs.h      |   18 
 drivers/infiniband/hw/ipath/ipath_wc_ppc64.c   |   20 
 drivers/infiniband/hw/ipath/ipath_wc_x86_64.c  |   13 
 drivers/infiniband/ulp/iser/Kconfig            |   13 
 drivers/infiniband/ulp/iser/iscsi_iser.c       |    2 
 drivers/infiniband/ulp/iser/iscsi_iser.h       |    9 
 drivers/infiniband/ulp/iser/iser_initiator.c   |   60 -
 drivers/infiniband/ulp/iser/iser_memory.c      |   42 +
 drivers/infiniband/ulp/iser/iser_verbs.c       |    8 
 38 files changed, 1973 insertions(+), 884 deletions(-)

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

* [GIT PULL] please pull infiniband.git
@ 2006-09-22 22:37 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-09-22 22:37 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, netdev, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree has:
 - Add support for iWARP (RDMA over IP)
 - Add amso1100 driver for Ammasso 1100 iWARP adapters
 - Add ehca driver for IBM GX InfiniBand adapters
 - ipath fixes
 - lots of other smaller stuff

Bryan O'Sullivan:
      IB/ipath: More changes to support InfiniPath on PowerPC 970 systems
      IB/ipath: lock resource limit counters correctly
      IB/ipath: fix for crash on module unload, if cfgports < portcnt
      IB/ipath: fix handling of kpiobufs
      IB/ipath: drop requirement that PIO buffers be mmaped write-only
      IB/ipath: merge ipath_core and ib_ipath drivers
      IB/ipath: simplify layering code
      IB/ipath: simplify debugging code after ipath_core and ib_ipath merger
      IB/ipath: remove stale references to userspace SMA
      IB/ipath: trivial cleanups
      IB/ipath: add new minor device to allow sending of diag packets
      IB/ipath: do not allow use of CQ entries with invalid counts
      IB/ipath: account for attached QPs correctly
      IB/ipath: support new QLogic product naming scheme
      IB/ipath: add serial number to hardware freeze error message
      IB/ipath: be more strict about testing the modify QP verb
      IB/ipath: validate path_mig_state properly
      IB/ipath: put a limit on the number of QPs that can be created
      IB/ipath: handle sq_sig_all field correctly
      IB/ipath: allow SMA to be disabled
      IB/ipath: fix return value from ipath_poll
      IB/ipath: control receive polarity inversion

Dotan Barak:
      IPoIB: Remove unused include of vmalloc.h

Eli Cohen:
      IPoIB: Rejoin all multicast groups after a port event
      IPoIB: Add some likely/unlikely annotations in hot path

Erez Zilber:
      IB/iser: fix a check of SG alignment for RDMA
      IB/iser: Limit the max size of a scsi command
      IB/iser: make FMR "page size" be 4K and not PAGE_SIZE
      IB/iser: fix some debug prints
      IB/iser: Do not use FMR for a single dma entry sg

Heiko J Schick:
      IB/ehca: Add driver for IBM eHCA InfiniBand adapters

Ishai Rabinovitz:
      IB/srp: Add port/device attributes

Jack Morgenstein:
      IB/mthca: Fix lid used for sending traps
      IB/mthca: Fix default static rate returned for Tavor in AV
      IB/mthca: Return port number for unconnected QPs in query_qp
      IB/mthca: Return correct number of bits for static rate in query_qp
      IB/mthca: Recover from catastrophic errors

James Lentini:
      IB/mthca: Include the header we really want
      IB/mad: Remove unused includes

Krishna Kumar:
      IB: Fix typo in kerneldoc for ib_set_client_data()

Michael S. Tsirkin:
      IB/mthca: Don't use privileged UAR for kernel access
      IB/ipoib: Fix flush/start xmit race (from code review)
      IB/sa: Require SA registration
      IB/cm: Do not track remote QPN in timewait state
      IB/sa: fix ib_sa_selector names

Or Gerlitz:
      RDMA/cma: Document rdma_destroy_id() function
      RDMA/cma: Document rdma_accept() error handling

Ralph Campbell:
      IB/uverbs: Allow resize CQ operation to return driver-specific data
      IB/uverbs: Pass userspace data to modify_srq and modify_qp methods
      IB/ipath: Performance improvements via mmap of queues

Roland Dreier:
      IB/uverbs: Use idr_read_cq() where appropriate
      IB/uverbs: Fix lockdep warning when QP is created with 2 CQs
      IB: Whitespace fixes
      IPoIB: Refactor completion handling
      IB/mthca: Simplify calls to mthca_cq_clean()
      IB/iser: INFINIBAND_ISER depends on INET
      IPoIB: Create MCGs with all attributes required by RFC

Sean Hefty:
      IB/cm: Enable atomics along with RDMA reads
      IB/cm: Use correct reject code for invalid GID
      IB/mad: Add support for dual-sided RMPP transfers.
      IB/cm: Randomize starting comm ID
      RDMA/cma: Protect against adding device during destruction

Tom Tucker:
      RDMA: iWARP Connection Manager.
      RDMA: iWARP Core Changes.
      RDMA/amso1100: Add driver for Ammasso 1100 RNIC

 MAINTAINERS                                       |   16 
 drivers/infiniband/Kconfig                        |    4 
 drivers/infiniband/Makefile                       |    4 
 drivers/infiniband/core/Makefile                  |    4 
 drivers/infiniband/core/addr.c                    |   22 
 drivers/infiniband/core/cache.c                   |    5 
 drivers/infiniband/core/cm.c                      |   66 -
 drivers/infiniband/core/cma.c                     |  403 +++-
 drivers/infiniband/core/device.c                  |    6 
 drivers/infiniband/core/iwcm.c                    | 1019 +++++++++
 drivers/infiniband/core/iwcm.h                    |   62 +
 drivers/infiniband/core/mad.c                     |   19 
 drivers/infiniband/core/mad_priv.h                |    1 
 drivers/infiniband/core/mad_rmpp.c                |   94 +
 drivers/infiniband/core/sa_query.c                |   67 +
 drivers/infiniband/core/smi.c                     |   16 
 drivers/infiniband/core/sysfs.c                   |   13 
 drivers/infiniband/core/ucm.c                     |    9 
 drivers/infiniband/core/user_mad.c                |    7 
 drivers/infiniband/core/uverbs_cmd.c              |   64 -
 drivers/infiniband/core/verbs.c                   |   21 
 drivers/infiniband/hw/amso1100/Kbuild             |    8 
 drivers/infiniband/hw/amso1100/Kconfig            |   15 
 drivers/infiniband/hw/amso1100/c2.c               | 1255 ++++++++++++
 drivers/infiniband/hw/amso1100/c2.h               |  551 +++++
 drivers/infiniband/hw/amso1100/c2_ae.c            |  321 +++
 drivers/infiniband/hw/amso1100/c2_ae.h            |  108 +
 drivers/infiniband/hw/amso1100/c2_alloc.c         |  144 +
 drivers/infiniband/hw/amso1100/c2_cm.c            |  452 ++++
 drivers/infiniband/hw/amso1100/c2_cq.c            |  433 ++++
 drivers/infiniband/hw/amso1100/c2_intr.c          |  209 ++
 drivers/infiniband/hw/amso1100/c2_mm.c            |  375 +++
 drivers/infiniband/hw/amso1100/c2_mq.c            |  174 ++
 drivers/infiniband/hw/amso1100/c2_mq.h            |  106 +
 drivers/infiniband/hw/amso1100/c2_pd.c            |   89 +
 drivers/infiniband/hw/amso1100/c2_provider.c      |  869 ++++++++
 drivers/infiniband/hw/amso1100/c2_provider.h      |  181 ++
 drivers/infiniband/hw/amso1100/c2_qp.c            |  975 +++++++++
 drivers/infiniband/hw/amso1100/c2_rnic.c          |  663 ++++++
 drivers/infiniband/hw/amso1100/c2_status.h        |  158 +
 drivers/infiniband/hw/amso1100/c2_user.h          |   82 +
 drivers/infiniband/hw/amso1100/c2_vq.c            |  260 ++
 drivers/infiniband/hw/amso1100/c2_vq.h            |   63 +
 drivers/infiniband/hw/amso1100/c2_wr.h            | 1520 ++++++++++++++
 drivers/infiniband/hw/ehca/Kconfig                |   16 
 drivers/infiniband/hw/ehca/Makefile               |   16 
 drivers/infiniband/hw/ehca/ehca_av.c              |  271 +++
 drivers/infiniband/hw/ehca/ehca_classes.h         |  346 +++
 drivers/infiniband/hw/ehca/ehca_classes_pSeries.h |  236 ++
 drivers/infiniband/hw/ehca/ehca_cq.c              |  427 ++++
 drivers/infiniband/hw/ehca/ehca_eq.c              |  185 ++
 drivers/infiniband/hw/ehca/ehca_hca.c             |  241 ++
 drivers/infiniband/hw/ehca/ehca_irq.c             |  762 +++++++
 drivers/infiniband/hw/ehca/ehca_irq.h             |   77 +
 drivers/infiniband/hw/ehca/ehca_iverbs.h          |  182 ++
 drivers/infiniband/hw/ehca/ehca_main.c            |  818 ++++++++
 drivers/infiniband/hw/ehca/ehca_mcast.c           |  131 +
 drivers/infiniband/hw/ehca/ehca_mrmw.c            | 2261 +++++++++++++++++++++
 drivers/infiniband/hw/ehca/ehca_mrmw.h            |  140 +
 drivers/infiniband/hw/ehca/ehca_pd.c              |  114 +
 drivers/infiniband/hw/ehca/ehca_qes.h             |  259 ++
 drivers/infiniband/hw/ehca/ehca_qp.c              | 1507 ++++++++++++++
 drivers/infiniband/hw/ehca/ehca_reqs.c            |  653 ++++++
 drivers/infiniband/hw/ehca/ehca_sqp.c             |  111 +
 drivers/infiniband/hw/ehca/ehca_tools.h           |  172 ++
 drivers/infiniband/hw/ehca/ehca_uverbs.c          |  392 ++++
 drivers/infiniband/hw/ehca/hcp_if.c               |  874 ++++++++
 drivers/infiniband/hw/ehca/hcp_if.h               |  261 ++
 drivers/infiniband/hw/ehca/hcp_phyp.c             |   80 +
 drivers/infiniband/hw/ehca/hcp_phyp.h             |   90 +
 drivers/infiniband/hw/ehca/hipz_fns.h             |   68 +
 drivers/infiniband/hw/ehca/hipz_fns_core.h        |  100 +
 drivers/infiniband/hw/ehca/hipz_hw.h              |  388 ++++
 drivers/infiniband/hw/ehca/ipz_pt_fn.c            |  149 +
 drivers/infiniband/hw/ehca/ipz_pt_fn.h            |  247 ++
 drivers/infiniband/hw/ipath/Kconfig               |   21 
 drivers/infiniband/hw/ipath/Makefile              |   29 
 drivers/infiniband/hw/ipath/ipath_common.h        |   19 
 drivers/infiniband/hw/ipath/ipath_cq.c            |  183 +-
 drivers/infiniband/hw/ipath/ipath_debug.h         |    2 
 drivers/infiniband/hw/ipath/ipath_diag.c          |  154 +
 drivers/infiniband/hw/ipath/ipath_driver.c        |  349 ++-
 drivers/infiniband/hw/ipath/ipath_file_ops.c      |   35 
 drivers/infiniband/hw/ipath/ipath_fs.c            |    4 
 drivers/infiniband/hw/ipath/ipath_ht400.c         | 1603 ---------------
 drivers/infiniband/hw/ipath/ipath_iba6110.c       | 1612 +++++++++++++++
 drivers/infiniband/hw/ipath/ipath_iba6120.c       | 1264 ++++++++++++
 drivers/infiniband/hw/ipath/ipath_init_chip.c     |   21 
 drivers/infiniband/hw/ipath/ipath_intr.c          |   24 
 drivers/infiniband/hw/ipath/ipath_kernel.h        |   57 -
 drivers/infiniband/hw/ipath/ipath_keys.c          |    3 
 drivers/infiniband/hw/ipath/ipath_layer.c         | 1179 -----------
 drivers/infiniband/hw/ipath/ipath_layer.h         |  115 -
 drivers/infiniband/hw/ipath/ipath_mad.c           |  339 +++
 drivers/infiniband/hw/ipath/ipath_mmap.c          |  122 +
 drivers/infiniband/hw/ipath/ipath_mr.c            |   12 
 drivers/infiniband/hw/ipath/ipath_pe800.c         | 1254 ------------
 drivers/infiniband/hw/ipath/ipath_qp.c            |  242 ++
 drivers/infiniband/hw/ipath/ipath_rc.c            |    9 
 drivers/infiniband/hw/ipath/ipath_registers.h     |    7 
 drivers/infiniband/hw/ipath/ipath_ruc.c           |  160 +
 drivers/infiniband/hw/ipath/ipath_srq.c           |  244 +-
 drivers/infiniband/hw/ipath/ipath_stats.c         |   27 
 drivers/infiniband/hw/ipath/ipath_sysfs.c         |   41 
 drivers/infiniband/hw/ipath/ipath_uc.c            |    5 
 drivers/infiniband/hw/ipath/ipath_ud.c            |  182 +-
 drivers/infiniband/hw/ipath/ipath_verbs.c         |  687 +++++-
 drivers/infiniband/hw/ipath/ipath_verbs.h         |  252 ++
 drivers/infiniband/hw/ipath/ipath_verbs_mcast.c   |    7 
 drivers/infiniband/hw/ipath/ipath_wc_ppc64.c      |   52 
 drivers/infiniband/hw/ipath/verbs_debug.h         |  108 -
 drivers/infiniband/hw/mthca/mthca_av.c            |    2 
 drivers/infiniband/hw/mthca/mthca_catas.c         |   62 +
 drivers/infiniband/hw/mthca/mthca_cmd.c           |    2 
 drivers/infiniband/hw/mthca/mthca_cq.c            |   10 
 drivers/infiniband/hw/mthca/mthca_dev.h           |   12 
 drivers/infiniband/hw/mthca/mthca_mad.c           |    2 
 drivers/infiniband/hw/mthca/mthca_main.c          |   88 +
 drivers/infiniband/hw/mthca/mthca_provider.c      |    2 
 drivers/infiniband/hw/mthca/mthca_qp.c            |   20 
 drivers/infiniband/hw/mthca/mthca_srq.c           |    2 
 drivers/infiniband/hw/mthca/mthca_uar.c           |    2 
 drivers/infiniband/ulp/ipoib/ipoib.h              |    2 
 drivers/infiniband/ulp/ipoib/ipoib_ib.c           |  194 +-
 drivers/infiniband/ulp/ipoib/ipoib_main.c         |   37 
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c    |   34 
 drivers/infiniband/ulp/iser/Kconfig               |    2 
 drivers/infiniband/ulp/iser/iscsi_iser.c          |    1 
 drivers/infiniband/ulp/iser/iscsi_iser.h          |    7 
 drivers/infiniband/ulp/iser/iser_memory.c         |   80 +
 drivers/infiniband/ulp/iser/iser_verbs.c          |   10 
 drivers/infiniband/ulp/srp/ib_srp.c               |   43 
 include/rdma/ib_addr.h                            |   17 
 include/rdma/ib_sa.h                              |   45 
 include/rdma/ib_user_verbs.h                      |    2 
 include/rdma/ib_verbs.h                           |   31 
 include/rdma/iw_cm.h                              |  258 ++
 include/rdma/rdma_cm.h                            |   12 
 138 files changed, 28416 insertions(+), 5494 deletions(-)
 create mode 100644 drivers/infiniband/core/iwcm.c
 create mode 100644 drivers/infiniband/core/iwcm.h
 create mode 100644 drivers/infiniband/hw/amso1100/Kbuild
 create mode 100644 drivers/infiniband/hw/amso1100/Kconfig
 create mode 100644 drivers/infiniband/hw/amso1100/c2.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_ae.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_ae.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_alloc.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_cm.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_cq.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_intr.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_mm.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_mq.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_mq.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_pd.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_provider.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_provider.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_qp.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_rnic.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_status.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_user.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_vq.c
 create mode 100644 drivers/infiniband/hw/amso1100/c2_vq.h
 create mode 100644 drivers/infiniband/hw/amso1100/c2_wr.h
 create mode 100644 drivers/infiniband/hw/ehca/Kconfig
 create mode 100644 drivers/infiniband/hw/ehca/Makefile
 create mode 100644 drivers/infiniband/hw/ehca/ehca_av.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_classes.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_classes_pSeries.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_cq.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_eq.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_hca.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_irq.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_irq.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_iverbs.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_main.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_mcast.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_mrmw.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_mrmw.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_pd.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_qes.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_qp.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_reqs.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_sqp.c
 create mode 100644 drivers/infiniband/hw/ehca/ehca_tools.h
 create mode 100644 drivers/infiniband/hw/ehca/ehca_uverbs.c
 create mode 100644 drivers/infiniband/hw/ehca/hcp_if.c
 create mode 100644 drivers/infiniband/hw/ehca/hcp_if.h
 create mode 100644 drivers/infiniband/hw/ehca/hcp_phyp.c
 create mode 100644 drivers/infiniband/hw/ehca/hcp_phyp.h
 create mode 100644 drivers/infiniband/hw/ehca/hipz_fns.h
 create mode 100644 drivers/infiniband/hw/ehca/hipz_fns_core.h
 create mode 100644 drivers/infiniband/hw/ehca/hipz_hw.h
 create mode 100644 drivers/infiniband/hw/ehca/ipz_pt_fn.c
 create mode 100644 drivers/infiniband/hw/ehca/ipz_pt_fn.h
 delete mode 100644 drivers/infiniband/hw/ipath/ipath_ht400.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_iba6110.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_iba6120.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_mmap.c
 delete mode 100644 drivers/infiniband/hw/ipath/ipath_pe800.c
 create mode 100644 drivers/infiniband/hw/ipath/ipath_wc_ppc64.c
 delete mode 100644 drivers/infiniband/hw/ipath/verbs_debug.h
 create mode 100644 include/rdma/iw_cm.h

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

* [GIT PULL] please pull infiniband.git
@ 2006-09-14 20:59 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-09-14 20:59 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This contains a few last-minute fixes -- a couple of one-liners, and a
panic fix that turns out to be pure deletions:

Eli Cohen:
      IPoIB: Retry failed send-only multicast group joins

Ishai Rabinovitz:
      IB/srp: Don't schedule reconnect from srp

Michael S. Tsirkin:
      RDMA/cma: Increase the IB CM retry count in CMA

 drivers/infiniband/core/cma.c                  |    2 +-
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    1 +
 drivers/infiniband/ulp/srp/ib_srp.c            |   14 --------------
 3 files changed, 2 insertions(+), 15 deletions(-)


diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index d6f99d5..5d625a8 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -49,7 +49,7 @@ MODULE_DESCRIPTION("Generic RDMA CM Agen
 MODULE_LICENSE("Dual BSD/GPL");
 
 #define CMA_CM_RESPONSE_TIMEOUT 20
-#define CMA_MAX_CM_RETRIES 3
+#define CMA_MAX_CM_RETRIES 15
 
 static void cma_add_one(struct ib_device *device);
 static void cma_remove_one(struct ib_device *device);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index b5e6a7b..ec356ce 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -326,6 +326,7 @@ ipoib_mcast_sendonly_join_complete(int s
 
 		/* Clear the busy flag so we try again */
 		clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
+		mcast->query = NULL;
 	}
 
 	complete(&mcast->done);
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 8257d5a..fd8344c 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -799,13 +799,6 @@ static void srp_process_rsp(struct srp_t
 	spin_unlock_irqrestore(target->scsi_host->host_lock, flags);
 }
 
-static void srp_reconnect_work(void *target_ptr)
-{
-	struct srp_target_port *target = target_ptr;
-
-	srp_reconnect_target(target);
-}
-
 static void srp_handle_recv(struct srp_target_port *target, struct ib_wc *wc)
 {
 	struct srp_iu *iu;
@@ -858,7 +851,6 @@ static void srp_completion(struct ib_cq 
 {
 	struct srp_target_port *target = target_ptr;
 	struct ib_wc wc;
-	unsigned long flags;
 
 	ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
 	while (ib_poll_cq(cq, 1, &wc) > 0) {
@@ -866,10 +858,6 @@ static void srp_completion(struct ib_cq 
 			printk(KERN_ERR PFX "failed %s status %d\n",
 			       wc.wr_id & SRP_OP_RECV ? "receive" : "send",
 			       wc.status);
-			spin_lock_irqsave(target->scsi_host->host_lock, flags);
-			if (target->state == SRP_TARGET_LIVE)
-				schedule_work(&target->work);
-			spin_unlock_irqrestore(target->scsi_host->host_lock, flags);
 			break;
 		}
 
@@ -1705,8 +1693,6 @@ static ssize_t srp_create_target(struct 
 	target->scsi_host  = target_host;
 	target->srp_host   = host;
 
-	INIT_WORK(&target->work, srp_reconnect_work, target);
-
 	INIT_LIST_HEAD(&target->free_reqs);
 	INIT_LIST_HEAD(&target->req_queue);
 	for (i = 0; i < SRP_SQ_SIZE; ++i) {

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

* [GIT PULL] please pull infiniband.git
@ 2006-09-01  0:29 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-09-01  0:29 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

to get a fix for a locking bug found by lockdep:

Roland Dreier:
      IB/mthca: Use IRQ safe locks to protect allocation bitmaps

 drivers/infiniband/hw/mthca/mthca_allocator.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)


diff --git a/drivers/infiniband/hw/mthca/mthca_allocator.c b/drivers/infiniband/hw/mthca/mthca_allocator.c
index 25157f5..f930e55 100644
--- a/drivers/infiniband/hw/mthca/mthca_allocator.c
+++ b/drivers/infiniband/hw/mthca/mthca_allocator.c
@@ -41,9 +41,11 @@ #include "mthca_dev.h"
 /* Trivial bitmap-based allocator */
 u32 mthca_alloc(struct mthca_alloc *alloc)
 {
+	unsigned long flags;
 	u32 obj;
 
-	spin_lock(&alloc->lock);
+	spin_lock_irqsave(&alloc->lock, flags);
+
 	obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last);
 	if (obj >= alloc->max) {
 		alloc->top = (alloc->top + alloc->max) & alloc->mask;
@@ -56,19 +58,24 @@ u32 mthca_alloc(struct mthca_alloc *allo
 	} else
 		obj = -1;
 
-	spin_unlock(&alloc->lock);
+	spin_unlock_irqrestore(&alloc->lock, flags);
 
 	return obj;
 }
 
 void mthca_free(struct mthca_alloc *alloc, u32 obj)
 {
+	unsigned long flags;
+
 	obj &= alloc->max - 1;
-	spin_lock(&alloc->lock);
+
+	spin_lock_irqsave(&alloc->lock, flags);
+
 	clear_bit(obj, alloc->table);
 	alloc->last = min(alloc->last, obj);
 	alloc->top = (alloc->top + alloc->max) & alloc->mask;
-	spin_unlock(&alloc->lock);
+
+	spin_unlock_irqrestore(&alloc->lock, flags);
 }
 
 int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask,

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

* Re: [GIT PULL] please pull infiniband.git
  2006-08-23 23:25 Roland Dreier
@ 2006-08-24  1:09 ` Greg KH
  0 siblings, 0 replies; 223+ messages in thread
From: Greg KH @ 2006-08-24  1:09 UTC (permalink / raw)
  To: Roland Dreier; +Cc: openib-general, linux-kernel

On Wed, Aug 23, 2006 at 04:25:38PM -0700, Roland Dreier wrote:
> Greg, please pull from
> 
>     master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus
> 
> This tree is also available from kernel.org mirrors at:
> 
>     git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Pulled from, and pushed out.

thanks,

greg k-h

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

* [GIT PULL] please pull infiniband.git
@ 2006-08-23 23:25 Roland Dreier
  2006-08-24  1:09 ` Greg KH
  0 siblings, 1 reply; 223+ messages in thread
From: Roland Dreier @ 2006-08-23 23:25 UTC (permalink / raw)
  To: greg; +Cc: openib-general, linux-kernel

Greg, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

to get a few fixes for the 2.6.18 tree:

Jack Morgenstein:
      IB/core: Fix SM LID/LID change with client reregister set

Michael S. Tsirkin:
      IB/mthca: Make fence flag work for send work requests
      IB/mthca: Update HCA firmware revisions

Roland Dreier:
      IB/mthca: Fix potential AB-BA deadlock with CQ locks
      IB/mthca: No userspace SRQs if HCA doesn't have SRQ support

 drivers/infiniband/core/cache.c              |    3 +
 drivers/infiniband/core/sa_query.c           |    3 +
 drivers/infiniband/hw/mthca/mthca_main.c     |    6 +--
 drivers/infiniband/hw/mthca/mthca_provider.c |   11 +++--
 drivers/infiniband/hw/mthca/mthca_provider.h |    4 +-
 drivers/infiniband/hw/mthca/mthca_qp.c       |   54 +++++++++++++++++++-------
 6 files changed, 55 insertions(+), 26 deletions(-)


diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index e05ca2c..75313ad 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -301,7 +301,8 @@ static void ib_cache_event(struct ib_eve
 	    event->event == IB_EVENT_PORT_ACTIVE ||
 	    event->event == IB_EVENT_LID_CHANGE  ||
 	    event->event == IB_EVENT_PKEY_CHANGE ||
-	    event->event == IB_EVENT_SM_CHANGE) {
+	    event->event == IB_EVENT_SM_CHANGE   ||
+	    event->event == IB_EVENT_CLIENT_REREGISTER) {
 		work = kmalloc(sizeof *work, GFP_ATOMIC);
 		if (work) {
 			INIT_WORK(&work->work, ib_cache_task, work);
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c
index aeda484..d6b8422 100644
--- a/drivers/infiniband/core/sa_query.c
+++ b/drivers/infiniband/core/sa_query.c
@@ -405,7 +405,8 @@ static void ib_sa_event(struct ib_event_
 	    event->event == IB_EVENT_PORT_ACTIVE ||
 	    event->event == IB_EVENT_LID_CHANGE  ||
 	    event->event == IB_EVENT_PKEY_CHANGE ||
-	    event->event == IB_EVENT_SM_CHANGE) {
+	    event->event == IB_EVENT_SM_CHANGE   ||
+	    event->event == IB_EVENT_CLIENT_REREGISTER) {
 		struct ib_sa_device *sa_dev;
 		sa_dev = container_of(handler, typeof(*sa_dev), event_handler);
 
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c
index 557cde3..7b82c19 100644
--- a/drivers/infiniband/hw/mthca/mthca_main.c
+++ b/drivers/infiniband/hw/mthca/mthca_main.c
@@ -967,12 +967,12 @@ static struct {
 } mthca_hca_table[] = {
 	[TAVOR]        = { .latest_fw = MTHCA_FW_VER(3, 4, 0),
 			   .flags     = 0 },
-	[ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 400),
+	[ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 600),
 			   .flags     = MTHCA_FLAG_PCIE },
-	[ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 0),
+	[ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 400),
 			   .flags     = MTHCA_FLAG_MEMFREE |
 					MTHCA_FLAG_PCIE },
-	[SINAI]        = { .latest_fw = MTHCA_FW_VER(1, 0, 800),
+	[SINAI]        = { .latest_fw = MTHCA_FW_VER(1, 1, 0),
 			   .flags     = MTHCA_FLAG_MEMFREE |
 					MTHCA_FLAG_PCIE    |
 					MTHCA_FLAG_SINAI_OPT }
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c
index 230ae21..265b1d1 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -1287,11 +1287,7 @@ int mthca_register_device(struct mthca_d
 		(1ull << IB_USER_VERBS_CMD_MODIFY_QP)		|
 		(1ull << IB_USER_VERBS_CMD_DESTROY_QP)		|
 		(1ull << IB_USER_VERBS_CMD_ATTACH_MCAST)	|
-		(1ull << IB_USER_VERBS_CMD_DETACH_MCAST)	|
-		(1ull << IB_USER_VERBS_CMD_CREATE_SRQ)		|
-		(1ull << IB_USER_VERBS_CMD_MODIFY_SRQ)		|
-		(1ull << IB_USER_VERBS_CMD_QUERY_SRQ)		|
-		(1ull << IB_USER_VERBS_CMD_DESTROY_SRQ);
+		(1ull << IB_USER_VERBS_CMD_DETACH_MCAST);
 	dev->ib_dev.node_type            = IB_NODE_CA;
 	dev->ib_dev.phys_port_cnt        = dev->limits.num_ports;
 	dev->ib_dev.dma_device           = &dev->pdev->dev;
@@ -1316,6 +1312,11 @@ int mthca_register_device(struct mthca_d
 		dev->ib_dev.modify_srq           = mthca_modify_srq;
 		dev->ib_dev.query_srq            = mthca_query_srq;
 		dev->ib_dev.destroy_srq          = mthca_destroy_srq;
+		dev->ib_dev.uverbs_cmd_mask	|=
+			(1ull << IB_USER_VERBS_CMD_CREATE_SRQ)		|
+			(1ull << IB_USER_VERBS_CMD_MODIFY_SRQ)		|
+			(1ull << IB_USER_VERBS_CMD_QUERY_SRQ)		|
+			(1ull << IB_USER_VERBS_CMD_DESTROY_SRQ);
 
 		if (mthca_is_memfree(dev))
 			dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv;
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.h b/drivers/infiniband/hw/mthca/mthca_provider.h
index 8de2887..9a5bece 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.h
+++ b/drivers/infiniband/hw/mthca/mthca_provider.h
@@ -136,8 +136,8 @@ struct mthca_ah {
  * We have one global lock that protects dev->cq/qp_table.  Each
  * struct mthca_cq/qp also has its own lock.  An individual qp lock
  * may be taken inside of an individual cq lock.  Both cqs attached to
- * a qp may be locked, with the send cq locked first.  No other
- * nesting should be done.
+ * a qp may be locked, with the cq with the lower cqn locked first.
+ * No other nesting should be done.
  *
  * Each struct mthca_cq/qp also has an ref count, protected by the
  * corresponding table lock.  The pointer from the cq/qp_table to the
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index cd8b672..2e8f6f3 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -99,6 +99,10 @@ enum {
 	MTHCA_QP_BIT_RSC = 1 <<  3
 };
 
+enum {
+	MTHCA_SEND_DOORBELL_FENCE = 1 << 5
+};
+
 struct mthca_qp_path {
 	__be32 port_pkey;
 	u8     rnr_retry;
@@ -1259,6 +1263,32 @@ int mthca_alloc_qp(struct mthca_dev *dev
 	return 0;
 }
 
+static void mthca_lock_cqs(struct mthca_cq *send_cq, struct mthca_cq *recv_cq)
+{
+	if (send_cq == recv_cq)
+		spin_lock_irq(&send_cq->lock);
+	else if (send_cq->cqn < recv_cq->cqn) {
+		spin_lock_irq(&send_cq->lock);
+		spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
+	} else {
+		spin_lock_irq(&recv_cq->lock);
+		spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
+	}
+}
+
+static void mthca_unlock_cqs(struct mthca_cq *send_cq, struct mthca_cq *recv_cq)
+{
+	if (send_cq == recv_cq)
+		spin_unlock_irq(&send_cq->lock);
+	else if (send_cq->cqn < recv_cq->cqn) {
+		spin_unlock(&recv_cq->lock);
+		spin_unlock_irq(&send_cq->lock);
+	} else {
+		spin_unlock(&send_cq->lock);
+		spin_unlock_irq(&recv_cq->lock);
+	}
+}
+
 int mthca_alloc_sqp(struct mthca_dev *dev,
 		    struct mthca_pd *pd,
 		    struct mthca_cq *send_cq,
@@ -1311,17 +1341,13 @@ int mthca_alloc_sqp(struct mthca_dev *de
 	 * Lock CQs here, so that CQ polling code can do QP lookup
 	 * without taking a lock.
 	 */
-	spin_lock_irq(&send_cq->lock);
-	if (send_cq != recv_cq)
-		spin_lock(&recv_cq->lock);
+	mthca_lock_cqs(send_cq, recv_cq);
 
 	spin_lock(&dev->qp_table.lock);
 	mthca_array_clear(&dev->qp_table.qp, mqpn);
 	spin_unlock(&dev->qp_table.lock);
 
-	if (send_cq != recv_cq)
-		spin_unlock(&recv_cq->lock);
-	spin_unlock_irq(&send_cq->lock);
+	mthca_unlock_cqs(send_cq, recv_cq);
 
  err_out:
 	dma_free_coherent(&dev->pdev->dev, sqp->header_buf_size,
@@ -1355,9 +1381,7 @@ void mthca_free_qp(struct mthca_dev *dev
 	 * Lock CQs here, so that CQ polling code can do QP lookup
 	 * without taking a lock.
 	 */
-	spin_lock_irq(&send_cq->lock);
-	if (send_cq != recv_cq)
-		spin_lock(&recv_cq->lock);
+	mthca_lock_cqs(send_cq, recv_cq);
 
 	spin_lock(&dev->qp_table.lock);
 	mthca_array_clear(&dev->qp_table.qp,
@@ -1365,9 +1389,7 @@ void mthca_free_qp(struct mthca_dev *dev
 	--qp->refcount;
 	spin_unlock(&dev->qp_table.lock);
 
-	if (send_cq != recv_cq)
-		spin_unlock(&recv_cq->lock);
-	spin_unlock_irq(&send_cq->lock);
+	mthca_unlock_cqs(send_cq, recv_cq);
 
 	wait_event(qp->wait, !get_qp_refcount(dev, qp));
 
@@ -1502,7 +1524,7 @@ int mthca_tavor_post_send(struct ib_qp *
 	int i;
 	int size;
 	int size0 = 0;
-	u32 f0 = 0;
+	u32 f0;
 	int ind;
 	u8 op0 = 0;
 
@@ -1686,6 +1708,8 @@ int mthca_tavor_post_send(struct ib_qp *
 		if (!size0) {
 			size0 = size;
 			op0   = mthca_opcode[wr->opcode];
+			f0    = wr->send_flags & IB_SEND_FENCE ?
+				MTHCA_SEND_DOORBELL_FENCE : 0;
 		}
 
 		++ind;
@@ -1843,7 +1867,7 @@ int mthca_arbel_post_send(struct ib_qp *
 	int i;
 	int size;
 	int size0 = 0;
-	u32 f0 = 0;
+	u32 f0;
 	int ind;
 	u8 op0 = 0;
 
@@ -2051,6 +2075,8 @@ int mthca_arbel_post_send(struct ib_qp *
 		if (!size0) {
 			size0 = size;
 			op0   = mthca_opcode[wr->opcode];
+			f0    = wr->send_flags & IB_SEND_FENCE ?
+				MTHCA_SEND_DOORBELL_FENCE : 0;
 		}
 
 		++ind;

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

* [GIT PULL] please pull infiniband.git
@ 2006-08-03 18:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-08-03 18:07 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

to get a few fixes:

Ishai Rabinovitz:
      IB/srp: Fix crash in srp_reconnect_target
      IB/srp: Work around data corruption bug on Mellanox targets

Jack Morgenstein:
      IB/uverbs: Avoid a crash on device hot remove

Michael S. Tsirkin:
      IB/mthca: Fix mthca_array_clear() thinko

Or Gerlitz:
      IB/ipoib: Remove broken link from Kconfig and documentation

Roland Dreier:
      IB/mthca: Clean up mthca array index mask

Sean Hefty:
      IB/cm: Fix error handling in ib_send_cm_req

 Documentation/infiniband/ipoib.txt            |    2 --
 drivers/infiniband/core/cm.c                  |    4 +++-
 drivers/infiniband/core/uverbs.h              |    2 ++
 drivers/infiniband/core/uverbs_main.c         |    8 +++++++-
 drivers/infiniband/hw/mthca/mthca_allocator.c |   15 ++++++++-------
 drivers/infiniband/ulp/ipoib/Kconfig          |    3 +--
 drivers/infiniband/ulp/srp/ib_srp.c           |   19 +++++++++++++++++--
 7 files changed, 38 insertions(+), 15 deletions(-)


diff --git a/Documentation/infiniband/ipoib.txt b/Documentation/infiniband/ipoib.txt
index 1870355..864ff32 100644
--- a/Documentation/infiniband/ipoib.txt
+++ b/Documentation/infiniband/ipoib.txt
@@ -51,8 +51,6 @@ Debugging Information
 
 References
 
-  IETF IP over InfiniBand (ipoib) Working Group
-    http://ietf.org/html.charters/ipoib-charter.html
   Transmission of IP over InfiniBand (IPoIB) (RFC 4391)
     http://ietf.org/rfc/rfc4391.txt 
   IP over InfiniBand (IPoIB) Architecture (RFC 4392)
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index f85c97f..0de335b 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -975,8 +975,10 @@ int ib_send_cm_req(struct ib_cm_id *cm_i
 
 	cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
 							    id.local_id);
-	if (IS_ERR(cm_id_priv->timewait_info))
+	if (IS_ERR(cm_id_priv->timewait_info)) {
+		ret = PTR_ERR(cm_id_priv->timewait_info);
 		goto out;
+	}
 
 	ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
 	if (ret)
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h
index bb9bee5..102a59c 100644
--- a/drivers/infiniband/core/uverbs.h
+++ b/drivers/infiniband/core/uverbs.h
@@ -42,6 +42,7 @@ #define UVERBS_H
 #include <linux/kref.h>
 #include <linux/idr.h>
 #include <linux/mutex.h>
+#include <linux/completion.h>
 
 #include <rdma/ib_verbs.h>
 #include <rdma/ib_user_verbs.h>
@@ -69,6 +70,7 @@ #include <rdma/ib_user_verbs.h>
 
 struct ib_uverbs_device {
 	struct kref				ref;
+	struct completion			comp;
 	int					devnum;
 	struct cdev			       *dev;
 	struct class_device		       *class_dev;
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index e725ccc..4e16314 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -122,7 +122,7 @@ static void ib_uverbs_release_dev(struct
 	struct ib_uverbs_device *dev =
 		container_of(ref, struct ib_uverbs_device, ref);
 
-	kfree(dev);
+	complete(&dev->comp);
 }
 
 void ib_uverbs_release_ucq(struct ib_uverbs_file *file,
@@ -740,6 +740,7 @@ static void ib_uverbs_add_one(struct ib_
 		return;
 
 	kref_init(&uverbs_dev->ref);
+	init_completion(&uverbs_dev->comp);
 
 	spin_lock(&map_lock);
 	uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES);
@@ -793,6 +794,8 @@ err_cdev:
 
 err:
 	kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
+	wait_for_completion(&uverbs_dev->comp);
+	kfree(uverbs_dev);
 	return;
 }
 
@@ -812,7 +815,10 @@ static void ib_uverbs_remove_one(struct 
 	spin_unlock(&map_lock);
 
 	clear_bit(uverbs_dev->devnum, dev_map);
+
 	kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
+	wait_for_completion(&uverbs_dev->comp);
+	kfree(uverbs_dev);
 }
 
 static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags,
diff --git a/drivers/infiniband/hw/mthca/mthca_allocator.c b/drivers/infiniband/hw/mthca/mthca_allocator.c
index 9ba3211..25157f5 100644
--- a/drivers/infiniband/hw/mthca/mthca_allocator.c
+++ b/drivers/infiniband/hw/mthca/mthca_allocator.c
@@ -108,14 +108,15 @@ void mthca_alloc_cleanup(struct mthca_al
  * serialize access to the array.
  */
 
+#define MTHCA_ARRAY_MASK (PAGE_SIZE / sizeof (void *) - 1)
+
 void *mthca_array_get(struct mthca_array *array, int index)
 {
 	int p = (index * sizeof (void *)) >> PAGE_SHIFT;
 
-	if (array->page_list[p].page) {
-		int i = index & (PAGE_SIZE / sizeof (void *) - 1);
-		return array->page_list[p].page[i];
-	} else
+	if (array->page_list[p].page)
+		return array->page_list[p].page[index & MTHCA_ARRAY_MASK];
+	else
 		return NULL;
 }
 
@@ -130,8 +131,7 @@ int mthca_array_set(struct mthca_array *
 	if (!array->page_list[p].page)
 		return -ENOMEM;
 
-	array->page_list[p].page[index & (PAGE_SIZE / sizeof (void *) - 1)] =
-		value;
+	array->page_list[p].page[index & MTHCA_ARRAY_MASK] = value;
 	++array->page_list[p].used;
 
 	return 0;
@@ -144,7 +144,8 @@ void mthca_array_clear(struct mthca_arra
 	if (--array->page_list[p].used == 0) {
 		free_page((unsigned long) array->page_list[p].page);
 		array->page_list[p].page = NULL;
-	}
+	} else
+		array->page_list[p].page[index & MTHCA_ARRAY_MASK] = NULL;
 
 	if (array->page_list[p].used < 0)
 		pr_debug("Array %p index %d page %d with ref count %d < 0\n",
diff --git a/drivers/infiniband/ulp/ipoib/Kconfig b/drivers/infiniband/ulp/ipoib/Kconfig
index 13d6d01..d74653d 100644
--- a/drivers/infiniband/ulp/ipoib/Kconfig
+++ b/drivers/infiniband/ulp/ipoib/Kconfig
@@ -6,8 +6,7 @@ config INFINIBAND_IPOIB
 	  transports IP packets over InfiniBand so you can use your IB
 	  device as a fancy NIC.
 
-	  The IPoIB protocol is defined by the IETF ipoib working
-	  group: <http://www.ietf.org/html.charters/ipoib-charter.html>.
+	  See Documentation/infiniband/ipoib.txt for more information
 
 config INFINIBAND_IPOIB_DEBUG
 	bool "IP-over-InfiniBand debugging" if EMBEDDED
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 8f472e7..8257d5a 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -77,6 +77,14 @@ MODULE_PARM_DESC(topspin_workarounds,
 
 static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
 
+static int mellanox_workarounds = 1;
+
+module_param(mellanox_workarounds, int, 0444);
+MODULE_PARM_DESC(mellanox_workarounds,
+		 "Enable workarounds for Mellanox SRP target bugs if != 0");
+
+static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
+
 static void srp_add_one(struct ib_device *device);
 static void srp_remove_one(struct ib_device *device);
 static void srp_completion(struct ib_cq *cq, void *target_ptr);
@@ -526,8 +534,10 @@ static int srp_reconnect_target(struct s
 	while (ib_poll_cq(target->cq, 1, &wc) > 0)
 		; /* nothing */
 
+	spin_lock_irq(target->scsi_host->host_lock);
 	list_for_each_entry_safe(req, tmp, &target->req_queue, list)
 		srp_reset_req(target, req);
+	spin_unlock_irq(target->scsi_host->host_lock);
 
 	target->rx_head	 = 0;
 	target->tx_head	 = 0;
@@ -567,7 +577,7 @@ err:
 	return ret;
 }
 
-static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat,
+static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat,
 		       int sg_cnt, struct srp_request *req,
 		       struct srp_direct_buf *buf)
 {
@@ -577,10 +587,15 @@ static int srp_map_fmr(struct srp_device
 	int page_cnt;
 	int i, j;
 	int ret;
+	struct srp_device *dev = target->srp_host->dev;
 
 	if (!dev->fmr_pool)
 		return -ENODEV;
 
+	if ((sg_dma_address(&scat[0]) & ~dev->fmr_page_mask) &&
+	    mellanox_workarounds && !memcmp(&target->ioc_guid, mellanox_oui, 3))
+		return -EINVAL;
+
 	len = page_cnt = 0;
 	for (i = 0; i < sg_cnt; ++i) {
 		if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) {
@@ -683,7 +698,7 @@ static int srp_map_data(struct scsi_cmnd
 		buf->va  = cpu_to_be64(sg_dma_address(scat));
 		buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey);
 		buf->len = cpu_to_be32(sg_dma_len(scat));
-	} else if (srp_map_fmr(target->srp_host->dev, scat, count, req,
+	} else if (srp_map_fmr(target, scat, count, req,
 			       (void *) cmd->add_data)) {
 		/*
 		 * FMR mapping failed, and the scatterlist has more

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

* [GIT PULL] please pull infiniband.git
@ 2006-07-24 16:50 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-07-24 16:50 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

to get a few fixes:

Dotan Barak:
      IB/mthca: Fix SRQ limit event range check

Michael S. Tsirkin:
      IB/uverbs: Fix unlocking in error paths
      IB/ipoib: Fix packet loss after hardware address update

Or Gerlitz:
      IB/ipoib: Fix oops with ipoib_debug_mcast set

Ralph Campbell:
      IB/ipath: Fix a data corruption
      IB/ipath: Fix ib_ipath driver to work with SRP
      IB/ipath: ipath_skip_sge() can break if num_sge > 1

Roland Dreier:
      IB/uverbs: Fix lockdep warnings
      IB/mthca: Initialize max_cmds before debug code prints it

Sean Hefty:
      IB/mad: Validate MADs for spec compliance

 drivers/infiniband/core/mad.c                  |   22 +++---
 drivers/infiniband/core/user_mad.c             |   87 +++++++++++++++++++++---
 drivers/infiniband/core/uverbs_cmd.c           |   42 ++++++++----
 drivers/infiniband/hw/ipath/ipath_driver.c     |   76 ++++++++++-----------
 drivers/infiniband/hw/ipath/ipath_keys.c       |   15 ++++
 drivers/infiniband/hw/ipath/ipath_verbs.c      |    5 -
 drivers/infiniband/hw/mthca/mthca_cmd.c        |    5 +
 drivers/infiniband/hw/mthca/mthca_srq.c        |    3 +
 drivers/infiniband/ulp/ipoib/ipoib.h           |    1 
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   23 ++++++
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    8 +-
 include/rdma/ib_mad.h                          |    7 ++
 12 files changed, 209 insertions(+), 85 deletions(-)


diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index 5ed4dab..1c3cfbb 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -167,6 +167,15 @@ static int is_vendor_method_in_use(
 	return 0;
 }
 
+int ib_response_mad(struct ib_mad *mad)
+{
+	return ((mad->mad_hdr.method & IB_MGMT_METHOD_RESP) ||
+		(mad->mad_hdr.method == IB_MGMT_METHOD_TRAP_REPRESS) ||
+		((mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_BM) &&
+		 (mad->mad_hdr.attr_mod & IB_BM_ATTR_MOD_RESP)));
+}
+EXPORT_SYMBOL(ib_response_mad);
+
 /*
  * ib_register_mad_agent - Register to send/receive MADs
  */
@@ -570,13 +579,6 @@ int ib_unregister_mad_agent(struct ib_ma
 }
 EXPORT_SYMBOL(ib_unregister_mad_agent);
 
-static inline int response_mad(struct ib_mad *mad)
-{
-	/* Trap represses are responses although response bit is reset */
-	return ((mad->mad_hdr.method == IB_MGMT_METHOD_TRAP_REPRESS) ||
-		(mad->mad_hdr.method & IB_MGMT_METHOD_RESP));
-}
-
 static void dequeue_mad(struct ib_mad_list_head *mad_list)
 {
 	struct ib_mad_queue *mad_queue;
@@ -723,7 +725,7 @@ static int handle_outgoing_dr_smp(struct
 	switch (ret)
 	{
 	case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY:
-		if (response_mad(&mad_priv->mad.mad) &&
+		if (ib_response_mad(&mad_priv->mad.mad) &&
 		    mad_agent_priv->agent.recv_handler) {
 			local->mad_priv = mad_priv;
 			local->recv_mad_agent = mad_agent_priv;
@@ -1551,7 +1553,7 @@ find_mad_agent(struct ib_mad_port_privat
 	unsigned long flags;
 
 	spin_lock_irqsave(&port_priv->reg_lock, flags);
-	if (response_mad(mad)) {
+	if (ib_response_mad(mad)) {
 		u32 hi_tid;
 		struct ib_mad_agent_private *entry;
 
@@ -1799,7 +1801,7 @@ static void ib_mad_complete_recv(struct 
 	}
 
 	/* Complete corresponding request */
-	if (response_mad(mad_recv_wc->recv_buf.mad)) {
+	if (ib_response_mad(mad_recv_wc->recv_buf.mad)) {
 		spin_lock_irqsave(&mad_agent_priv->lock, flags);
 		mad_send_wr = ib_find_send_mad(mad_agent_priv, mad_recv_wc);
 		if (!mad_send_wr) {
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
index afe70a5..1273f88 100644
--- a/drivers/infiniband/core/user_mad.c
+++ b/drivers/infiniband/core/user_mad.c
@@ -112,8 +112,10 @@ struct ib_umad_device {
 struct ib_umad_file {
 	struct ib_umad_port    *port;
 	struct list_head	recv_list;
+	struct list_head	send_list;
 	struct list_head	port_list;
 	spinlock_t		recv_lock;
+	spinlock_t		send_lock;
 	wait_queue_head_t	recv_wait;
 	struct ib_mad_agent    *agent[IB_UMAD_MAX_AGENTS];
 	int			agents_dead;
@@ -177,12 +179,21 @@ static int queue_packet(struct ib_umad_f
 	return ret;
 }
 
+static void dequeue_send(struct ib_umad_file *file,
+			 struct ib_umad_packet *packet)
+ {
+	spin_lock_irq(&file->send_lock);
+	list_del(&packet->list);
+	spin_unlock_irq(&file->send_lock);
+ }
+
 static void send_handler(struct ib_mad_agent *agent,
 			 struct ib_mad_send_wc *send_wc)
 {
 	struct ib_umad_file *file = agent->context;
 	struct ib_umad_packet *packet = send_wc->send_buf->context[0];
 
+	dequeue_send(file, packet);
 	ib_destroy_ah(packet->msg->ah);
 	ib_free_send_mad(packet->msg);
 
@@ -370,6 +381,51 @@ static int copy_rmpp_mad(struct ib_mad_s
 	return 0;
 }
 
+static int same_destination(struct ib_user_mad_hdr *hdr1,
+			    struct ib_user_mad_hdr *hdr2)
+{
+	if (!hdr1->grh_present && !hdr2->grh_present)
+	   return (hdr1->lid == hdr2->lid);
+
+	if (hdr1->grh_present && hdr2->grh_present)
+	   return !memcmp(hdr1->gid, hdr2->gid, 16);
+
+	return 0;
+}
+
+static int is_duplicate(struct ib_umad_file *file,
+			struct ib_umad_packet *packet)
+{
+	struct ib_umad_packet *sent_packet;
+	struct ib_mad_hdr *sent_hdr, *hdr;
+
+	hdr = (struct ib_mad_hdr *) packet->mad.data;
+	list_for_each_entry(sent_packet, &file->send_list, list) {
+		sent_hdr = (struct ib_mad_hdr *) sent_packet->mad.data;
+
+		if ((hdr->tid != sent_hdr->tid) ||
+		    (hdr->mgmt_class != sent_hdr->mgmt_class))
+			continue;
+
+		/*
+		 * No need to be overly clever here.  If two new operations have
+		 * the same TID, reject the second as a duplicate.  This is more
+		 * restrictive than required by the spec.
+		 */
+		if (!ib_response_mad((struct ib_mad *) hdr)) {
+			if (!ib_response_mad((struct ib_mad *) sent_hdr))
+				return 1;
+			continue;
+		} else if (!ib_response_mad((struct ib_mad *) sent_hdr))
+			continue;
+
+		if (same_destination(&packet->mad.hdr, &sent_packet->mad.hdr))
+			return 1;
+	}
+
+	return 0;
+}
+
 static ssize_t ib_umad_write(struct file *filp, const char __user *buf,
 			     size_t count, loff_t *pos)
 {
@@ -379,7 +435,6 @@ static ssize_t ib_umad_write(struct file
 	struct ib_ah_attr ah_attr;
 	struct ib_ah *ah;
 	struct ib_rmpp_mad *rmpp_mad;
-	u8 method;
 	__be64 *tid;
 	int ret, data_len, hdr_len, copy_offset, rmpp_active;
 
@@ -473,28 +528,36 @@ static ssize_t ib_umad_write(struct file
 	}
 
 	/*
-	 * If userspace is generating a request that will generate a
-	 * response, we need to make sure the high-order part of the
-	 * transaction ID matches the agent being used to send the
-	 * MAD.
+	 * Set the high-order part of the transaction ID to make MADs from
+	 * different agents unique, and allow routing responses back to the
+	 * original requestor.
 	 */
-	method = ((struct ib_mad_hdr *) packet->msg->mad)->method;
-
-	if (!(method & IB_MGMT_METHOD_RESP)       &&
-	    method != IB_MGMT_METHOD_TRAP_REPRESS &&
-	    method != IB_MGMT_METHOD_SEND) {
+	if (!ib_response_mad(packet->msg->mad)) {
 		tid = &((struct ib_mad_hdr *) packet->msg->mad)->tid;
 		*tid = cpu_to_be64(((u64) agent->hi_tid) << 32 |
 				   (be64_to_cpup(tid) & 0xffffffff));
+		rmpp_mad->mad_hdr.tid = *tid;
+	}
+
+	spin_lock_irq(&file->send_lock);
+	ret = is_duplicate(file, packet);
+	if (!ret)
+		list_add_tail(&packet->list, &file->send_list);
+	spin_unlock_irq(&file->send_lock);
+	if (ret) {
+		ret = -EINVAL;
+		goto err_msg;
 	}
 
 	ret = ib_post_send_mad(packet->msg, NULL);
 	if (ret)
-		goto err_msg;
+		goto err_send;
 
 	up_read(&file->port->mutex);
 	return count;
 
+err_send:
+	dequeue_send(file, packet);
 err_msg:
 	ib_free_send_mad(packet->msg);
 err_ah:
@@ -657,7 +720,9 @@ static int ib_umad_open(struct inode *in
 	}
 
 	spin_lock_init(&file->recv_lock);
+	spin_lock_init(&file->send_lock);
 	INIT_LIST_HEAD(&file->recv_list);
+	INIT_LIST_HEAD(&file->send_list);
 	init_waitqueue_head(&file->recv_wait);
 
 	file->port = port;
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index bdf5d50..30923eb 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -42,6 +42,13 @@ #include <asm/uaccess.h>
 
 #include "uverbs.h"
 
+static struct lock_class_key pd_lock_key;
+static struct lock_class_key mr_lock_key;
+static struct lock_class_key cq_lock_key;
+static struct lock_class_key qp_lock_key;
+static struct lock_class_key ah_lock_key;
+static struct lock_class_key srq_lock_key;
+
 #define INIT_UDATA(udata, ibuf, obuf, ilen, olen)			\
 	do {								\
 		(udata)->inbuf  = (void __user *) (ibuf);		\
@@ -76,12 +83,13 @@ #define INIT_UDATA(udata, ibuf, obuf, il
  */
 
 static void init_uobj(struct ib_uobject *uobj, u64 user_handle,
-		      struct ib_ucontext *context)
+		      struct ib_ucontext *context, struct lock_class_key *key)
 {
 	uobj->user_handle = user_handle;
 	uobj->context     = context;
 	kref_init(&uobj->ref);
 	init_rwsem(&uobj->mutex);
+	lockdep_set_class(&uobj->mutex, key);
 	uobj->live        = 0;
 }
 
@@ -470,7 +478,7 @@ ssize_t ib_uverbs_alloc_pd(struct ib_uve
 	if (!uobj)
 		return -ENOMEM;
 
-	init_uobj(uobj, 0, file->ucontext);
+	init_uobj(uobj, 0, file->ucontext, &pd_lock_key);
 	down_write(&uobj->mutex);
 
 	pd = file->device->ib_dev->alloc_pd(file->device->ib_dev,
@@ -591,7 +599,7 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverb
 	if (!obj)
 		return -ENOMEM;
 
-	init_uobj(&obj->uobject, 0, file->ucontext);
+	init_uobj(&obj->uobject, 0, file->ucontext, &mr_lock_key);
 	down_write(&obj->uobject.mutex);
 
 	/*
@@ -770,7 +778,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uv
 	if (!obj)
 		return -ENOMEM;
 
-	init_uobj(&obj->uobject, cmd.user_handle, file->ucontext);
+	init_uobj(&obj->uobject, cmd.user_handle, file->ucontext, &cq_lock_key);
 	down_write(&obj->uobject.mutex);
 
 	if (cmd.comp_channel >= 0) {
@@ -1051,13 +1059,14 @@ ssize_t ib_uverbs_create_qp(struct ib_uv
 	if (!obj)
 		return -ENOMEM;
 
-	init_uobj(&obj->uevent.uobject, cmd.user_handle, file->ucontext);
+	init_uobj(&obj->uevent.uobject, cmd.user_handle, file->ucontext, &qp_lock_key);
 	down_write(&obj->uevent.uobject.mutex);
 
+	srq = cmd.is_srq ? idr_read_srq(cmd.srq_handle, file->ucontext) : NULL;
 	pd  = idr_read_pd(cmd.pd_handle, file->ucontext);
 	scq = idr_read_cq(cmd.send_cq_handle, file->ucontext);
-	rcq = idr_read_cq(cmd.recv_cq_handle, file->ucontext);
-	srq = cmd.is_srq ? idr_read_srq(cmd.srq_handle, file->ucontext) : NULL;
+	rcq = cmd.recv_cq_handle == cmd.send_cq_handle ?
+		scq : idr_read_cq(cmd.recv_cq_handle, file->ucontext);
 
 	if (!pd || !scq || !rcq || (cmd.is_srq && !srq)) {
 		ret = -EINVAL;
@@ -1125,7 +1134,8 @@ ssize_t ib_uverbs_create_qp(struct ib_uv
 
 	put_pd_read(pd);
 	put_cq_read(scq);
-	put_cq_read(rcq);
+	if (rcq != scq)
+		put_cq_read(rcq);
 	if (srq)
 		put_srq_read(srq);
 
@@ -1150,7 +1160,7 @@ err_put:
 		put_pd_read(pd);
 	if (scq)
 		put_cq_read(scq);
-	if (rcq)
+	if (rcq && rcq != scq)
 		put_cq_read(rcq);
 	if (srq)
 		put_srq_read(srq);
@@ -1751,7 +1761,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uv
 	if (!uobj)
 		return -ENOMEM;
 
-	init_uobj(uobj, cmd.user_handle, file->ucontext);
+	init_uobj(uobj, cmd.user_handle, file->ucontext, &ah_lock_key);
 	down_write(&uobj->mutex);
 
 	pd = idr_read_pd(cmd.pd_handle, file->ucontext);
@@ -1775,7 +1785,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uv
 	ah = ib_create_ah(pd, &attr);
 	if (IS_ERR(ah)) {
 		ret = PTR_ERR(ah);
-		goto err;
+		goto err_put;
 	}
 
 	ah->uobject  = uobj;
@@ -1811,6 +1821,9 @@ err_copy:
 err_destroy:
 	ib_destroy_ah(ah);
 
+err_put:
+	put_pd_read(pd);
+
 err:
 	put_uobj_write(uobj);
 	return ret;
@@ -1963,7 +1976,7 @@ ssize_t ib_uverbs_create_srq(struct ib_u
 	if (!obj)
 		return -ENOMEM;
 
-	init_uobj(&obj->uobject, cmd.user_handle, file->ucontext);
+	init_uobj(&obj->uobject, cmd.user_handle, file->ucontext, &srq_lock_key);
 	down_write(&obj->uobject.mutex);
 
 	pd  = idr_read_pd(cmd.pd_handle, file->ucontext);
@@ -1984,7 +1997,7 @@ ssize_t ib_uverbs_create_srq(struct ib_u
 	srq = pd->device->create_srq(pd, &attr, &udata);
 	if (IS_ERR(srq)) {
 		ret = PTR_ERR(srq);
-		goto err;
+		goto err_put;
 	}
 
 	srq->device    	   = pd->device;
@@ -2029,6 +2042,9 @@ err_copy:
 err_destroy:
 	ib_destroy_srq(srq);
 
+err_put:
+	put_pd_read(pd);
+
 err:
 	put_uobj_write(&obj->uobject);
 	return ret;
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index 823131d..f98518d 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -859,6 +859,38 @@ static void ipath_rcv_layer(struct ipath
 		__ipath_layer_rcv_lid(dd, hdr);
 }
 
+static void ipath_rcv_hdrerr(struct ipath_devdata *dd,
+			     u32 eflags,
+			     u32 l,
+			     u32 etail,
+			     u64 *rc)
+{
+	char emsg[128];
+	struct ipath_message_header *hdr;
+
+	get_rhf_errstring(eflags, emsg, sizeof emsg);
+	hdr = (struct ipath_message_header *)&rc[1];
+	ipath_cdbg(PKT, "RHFerrs %x hdrqtail=%x typ=%u "
+		   "tlen=%x opcode=%x egridx=%x: %s\n",
+		   eflags, l,
+		   ipath_hdrget_rcv_type((__le32 *) rc),
+		   ipath_hdrget_length_in_bytes((__le32 *) rc),
+		   be32_to_cpu(hdr->bth[0]) >> 24,
+		   etail, emsg);
+
+	/* Count local link integrity errors. */
+	if (eflags & (INFINIPATH_RHF_H_ICRCERR | INFINIPATH_RHF_H_VCRCERR)) {
+		u8 n = (dd->ipath_ibcctrl >>
+			INFINIPATH_IBCC_PHYERRTHRESHOLD_SHIFT) &
+			INFINIPATH_IBCC_PHYERRTHRESHOLD_MASK;
+
+		if (++dd->ipath_lli_counter > n) {
+			dd->ipath_lli_counter = 0;
+			dd->ipath_lli_errors++;
+		}
+	}
+}
+
 /*
  * ipath_kreceive - receive a packet
  * @dd: the infinipath device
@@ -875,7 +907,6 @@ void ipath_kreceive(struct ipath_devdata
 	struct ipath_message_header *hdr;
 	u32 eflags, i, etype, tlen, pkttot = 0, updegr=0, reloop=0;
 	static u64 totcalls;	/* stats, may eventually remove */
-	char emsg[128];
 
 	if (!dd->ipath_hdrqtailptr) {
 		ipath_dev_err(dd,
@@ -938,26 +969,9 @@ reloop:
 				   "%x\n", etype);
 		}
 
-		if (eflags & ~(INFINIPATH_RHF_H_TIDERR |
-			       INFINIPATH_RHF_H_IHDRERR)) {
-			get_rhf_errstring(eflags, emsg, sizeof emsg);
-			ipath_cdbg(PKT, "RHFerrs %x hdrqtail=%x typ=%u "
-				   "tlen=%x opcode=%x egridx=%x: %s\n",
-				   eflags, l, etype, tlen, bthbytes[0],
-				   ipath_hdrget_index((__le32 *) rc), emsg);
-			/* Count local link integrity errors. */
-			if (eflags & (INFINIPATH_RHF_H_ICRCERR |
-				      INFINIPATH_RHF_H_VCRCERR)) {
-				u8 n = (dd->ipath_ibcctrl >>
-					INFINIPATH_IBCC_PHYERRTHRESHOLD_SHIFT) &
-					INFINIPATH_IBCC_PHYERRTHRESHOLD_MASK;
-
-				if (++dd->ipath_lli_counter > n) {
-					dd->ipath_lli_counter = 0;
-					dd->ipath_lli_errors++;
-				}
-			}
-		} else if (etype == RCVHQ_RCV_TYPE_NON_KD) {
+		if (unlikely(eflags))
+			ipath_rcv_hdrerr(dd, eflags, l, etail, rc);
+		else if (etype == RCVHQ_RCV_TYPE_NON_KD) {
 				int ret = __ipath_verbs_rcv(dd, rc + 1,
 							    ebuf, tlen);
 				if (ret == -ENODEV)
@@ -981,25 +995,7 @@ reloop:
 		else if (etype == RCVHQ_RCV_TYPE_EXPECTED)
 			ipath_dbg("Bug: Expected TID, opcode %x; ignored\n",
 				  be32_to_cpu(hdr->bth[0]) & 0xff);
-		else if (eflags & (INFINIPATH_RHF_H_TIDERR |
-				   INFINIPATH_RHF_H_IHDRERR)) {
-			/*
-			 * This is a type 3 packet, only the LRH is in the
-			 * rcvhdrq, the rest of the header is in the eager
-			 * buffer.
-			 */
-			u8 opcode;
-			if (ebuf) {
-				bthbytes = (u8 *) ebuf;
-				opcode = *bthbytes;
-			}
-			else
-				opcode = 0;
-			get_rhf_errstring(eflags, emsg, sizeof emsg);
-			ipath_dbg("Err %x (%s), opcode %x, egrbuf %x, "
-				  "len %x\n", eflags, emsg, opcode, etail,
-				  tlen);
-		} else {
+		else {
 			/*
 			 * error packet, type of error	unknown.
 			 * Probably type 3, but we don't know, so don't
diff --git a/drivers/infiniband/hw/ipath/ipath_keys.c b/drivers/infiniband/hw/ipath/ipath_keys.c
index 46773c6..a5ca279 100644
--- a/drivers/infiniband/hw/ipath/ipath_keys.c
+++ b/drivers/infiniband/hw/ipath/ipath_keys.c
@@ -197,6 +197,21 @@ int ipath_rkey_ok(struct ipath_ibdev *de
 	size_t off;
 	int ret;
 
+	/*
+	 * We use RKEY == zero for physical addresses
+	 * (see ipath_get_dma_mr).
+	 */
+	if (rkey == 0) {
+		sge->mr = NULL;
+		sge->vaddr = phys_to_virt(vaddr);
+		sge->length = len;
+		sge->sge_length = len;
+		ss->sg_list = NULL;
+		ss->num_sge = 1;
+		ret = 1;
+		goto bail;
+	}
+
 	mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))];
 	if (unlikely(mr == NULL || mr->lkey != rkey)) {
 		ret = 0;
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
index 56ac336..d70a9b6 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
@@ -191,10 +191,6 @@ void ipath_skip_sge(struct ipath_sge_sta
 {
 	struct ipath_sge *sge = &ss->sge;
 
-	while (length > sge->sge_length) {
-		length -= sge->sge_length;
-		ss->sge = *ss->sg_list++;
-	}
 	while (length) {
 		u32 len = sge->length;
 
@@ -627,6 +623,7 @@ static int ipath_query_device(struct ib_
 	props->device_cap_flags = IB_DEVICE_BAD_PKEY_CNTR |
 		IB_DEVICE_BAD_QKEY_CNTR | IB_DEVICE_SHUTDOWN_PORT |
 		IB_DEVICE_SYS_IMAGE_GUID;
+	props->page_size_cap = PAGE_SIZE;
 	props->vendor_id = ipath_layer_get_vendorid(dev->dd);
 	props->vendor_part_id = ipath_layer_get_deviceid(dev->dd);
 	props->hw_ver = ipath_layer_get_pcirev(dev->dd);
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c
index d0f7731..deabc14 100644
--- a/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -778,11 +778,12 @@ #define QUERY_FW_EQ_SET_CI_BASE_OFFSET 0
 		((dev->fw_ver & 0xffff0000ull) >> 16) |
 		((dev->fw_ver & 0x0000ffffull) << 16);
 
+	MTHCA_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
+	dev->cmd.max_cmds = 1 << lg;
+
 	mthca_dbg(dev, "FW version %012llx, max commands %d\n",
 		  (unsigned long long) dev->fw_ver, dev->cmd.max_cmds);
 
-	MTHCA_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
-	dev->cmd.max_cmds = 1 << lg;
 	MTHCA_GET(dev->catas_err.addr, outbox, QUERY_FW_ERR_START_OFFSET);
 	MTHCA_GET(dev->catas_err.size, outbox, QUERY_FW_ERR_SIZE_OFFSET);
 
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c
index fab417c..b60a9d7 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -370,7 +370,8 @@ int mthca_modify_srq(struct ib_srq *ibsr
 		return -EINVAL;
 
 	if (attr_mask & IB_SRQ_LIMIT) {
-		if (attr->srq_limit > srq->max)
+		u32 max_wr = mthca_is_memfree(dev) ? srq->max - 1 : srq->max;
+		if (attr->srq_limit > max_wr)
 			return -EINVAL;
 
 		mutex_lock(&srq->mutex);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 3f89f5e..474aa21 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -212,6 +212,7 @@ struct ipoib_path {
 
 struct ipoib_neigh {
 	struct ipoib_ah    *ah;
+	union ib_gid        dgid;
 	struct sk_buff_head queue;
 
 	struct neighbour   *neighbour;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 1c6ea1c..cf71d2a 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -404,6 +404,8 @@ static void path_rec_completion(int stat
 		list_for_each_entry(neigh, &path->neigh_list, list) {
 			kref_get(&path->ah->ref);
 			neigh->ah = path->ah;
+			memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw,
+			       sizeof(union ib_gid));
 
 			while ((skb = __skb_dequeue(&neigh->queue)))
 				__skb_queue_tail(&skqueue, skb);
@@ -510,6 +512,8 @@ static void neigh_add_path(struct sk_buf
 	if (path->ah) {
 		kref_get(&path->ah->ref);
 		neigh->ah = path->ah;
+		memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw,
+		       sizeof(union ib_gid));
 
 		ipoib_send(dev, skb, path->ah,
 			   be32_to_cpup((__be32 *) skb->dst->neighbour->ha));
@@ -633,6 +637,25 @@ static int ipoib_start_xmit(struct sk_bu
 		neigh = *to_ipoib_neigh(skb->dst->neighbour);
 
 		if (likely(neigh->ah)) {
+			if (unlikely(memcmp(&neigh->dgid.raw,
+					    skb->dst->neighbour->ha + 4,
+					    sizeof(union ib_gid)))) {
+				spin_lock(&priv->lock);
+				/*
+				 * It's safe to call ipoib_put_ah() inside
+				 * priv->lock here, because we know that
+				 * path->ah will always hold one more reference,
+				 * so ipoib_put_ah() will never do more than
+				 * decrement the ref count.
+				 */
+				ipoib_put_ah(neigh->ah);
+				list_del(&neigh->list);
+				ipoib_neigh_free(neigh);
+				spin_unlock(&priv->lock);
+				ipoib_path_lookup(skb, dev);
+				goto out;
+			}
+
 			ipoib_send(dev, skb, neigh->ah,
 				   be32_to_cpup((__be32 *) skb->dst->neighbour->ha));
 			goto out;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index ab40488..b5e6a7b 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -264,6 +264,10 @@ static int ipoib_mcast_join_finish(struc
 		if (!ah) {
 			ipoib_warn(priv, "ib_address_create failed\n");
 		} else {
+			spin_lock_irq(&priv->lock);
+			mcast->ah = ah;
+			spin_unlock_irq(&priv->lock);
+
 			ipoib_dbg_mcast(priv, "MGID " IPOIB_GID_FMT
 					" AV %p, LID 0x%04x, SL %d\n",
 					IPOIB_GID_ARG(mcast->mcmember.mgid),
@@ -271,10 +275,6 @@ static int ipoib_mcast_join_finish(struc
 					be16_to_cpu(mcast->mcmember.mlid),
 					mcast->mcmember.sl);
 		}
-
-		spin_lock_irq(&priv->lock);
-		mcast->ah = ah;
-		spin_unlock_irq(&priv->lock);
 	}
 
 	/* actually send any queued packets */
diff --git a/include/rdma/ib_mad.h b/include/rdma/ib_mad.h
index 5ff7755..585d28e 100644
--- a/include/rdma/ib_mad.h
+++ b/include/rdma/ib_mad.h
@@ -75,6 +75,7 @@ #define IB_MGMT_METHOD_REPORT_RESP		0x86
 #define IB_MGMT_METHOD_TRAP_REPRESS		0x07
 
 #define IB_MGMT_METHOD_RESP			0x80
+#define IB_BM_ATTR_MOD_RESP			cpu_to_be32(1)
 
 #define IB_MGMT_MAX_METHODS			128
 
@@ -247,6 +248,12 @@ struct ib_mad_send_buf {
 };
 
 /**
+ * ib_response_mad - Returns if the specified MAD has been generated in
+ *   response to a sent request or trap.
+ */
+int ib_response_mad(struct ib_mad *mad);
+
+/**
  * ib_get_rmpp_resptime - Returns the RMPP response time.
  * @rmpp_hdr: An RMPP header.
  */

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

* [GIT PULL] please pull infiniband.git
@ 2006-06-22 16:22 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-06-22 16:22 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This is mostly merging the new iSER (iSCSI over RDMA transport) initiator:

Krishna Kumar:
      IB/uverbs: Don't free wr list when it's known to be empty

Or Gerlitz:
      IB/iser: iSCSI iSER transport provider header file
      IB/iser: iSCSI iSER transport provider high level code
      IB/iser: iSER initiator iSCSI PDU and TX/RX
      IB/iser: iSER RDMA CM (CMA) and IB verbs interaction
      IB/iser: iSER handling of memory for RDMA
      IB/iser: iSER Kconfig and Makefile

Roland Dreier:
      IB/uverbs: Remove unnecessary list_del()s

 drivers/infiniband/Kconfig                   |    2 
 drivers/infiniband/Makefile                  |    1 
 drivers/infiniband/core/uverbs_cmd.c         |    2 
 drivers/infiniband/core/uverbs_main.c        |    6 
 drivers/infiniband/ulp/iser/Kconfig          |   11 
 drivers/infiniband/ulp/iser/Makefile         |    4 
 drivers/infiniband/ulp/iser/iscsi_iser.c     |  790 +++++++++++++++++++++++++
 drivers/infiniband/ulp/iser/iscsi_iser.h     |  354 +++++++++++
 drivers/infiniband/ulp/iser/iser_initiator.c |  738 +++++++++++++++++++++++
 drivers/infiniband/ulp/iser/iser_memory.c    |  401 +++++++++++++
 drivers/infiniband/ulp/iser/iser_verbs.c     |  827 ++++++++++++++++++++++++++
 drivers/scsi/Makefile                        |    1 
 12 files changed, 3130 insertions(+), 7 deletions(-)
 create mode 100644 drivers/infiniband/ulp/iser/Kconfig
 create mode 100644 drivers/infiniband/ulp/iser/Makefile
 create mode 100644 drivers/infiniband/ulp/iser/iscsi_iser.c
 create mode 100644 drivers/infiniband/ulp/iser/iscsi_iser.h
 create mode 100644 drivers/infiniband/ulp/iser/iser_initiator.c
 create mode 100644 drivers/infiniband/ulp/iser/iser_memory.c
 create mode 100644 drivers/infiniband/ulp/iser/iser_verbs.c

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

* [GIT PULL] please pull infiniband.git
@ 2006-06-18 11:49 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-06-18 11:49 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

Opening the floodgates for 2.6.18:

Ganapathi CH:
      IB/uverbs: Release lock on error path

Ishai Rabinovitz:
      IB/srp: Clean up loop in srp_remove_one()
      IB/srp: Handle DREQ events from CM
      IB/srp: Factor out common request reset code

Jack Morgenstein:
      IB: Add caching of ports' LMC
      IB/mad: Check GID/LID when matching requests
      IPoIB: Fix kernel unaligned access on ia64

Leonid Arsh:
      IB: Add client reregister event type
      IPoIB: Handle client reregister events
      IB: Move struct port_info from ipath to <rdma/ib_smi.h>
      IB/mthca: Add client reregister event generation

Matthew Wilcox:
      IB/srp: Use SCAN_WILD_CARD from SCSI headers
      IB/srp: Get rid of unneeded use of list_for_each_entry_safe()
      IB/srp: Change target_mutex to a spinlock

Michael S. Tsirkin:
      IB/mthca: restore missing PCI registers after reset
      IB/mthca: memfree completion with error FW bug workaround
      IB/mthca: Remove dead code
      IB/cm: remove unneeded flush_workqueue

Or Gerlitz:
      IB/mthca: Fill in max_map_per_fmr device attribute
      IB/fmr: Use device's max_map_map_per_fmr attribute in FMR pool.

Ramachandra K:
      [SCSI] srp.h: Add I/O Class values
      IB/srp: Support SRP rev. 10 targets

Roland Dreier:
      IB/srp: Use FMRs to map gather/scatter lists
      IB/mthca: Convert FW commands to use wait_for_completion_timeout()
      IB: Make needlessly global ib_mad_cache static
      IPoIB: Mention RFC numbers in documentation
      IB/srp: Get rid of "Target has req_lim 0" messages
      IPoIB: Avoid using stale last_send counter when reaping AHs
      IB/ipath: Add client reregister event generation
      IB/uverbs: Don't decrement usecnt on error paths
      IB/uverbs: Factor out common idr code
      IB/mthca: Fix memory leak on modify_qp error paths
      IB/mthca: Make all device methods truly reentrant
      IB/uverbs: Don't serialize with ib_uverbs_idr_mutex

Sean Hefty:
      IB: common handling for marshalling parameters to/from userspace
      IB/cm: Match connection requests based on private data
      [NET]: Export ip_dev_find()
      IB: address translation to map IP toIB addresses (GIDs)
      IB: IP address based RDMA connection manager
      IB/ucm: convert semaphore to mutex
      IB/ucm: Get rid of duplicate P_Key parameter
      IB: Add ib_init_ah_from_wc()
      IB/sa: Add ib_init_ah_from_path()
      IB/cm: Use address handle helpers

Vu Pham:
      IB/srp: Allow cmd_per_lun to be set per target port
      IB/srp: Allow sg_tablesize to be adjusted

 Documentation/infiniband/ipoib.txt             |   12 
 drivers/infiniband/Kconfig                     |    5 
 drivers/infiniband/core/Makefile               |   11 
 drivers/infiniband/core/addr.c                 |  367 +++++
 drivers/infiniband/core/cache.c                |   30 
 drivers/infiniband/core/cm.c                   |  119 +
 drivers/infiniband/core/cma.c                  | 1927 ++++++++++++++++++++++++
 drivers/infiniband/core/fmr_pool.c             |   30 
 drivers/infiniband/core/mad.c                  |   97 +
 drivers/infiniband/core/mad_priv.h             |    2 
 drivers/infiniband/core/sa_query.c             |   31 
 drivers/infiniband/core/ucm.c                  |  183 +-
 drivers/infiniband/core/uverbs.h               |    4 
 drivers/infiniband/core/uverbs_cmd.c           |  971 +++++++-----
 drivers/infiniband/core/uverbs_main.c          |   35 
 drivers/infiniband/core/uverbs_marshall.c      |  138 ++
 drivers/infiniband/core/verbs.c                |   44 -
 drivers/infiniband/hw/ipath/ipath_mad.c        |   42 -
 drivers/infiniband/hw/mthca/mthca_cmd.c        |   23 
 drivers/infiniband/hw/mthca/mthca_cq.c         |   12 
 drivers/infiniband/hw/mthca/mthca_eq.c         |    4 
 drivers/infiniband/hw/mthca/mthca_mad.c        |   14 
 drivers/infiniband/hw/mthca/mthca_provider.c   |   33 
 drivers/infiniband/hw/mthca/mthca_provider.h   |    3 
 drivers/infiniband/hw/mthca/mthca_qp.c         |   40 
 drivers/infiniband/hw/mthca/mthca_reset.c      |   59 +
 drivers/infiniband/hw/mthca/mthca_srq.c        |    5 
 drivers/infiniband/ulp/ipoib/ipoib.h           |   34 
 drivers/infiniband/ulp/ipoib/ipoib_ib.c        |   27 
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |   28 
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   11 
 drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |    3 
 drivers/infiniband/ulp/srp/ib_srp.c            |  482 ++++--
 drivers/infiniband/ulp/srp/ib_srp.h            |   33 
 include/rdma/ib_addr.h                         |  114 +
 include/rdma/ib_cache.h                        |   13 
 include/rdma/ib_cm.h                           |   26 
 include/rdma/ib_marshall.h                     |   50 +
 include/rdma/ib_sa.h                           |    7 
 include/rdma/ib_smi.h                          |   36 
 include/rdma/ib_user_cm.h                      |   86 -
 include/rdma/ib_user_sa.h                      |   60 +
 include/rdma/ib_user_verbs.h                   |   80 +
 include/rdma/ib_verbs.h                        |   22 
 include/rdma/rdma_cm.h                         |  256 +++
 include/rdma/rdma_cm_ib.h                      |   47 +
 include/scsi/srp.h                             |    5 
 net/ipv4/fib_frontend.c                        |    1 
 48 files changed, 4590 insertions(+), 1072 deletions(-)
 create mode 100644 drivers/infiniband/core/addr.c
 create mode 100644 drivers/infiniband/core/cma.c
 create mode 100644 drivers/infiniband/core/uverbs_marshall.c
 create mode 100644 include/rdma/ib_addr.h
 create mode 100644 include/rdma/ib_marshall.h
 create mode 100644 include/rdma/ib_user_sa.h
 create mode 100644 include/rdma/rdma_cm.h
 create mode 100644 include/rdma/rdma_cm_ib.h

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

* [git pull] please pull infiniband.git
@ 2006-06-13 18:19 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-06-13 18:19 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This has a couple of mthca driver bug fixes:

Michael S. Tsirkin:
      IB/mthca: restore missing PCI registers after reset
      IB/mthca: memfree completion with error FW bug workaround

 drivers/infiniband/hw/mthca/mthca_cq.c    |   11 +++++
 drivers/infiniband/hw/mthca/mthca_reset.c |   59 +++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletions(-)


diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index 205854e..87a8f11 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -540,8 +540,17 @@ static inline int mthca_poll_one(struct 
 		entry->wr_id = srq->wrid[wqe_index];
 		mthca_free_srq_wqe(srq, wqe);
 	} else {
+		s32 wqe;
 		wq = &(*cur_qp)->rq;
-		wqe_index = be32_to_cpu(cqe->wqe) >> wq->wqe_shift;
+		wqe = be32_to_cpu(cqe->wqe);
+		wqe_index = wqe >> wq->wqe_shift;
+               /*
+		* WQE addr == base - 1 might be reported in receive completion
+		* with error instead of (rq size - 1) by Sinai FW 1.0.800 and
+		* Arbel FW 5.1.400.  This bug should be fixed in later FW revs.
+		*/
+		if (unlikely(wqe_index < 0))
+			wqe_index = wq->max - 1;
 		entry->wr_id = (*cur_qp)->wrid[wqe_index];
 	}
 
diff --git a/drivers/infiniband/hw/mthca/mthca_reset.c b/drivers/infiniband/hw/mthca/mthca_reset.c
index df5e494..f4fddd5 100644
--- a/drivers/infiniband/hw/mthca/mthca_reset.c
+++ b/drivers/infiniband/hw/mthca/mthca_reset.c
@@ -49,6 +49,12 @@ int mthca_reset(struct mthca_dev *mdev)
 	u32 *hca_header    = NULL;
 	u32 *bridge_header = NULL;
 	struct pci_dev *bridge = NULL;
+	int bridge_pcix_cap = 0;
+	int hca_pcie_cap = 0;
+	int hca_pcix_cap = 0;
+
+	u16 devctl;
+	u16 linkctl;
 
 #define MTHCA_RESET_OFFSET 0xf0010
 #define MTHCA_RESET_VALUE  swab32(1)
@@ -110,6 +116,9 @@ #define MTHCA_RESET_VALUE  swab32(1)
 		}
 	}
 
+	hca_pcix_cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_PCIX);
+	hca_pcie_cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_EXP);
+
 	if (bridge) {
 		bridge_header = kmalloc(256, GFP_KERNEL);
 		if (!bridge_header) {
@@ -129,6 +138,13 @@ #define MTHCA_RESET_VALUE  swab32(1)
 				goto out;
 			}
 		}
+		bridge_pcix_cap = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
+		if (!bridge_pcix_cap) {
+				err = -ENODEV;
+				mthca_err(mdev, "Couldn't locate HCA bridge "
+					  "PCI-X capability, aborting.\n");
+				goto out;
+		}
 	}
 
 	/* actually hit reset */
@@ -178,6 +194,20 @@ #define MTHCA_RESET_VALUE  swab32(1)
 good:
 	/* Now restore the PCI headers */
 	if (bridge) {
+		if (pci_write_config_dword(bridge, bridge_pcix_cap + 0x8,
+				 bridge_header[(bridge_pcix_cap + 0x8) / 4])) {
+			err = -ENODEV;
+			mthca_err(mdev, "Couldn't restore HCA bridge Upstream "
+				  "split transaction control, aborting.\n");
+			goto out;
+		}
+		if (pci_write_config_dword(bridge, bridge_pcix_cap + 0xc,
+				 bridge_header[(bridge_pcix_cap + 0xc) / 4])) {
+			err = -ENODEV;
+			mthca_err(mdev, "Couldn't restore HCA bridge Downstream "
+				  "split transaction control, aborting.\n");
+			goto out;
+		}
 		/*
 		 * Bridge control register is at 0x3e, so we'll
 		 * naturally restore it last in this loop.
@@ -203,6 +233,35 @@ good:
 		}
 	}
 
+	if (hca_pcix_cap) {
+		if (pci_write_config_dword(mdev->pdev, hca_pcix_cap,
+				 hca_header[hca_pcix_cap / 4])) {
+			err = -ENODEV;
+			mthca_err(mdev, "Couldn't restore HCA PCI-X "
+				  "command register, aborting.\n");
+			goto out;
+		}
+	}
+
+	if (hca_pcie_cap) {
+		devctl = hca_header[(hca_pcie_cap + PCI_EXP_DEVCTL) / 4];
+		if (pci_write_config_word(mdev->pdev, hca_pcie_cap + PCI_EXP_DEVCTL,
+					   devctl)) {
+			err = -ENODEV;
+			mthca_err(mdev, "Couldn't restore HCA PCI Express "
+				  "Device Control register, aborting.\n");
+			goto out;
+		}
+		linkctl = hca_header[(hca_pcie_cap + PCI_EXP_LNKCTL) / 4];
+		if (pci_write_config_word(mdev->pdev, hca_pcie_cap + PCI_EXP_LNKCTL,
+					   linkctl)) {
+			err = -ENODEV;
+			mthca_err(mdev, "Couldn't restore HCA PCI Express "
+				  "Link control register, aborting.\n");
+			goto out;
+		}
+	}
+
 	for (i = 0; i < 16; ++i) {
 		if (i * 4 == PCI_COMMAND)
 			continue;

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

* [git pull] please pull infiniband.git
@ 2006-06-05 17:21 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-06-05 17:21 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This has a one-line bug fix:

Eli Cohen:
      IPoIB: Fix AH leak at interface down

 drivers/infiniband/ulp/ipoib/ipoib_ib.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index a54da42..8406839 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -275,6 +275,7 @@ static void ipoib_ib_handle_wc(struct ne
 		spin_lock_irqsave(&priv->tx_lock, flags);
 		++priv->tx_tail;
 		if (netif_queue_stopped(dev) &&
+		    test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags) &&
 		    priv->tx_head - priv->tx_tail <= ipoib_sendq_size >> 1)
 			netif_wake_queue(dev);
 		spin_unlock_irqrestore(&priv->tx_lock, flags);

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

* [git pull] please pull infiniband.git
@ 2006-05-26  0:09 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-05-26  0:09 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree has one bug fix (really the second half of a fix for a bug
that appeared two different places):

Michael S. Tsirkin:
      IB/mthca: Fix posting lists of 256 receive requests to SRQ for Tavor

 drivers/infiniband/hw/mthca/mthca_srq.c |   41 ++++++++++++++++---------------
 1 files changed, 21 insertions(+), 20 deletions(-)


diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c
index 1ea4332..b292fef 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -490,26 +490,7 @@ int mthca_tavor_post_srq_recv(struct ib_
 
 	first_ind = srq->first_free;
 
-	for (nreq = 0; wr; ++nreq, wr = wr->next) {
-		if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
-			nreq = 0;
-
-			doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
-			doorbell[1] = cpu_to_be32(srq->srqn << 8);
-
-			/*
-			 * Make sure that descriptors are written
-			 * before doorbell is rung.
-			 */
-			wmb();
-
-			mthca_write64(doorbell,
-				      dev->kar + MTHCA_RECEIVE_DOORBELL,
-				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
-
-			first_ind = srq->first_free;
-		}
-
+	for (nreq = 0; wr; wr = wr->next) {
 		ind = srq->first_free;
 
 		if (ind < 0) {
@@ -569,6 +550,26 @@ int mthca_tavor_post_srq_recv(struct ib_
 
 		srq->wrid[ind]  = wr->wr_id;
 		srq->first_free = next_ind;
+
+		++nreq;
+		if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
+			nreq = 0;
+
+			doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
+			doorbell[1] = cpu_to_be32(srq->srqn << 8);
+
+			/*
+			 * Make sure that descriptors are written
+			 * before doorbell is rung.
+			 */
+			wmb();
+
+			mthca_write64(doorbell,
+				      dev->kar + MTHCA_RECEIVE_DOORBELL,
+				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
+
+			first_ind = srq->first_free;
+		}
 	}
 
 	if (likely(nreq)) {

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

* [git pull] please pull infiniband.git
@ 2006-05-23 21:05 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-05-23 21:05 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This contains fixes for the new ipath driver.  The changes are a
little bit bigger than I would prefer at this stage in the release
cycle, but since the ipath driver is new in 2.6.17, there's no risk of
regressions against 2.6.16 ;)

Bryan O'Sullivan:
      IB/ipath: fix spinlock recursion bug
      IB/ipath: don't modify QP if changes fail
      IB/ipath: fix reporting of driver version to userspace
      IB/ipath: replace uses of LIST_POISON
      IB/ipath: fix NULL dereference during cleanup
      IB/ipath: enable GPIO interrupt on HT-460
      IB/ipath: enable PE800 receive interrupts on user ports
      IB/ipath: register as IB device owner
      IB/ipath: fix null deref during rdma ops
      IB/ipath: deref correct pointer when using kernel SMA

 drivers/infiniband/hw/ipath/ipath_driver.c    |   22 ++++-----
 drivers/infiniband/hw/ipath/ipath_eeprom.c    |    7 +--
 drivers/infiniband/hw/ipath/ipath_file_ops.c  |    6 ++
 drivers/infiniband/hw/ipath/ipath_ht400.c     |   21 +++++++-
 drivers/infiniband/hw/ipath/ipath_init_chip.c |    1 
 drivers/infiniband/hw/ipath/ipath_kernel.h    |    2 -
 drivers/infiniband/hw/ipath/ipath_keys.c      |    6 --
 drivers/infiniband/hw/ipath/ipath_layer.c     |   12 +++--
 drivers/infiniband/hw/ipath/ipath_pe800.c     |    2 +
 drivers/infiniband/hw/ipath/ipath_qp.c        |   64 +++++++++++++------------
 drivers/infiniband/hw/ipath/ipath_rc.c        |   15 +++---
 drivers/infiniband/hw/ipath/ipath_ruc.c       |    2 -
 drivers/infiniband/hw/ipath/ipath_verbs.c     |    7 ++-
 13 files changed, 92 insertions(+), 75 deletions(-)


diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index 3697eda..dddcdae 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -1905,19 +1905,19 @@ static void __exit infinipath_cleanup(vo
 			} else
 				ipath_dbg("irq is 0, not doing free_irq "
 					  "for unit %u\n", dd->ipath_unit);
-			dd->pcidev = NULL;
-		}
 
-		/*
-		 * we check for NULL here, because it's outside the kregbase
-		 * check, and we need to call it after the free_irq.  Thus
-		 * it's possible that the function pointers were never
-		 * initialized.
-		 */
-		if (dd->ipath_f_cleanup)
-			/* clean up chip-specific stuff */
-			dd->ipath_f_cleanup(dd);
+			/*
+			 * we check for NULL here, because it's outside
+			 * the kregbase check, and we need to call it
+			 * after the free_irq.  Thus it's possible that
+			 * the function pointers were never initialized.
+			 */
+			if (dd->ipath_f_cleanup)
+				/* clean up chip-specific stuff */
+				dd->ipath_f_cleanup(dd);
 
+			dd->pcidev = NULL;
+		}
 		spin_lock_irqsave(&ipath_devs_lock, flags);
 	}
 
diff --git a/drivers/infiniband/hw/ipath/ipath_eeprom.c b/drivers/infiniband/hw/ipath/ipath_eeprom.c
index f11a900..a2f1cea 100644
--- a/drivers/infiniband/hw/ipath/ipath_eeprom.c
+++ b/drivers/infiniband/hw/ipath/ipath_eeprom.c
@@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash 
  * ipath_get_guid - get the GUID from the i2c device
  * @dd: the infinipath device
  *
- * When we add the multi-chip support, we will probably have to add
- * the ability to use the number of guids field, and get the guid from
- * the first chip's flash, to use for all of them.
+ * We have the capability to use the ipath_nguid field, and get
+ * the guid from the first chip's flash, to use for all of them.
  */
-void ipath_get_guid(struct ipath_devdata *dd)
+void ipath_get_eeprom_info(struct ipath_devdata *dd)
 {
 	void *buf;
 	struct ipath_flash *ifp;
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c
index c347191..ada267e 100644
--- a/drivers/infiniband/hw/ipath/ipath_file_ops.c
+++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c
@@ -139,7 +139,7 @@ static int ipath_get_base_info(struct ip
 	kinfo->spi_piosize = dd->ipath_ibmaxlen;
 	kinfo->spi_mtu = dd->ipath_ibmaxlen;	/* maxlen, not ibmtu */
 	kinfo->spi_port = pd->port_port;
-	kinfo->spi_sw_version = IPATH_USER_SWVERSION;
+	kinfo->spi_sw_version = IPATH_KERN_SWVERSION;
 	kinfo->spi_hw_version = dd->ipath_revision;
 
 	if (copy_to_user(ubase, kinfo, sizeof(*kinfo)))
@@ -1224,6 +1224,10 @@ static unsigned int ipath_poll(struct fi
 
 	if (tail == head) {
 		set_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag);
+		if(dd->ipath_rhdrhead_intr_off) /* arm rcv interrupt */
+			(void)ipath_write_ureg(dd, ur_rcvhdrhead,
+					       dd->ipath_rhdrhead_intr_off
+					       | head, pd->port_port);
 		poll_wait(fp, &pd->port_wait, pt);
 
 		if (test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
diff --git a/drivers/infiniband/hw/ipath/ipath_ht400.c b/drivers/infiniband/hw/ipath/ipath_ht400.c
index 4652435..fac0a2b 100644
--- a/drivers/infiniband/hw/ipath/ipath_ht400.c
+++ b/drivers/infiniband/hw/ipath/ipath_ht400.c
@@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipa
 	case 4:		/* Ponderosa is one of the bringup boards */
 		n = "Ponderosa";
 		break;
-	case 5:		/* HT-460 original production board */
+	case 5:
+		/*
+		 * HT-460 original production board; two production levels, with
+		 * different serial number ranges.   See ipath_ht_early_init() for
+		 * case where we enable IPATH_GPIO_INTR for later serial # range.
+		 */
 		n = "InfiniPath_HT-460";
 		break;
 	case 6:
@@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipa
 	if (n)
 		snprintf(name, namelen, "%s", n);
 
-	if (dd->ipath_majrev != 3 || dd->ipath_minrev != 2) {
+	if (dd->ipath_majrev != 3 || (dd->ipath_minrev < 2 || dd->ipath_minrev > 3)) {
 		/*
 		 * This version of the driver only supports the HT-400
 		 * Rev 3.2
@@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ip
 	 */
 	ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
 			 INFINIPATH_S_ABORT);
+
+	ipath_get_eeprom_info(dd);
+	if(dd->ipath_boardrev == 5 && dd->ipath_serial[0] == '1' &&
+		dd->ipath_serial[1] == '2' && dd->ipath_serial[2] == '8') {
+		/*
+		 * Later production HT-460 has same changes as HT-465, so
+		 * can use GPIO interrupts.  They have serial #'s starting
+		 * with 128, rather than 112.
+		 */
+		dd->ipath_flags |= IPATH_GPIO_INTR;
+		dd->ipath_flags &= ~IPATH_POLL_RX_INTR;
+	}
 	return 0;
 }
 
diff --git a/drivers/infiniband/hw/ipath/ipath_init_chip.c b/drivers/infiniband/hw/ipath/ipath_init_chip.c
index 16f640e..dc83250 100644
--- a/drivers/infiniband/hw/ipath/ipath_init_chip.c
+++ b/drivers/infiniband/hw/ipath/ipath_init_chip.c
@@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata
 
 done:
 	if (!ret) {
-		ipath_get_guid(dd);
 		*dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT;
 		if (!dd->ipath_f_intrsetup(dd)) {
 			/* now we can enable all interrupts from the chip */
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index e6507f8..5d92d57 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipat
 void ipath_init_pe800_funcs(struct ipath_devdata *);
 /* init HT-400-specific func */
 void ipath_init_ht400_funcs(struct ipath_devdata *);
-void ipath_get_guid(struct ipath_devdata *);
+void ipath_get_eeprom_info(struct ipath_devdata *);
 u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg);
 
 /*
diff --git a/drivers/infiniband/hw/ipath/ipath_keys.c b/drivers/infiniband/hw/ipath/ipath_keys.c
index aa33b0e..5ae8761 100644
--- a/drivers/infiniband/hw/ipath/ipath_keys.c
+++ b/drivers/infiniband/hw/ipath/ipath_keys.c
@@ -136,9 +136,7 @@ int ipath_lkey_ok(struct ipath_lkey_tabl
 		ret = 1;
 		goto bail;
 	}
-	spin_lock(&rkt->lock);
 	mr = rkt->table[(sge->lkey >> (32 - ib_ipath_lkey_table_size))];
-	spin_unlock(&rkt->lock);
 	if (unlikely(mr == NULL || mr->lkey != sge->lkey)) {
 		ret = 0;
 		goto bail;
@@ -184,8 +182,6 @@ bail:
  * @acc: access flags
  *
  * Return 1 if successful, otherwise 0.
- *
- * The QP r_rq.lock should be held.
  */
 int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
 		  u32 len, u64 vaddr, u32 rkey, int acc)
@@ -196,9 +192,7 @@ int ipath_rkey_ok(struct ipath_ibdev *de
 	size_t off;
 	int ret;
 
-	spin_lock(&rkt->lock);
 	mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))];
-	spin_unlock(&rkt->lock);
 	if (unlikely(mr == NULL || mr->lkey != rkey)) {
 		ret = 0;
 		goto bail;
diff --git a/drivers/infiniband/hw/ipath/ipath_layer.c b/drivers/infiniband/hw/ipath/ipath_layer.c
index 9cb5258..9ec4ac7 100644
--- a/drivers/infiniband/hw/ipath/ipath_layer.c
+++ b/drivers/infiniband/hw/ipath/ipath_layer.c
@@ -872,12 +872,13 @@ static void copy_io(u32 __iomem *piobuf,
 		update_sge(ss, len);
 		length -= len;
 	}
+	/* Update address before sending packet. */
+	update_sge(ss, length);
 	/* must flush early everything before trigger word */
 	ipath_flush_wc();
 	__raw_writel(last, piobuf);
 	/* be sure trigger word is written */
 	ipath_flush_wc();
-	update_sge(ss, length);
 }
 
 /**
@@ -943,17 +944,18 @@ int ipath_verbs_send(struct ipath_devdat
 	if (likely(ss->num_sge == 1 && len <= ss->sge.length &&
 		   !((unsigned long)ss->sge.vaddr & (sizeof(u32) - 1)))) {
 		u32 w;
+		u32 *addr = (u32 *) ss->sge.vaddr;
 
+		/* Update address before sending packet. */
+		update_sge(ss, len);
 		/* Need to round up for the last dword in the packet. */
 		w = (len + 3) >> 2;
-		__iowrite32_copy(piobuf, ss->sge.vaddr, w - 1);
+		__iowrite32_copy(piobuf, addr, w - 1);
 		/* must flush early everything before trigger word */
 		ipath_flush_wc();
-		__raw_writel(((u32 *) ss->sge.vaddr)[w - 1],
-			     piobuf + w - 1);
+		__raw_writel(addr[w - 1], piobuf + w - 1);
 		/* be sure trigger word is written */
 		ipath_flush_wc();
-		update_sge(ss, len);
 		ret = 0;
 		goto bail;
 	}
diff --git a/drivers/infiniband/hw/ipath/ipath_pe800.c b/drivers/infiniband/hw/ipath/ipath_pe800.c
index 6318067..02e8c75 100644
--- a/drivers/infiniband/hw/ipath/ipath_pe800.c
+++ b/drivers/infiniband/hw/ipath/ipath_pe800.c
@@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ip
 	 */
 	dd->ipath_rhdrhead_intr_off = 1ULL<<32;
 
+	ipath_get_eeprom_info(dd);
+
 	return 0;
 }
 
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c
index 1889071..9f8855d 100644
--- a/drivers/infiniband/hw/ipath/ipath_qp.c
+++ b/drivers/infiniband/hw/ipath/ipath_qp.c
@@ -375,10 +375,10 @@ static void ipath_error_qp(struct ipath_
 
 	spin_lock(&dev->pending_lock);
 	/* XXX What if its already removed by the timeout code? */
-	if (qp->timerwait.next != LIST_POISON1)
-		list_del(&qp->timerwait);
-	if (qp->piowait.next != LIST_POISON1)
-		list_del(&qp->piowait);
+	if (!list_empty(&qp->timerwait))
+		list_del_init(&qp->timerwait);
+	if (!list_empty(&qp->piowait))
+		list_del_init(&qp->piowait);
 	spin_unlock(&dev->pending_lock);
 
 	wc.status = IB_WC_WR_FLUSH_ERR;
@@ -427,6 +427,7 @@ static void ipath_error_qp(struct ipath_
 int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 		    int attr_mask)
 {
+	struct ipath_ibdev *dev = to_idev(ibqp->device);
 	struct ipath_qp *qp = to_iqp(ibqp);
 	enum ib_qp_state cur_state, new_state;
 	unsigned long flags;
@@ -443,6 +444,19 @@ int ipath_modify_qp(struct ib_qp *ibqp, 
 				attr_mask))
 		goto inval;
 
+	if (attr_mask & IB_QP_AV)
+		if (attr->ah_attr.dlid == 0 ||
+		    attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
+			goto inval;
+
+	if (attr_mask & IB_QP_PKEY_INDEX)
+		if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
+			goto inval;
+
+	if (attr_mask & IB_QP_MIN_RNR_TIMER)
+		if (attr->min_rnr_timer > 31)
+			goto inval;
+
 	switch (new_state) {
 	case IB_QPS_RESET:
 		ipath_reset_qp(qp);
@@ -457,13 +471,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, 
 
 	}
 
-	if (attr_mask & IB_QP_PKEY_INDEX) {
-		struct ipath_ibdev *dev = to_idev(ibqp->device);
-
-		if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
-			goto inval;
+	if (attr_mask & IB_QP_PKEY_INDEX)
 		qp->s_pkey_index = attr->pkey_index;
-	}
 
 	if (attr_mask & IB_QP_DEST_QPN)
 		qp->remote_qpn = attr->dest_qp_num;
@@ -479,12 +488,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, 
 	if (attr_mask & IB_QP_ACCESS_FLAGS)
 		qp->qp_access_flags = attr->qp_access_flags;
 
-	if (attr_mask & IB_QP_AV) {
-		if (attr->ah_attr.dlid == 0 ||
-		    attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
-			goto inval;
+	if (attr_mask & IB_QP_AV)
 		qp->remote_ah_attr = attr->ah_attr;
-	}
 
 	if (attr_mask & IB_QP_PATH_MTU)
 		qp->path_mtu = attr->path_mtu;
@@ -499,11 +504,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, 
 		qp->s_rnr_retry_cnt = qp->s_rnr_retry;
 	}
 
-	if (attr_mask & IB_QP_MIN_RNR_TIMER) {
-		if (attr->min_rnr_timer > 31)
-			goto inval;
+	if (attr_mask & IB_QP_MIN_RNR_TIMER)
 		qp->s_min_rnr_timer = attr->min_rnr_timer;
-	}
 
 	if (attr_mask & IB_QP_QKEY)
 		qp->qkey = attr->qkey;
@@ -710,10 +712,8 @@ struct ib_qp *ipath_create_qp(struct ib_
 			     init_attr->qp_type == IB_QPT_RC ?
 			     ipath_do_rc_send : ipath_do_uc_send,
 			     (unsigned long)qp);
-		qp->piowait.next = LIST_POISON1;
-		qp->piowait.prev = LIST_POISON2;
-		qp->timerwait.next = LIST_POISON1;
-		qp->timerwait.prev = LIST_POISON2;
+		INIT_LIST_HEAD(&qp->piowait);
+		INIT_LIST_HEAD(&qp->timerwait);
 		qp->state = IB_QPS_RESET;
 		qp->s_wq = swq;
 		qp->s_size = init_attr->cap.max_send_wr + 1;
@@ -734,7 +734,7 @@ struct ib_qp *ipath_create_qp(struct ib_
 		ipath_reset_qp(qp);
 
 		/* Tell the core driver that the kernel SMA is present. */
-		if (qp->ibqp.qp_type == IB_QPT_SMI)
+		if (init_attr->qp_type == IB_QPT_SMI)
 			ipath_layer_set_verbs_flags(dev->dd,
 						    IPATH_VERBS_KERNEL_SMA);
 		break;
@@ -783,10 +783,10 @@ int ipath_destroy_qp(struct ib_qp *ibqp)
 
 	/* Make sure the QP isn't on the timeout list. */
 	spin_lock_irqsave(&dev->pending_lock, flags);
-	if (qp->timerwait.next != LIST_POISON1)
-		list_del(&qp->timerwait);
-	if (qp->piowait.next != LIST_POISON1)
-		list_del(&qp->piowait);
+	if (!list_empty(&qp->timerwait))
+		list_del_init(&qp->timerwait);
+	if (!list_empty(&qp->piowait))
+		list_del_init(&qp->piowait);
 	spin_unlock_irqrestore(&dev->pending_lock, flags);
 
 	/*
@@ -855,10 +855,10 @@ void ipath_sqerror_qp(struct ipath_qp *q
 
 	spin_lock(&dev->pending_lock);
 	/* XXX What if its already removed by the timeout code? */
-	if (qp->timerwait.next != LIST_POISON1)
-		list_del(&qp->timerwait);
-	if (qp->piowait.next != LIST_POISON1)
-		list_del(&qp->piowait);
+	if (!list_empty(&qp->timerwait))
+		list_del_init(&qp->timerwait);
+	if (!list_empty(&qp->piowait))
+		list_del_init(&qp->piowait);
 	spin_unlock(&dev->pending_lock);
 
 	ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1);
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c
index a4055ca..493b182 100644
--- a/drivers/infiniband/hw/ipath/ipath_rc.c
+++ b/drivers/infiniband/hw/ipath/ipath_rc.c
@@ -57,7 +57,7 @@ static void ipath_init_restart(struct ip
 	qp->s_len = wqe->length - len;
 	dev = to_idev(qp->ibqp.device);
 	spin_lock(&dev->pending_lock);
-	if (qp->timerwait.next == LIST_POISON1)
+	if (list_empty(&qp->timerwait))
 		list_add_tail(&qp->timerwait,
 			      &dev->pending[dev->pending_index]);
 	spin_unlock(&dev->pending_lock);
@@ -356,7 +356,7 @@ static inline int ipath_make_rc_req(stru
 		if ((int)(qp->s_psn - qp->s_next_psn) > 0)
 			qp->s_next_psn = qp->s_psn;
 		spin_lock(&dev->pending_lock);
-		if (qp->timerwait.next == LIST_POISON1)
+		if (list_empty(&qp->timerwait))
 			list_add_tail(&qp->timerwait,
 				      &dev->pending[dev->pending_index]);
 		spin_unlock(&dev->pending_lock);
@@ -726,8 +726,8 @@ void ipath_restart_rc(struct ipath_qp *q
 	 */
 	dev = to_idev(qp->ibqp.device);
 	spin_lock(&dev->pending_lock);
-	if (qp->timerwait.next != LIST_POISON1)
-		list_del(&qp->timerwait);
+	if (!list_empty(&qp->timerwait))
+		list_del_init(&qp->timerwait);
 	spin_unlock(&dev->pending_lock);
 
 	if (wqe->wr.opcode == IB_WR_RDMA_READ)
@@ -886,8 +886,8 @@ static int do_rc_ack(struct ipath_qp *qp
 	 * just won't find anything to restart if we ACK everything.
 	 */
 	spin_lock(&dev->pending_lock);
-	if (qp->timerwait.next != LIST_POISON1)
-		list_del(&qp->timerwait);
+	if (!list_empty(&qp->timerwait))
+		list_del_init(&qp->timerwait);
 	spin_unlock(&dev->pending_lock);
 
 	/*
@@ -1194,8 +1194,7 @@ static inline void ipath_rc_rcv_resp(str
 		     IB_WR_RDMA_READ))
 		goto ack_done;
 	spin_lock(&dev->pending_lock);
-	if (qp->s_rnr_timeout == 0 &&
-	    qp->timerwait.next != LIST_POISON1)
+	if (qp->s_rnr_timeout == 0 && !list_empty(&qp->timerwait))
 		list_move_tail(&qp->timerwait,
 			       &dev->pending[dev->pending_index]);
 	spin_unlock(&dev->pending_lock);
diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c
index eb81424..d38f4f3 100644
--- a/drivers/infiniband/hw/ipath/ipath_ruc.c
+++ b/drivers/infiniband/hw/ipath/ipath_ruc.c
@@ -435,7 +435,7 @@ void ipath_no_bufs_available(struct ipat
 	unsigned long flags;
 
 	spin_lock_irqsave(&dev->pending_lock, flags);
-	if (qp->piowait.next == LIST_POISON1)
+	if (list_empty(&qp->piowait))
 		list_add_tail(&qp->piowait, &dev->piowait);
 	spin_unlock_irqrestore(&dev->pending_lock, flags);
 	/*
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
index cb9e387..28fdbda 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
@@ -464,7 +464,7 @@ static void ipath_ib_timer(void *arg)
 	last = &dev->pending[dev->pending_index];
 	while (!list_empty(last)) {
 		qp = list_entry(last->next, struct ipath_qp, timerwait);
-		list_del(&qp->timerwait);
+		list_del_init(&qp->timerwait);
 		qp->timer_next = resend;
 		resend = qp;
 		atomic_inc(&qp->refcount);
@@ -474,7 +474,7 @@ static void ipath_ib_timer(void *arg)
 		qp = list_entry(last->next, struct ipath_qp, timerwait);
 		if (--qp->s_rnr_timeout == 0) {
 			do {
-				list_del(&qp->timerwait);
+				list_del_init(&qp->timerwait);
 				tasklet_hi_schedule(&qp->s_task);
 				if (list_empty(last))
 					break;
@@ -554,7 +554,7 @@ static int ipath_ib_piobufavail(void *ar
 	while (!list_empty(&dev->piowait)) {
 		qp = list_entry(dev->piowait.next, struct ipath_qp,
 				piowait);
-		list_del(&qp->piowait);
+		list_del_init(&qp->piowait);
 		tasklet_hi_schedule(&qp->s_task);
 	}
 	spin_unlock_irqrestore(&dev->pending_lock, flags);
@@ -951,6 +951,7 @@ static void *ipath_register_ib_device(in
 	idev->dd = dd;
 
 	strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX);
+	dev->owner = THIS_MODULE;
 	dev->node_guid = ipath_layer_get_guid(dd);
 	dev->uverbs_abi_ver = IPATH_UVERBS_ABI_VERSION;
 	dev->uverbs_cmd_mask =

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

* [git pull] Please pull infiniband.git
@ 2006-05-18 19:33 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-05-18 19:33 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, openib-general

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

The changes and patch are:

Ishai Rabinovitz:
      IB/srp: Complete correct SCSI commands on device reset

Michael S. Tsirkin:
      IB/mthca: Fix posting lists of 256 receive requests for Tavor

Roland Dreier:
      IB/mthca: Make fw_cmd_doorbell default to 0
      IB/srp: Don't wait for disconnection if sending DREQ fails
      IB/srp: Get rid of extra scsi_host_put()s if reconnection fails
      IB/uverbs: Don't leak ref to mm on error path

 drivers/infiniband/core/uverbs_mem.c    |    4 +++-
 drivers/infiniband/hw/mthca/mthca_cmd.c |    2 +-
 drivers/infiniband/hw/mthca/mthca_qp.c  |   35 ++++++++++++++++---------------
 drivers/infiniband/ulp/srp/ib_srp.c     |   10 ++++-----
 4 files changed, 27 insertions(+), 24 deletions(-)


diff --git a/drivers/infiniband/core/uverbs_mem.c b/drivers/infiniband/core/uverbs_mem.c
index 36a32c3..efe147d 100644
--- a/drivers/infiniband/core/uverbs_mem.c
+++ b/drivers/infiniband/core/uverbs_mem.c
@@ -211,8 +211,10 @@ void ib_umem_release_on_close(struct ib_
 	 */
 
 	work = kmalloc(sizeof *work, GFP_KERNEL);
-	if (!work)
+	if (!work) {
+		mmput(mm);
 		return;
+	}
 
 	INIT_WORK(&work->work, ib_umem_account, work);
 	work->mm   = mm;
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c
index 1985b5d..798e13e 100644
--- a/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -182,7 +182,7 @@ struct mthca_cmd_context {
 	u8                status;
 };
 
-static int fw_cmd_doorbell = 1;
+static int fw_cmd_doorbell = 0;
 module_param(fw_cmd_doorbell, int, 0644);
 MODULE_PARM_DESC(fw_cmd_doorbell, "post FW commands through doorbell page if nonzero "
 		 "(and supported by FW)");
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index 19765f6..07c13be 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -1727,23 +1727,7 @@ int mthca_tavor_post_receive(struct ib_q
 
 	ind = qp->rq.next_ind;
 
-	for (nreq = 0; wr; ++nreq, wr = wr->next) {
-		if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
-			nreq = 0;
-
-			doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
-			doorbell[1] = cpu_to_be32(qp->qpn << 8);
-
-			wmb();
-
-			mthca_write64(doorbell,
-				      dev->kar + MTHCA_RECEIVE_DOORBELL,
-				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
-
-			qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
-			size0 = 0;
-		}
-
+	for (nreq = 0; wr; wr = wr->next) {
 		if (mthca_wq_overflow(&qp->rq, nreq, qp->ibqp.recv_cq)) {
 			mthca_err(dev, "RQ %06x full (%u head, %u tail,"
 					" %d max, %d nreq)\n", qp->qpn,
@@ -1797,6 +1781,23 @@ int mthca_tavor_post_receive(struct ib_q
 		++ind;
 		if (unlikely(ind >= qp->rq.max))
 			ind -= qp->rq.max;
+
+		++nreq;
+		if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
+			nreq = 0;
+
+			doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
+			doorbell[1] = cpu_to_be32(qp->qpn << 8);
+
+			wmb();
+
+			mthca_write64(doorbell,
+				      dev->kar + MTHCA_RECEIVE_DOORBELL,
+				      MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
+
+			qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
+			size0 = 0;
+		}
 	}
 
 out:
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index c32ce43..9cbdffa 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -340,7 +340,10 @@ static void srp_disconnect_target(struct
 	/* XXX should send SRP_I_LOGOUT request */
 
 	init_completion(&target->done);
-	ib_send_cm_dreq(target->cm_id, NULL, 0);
+	if (ib_send_cm_dreq(target->cm_id, NULL, 0)) {
+		printk(KERN_DEBUG PFX "Sending CM DREQ failed\n");
+		return;
+	}
 	wait_for_completion(&target->done);
 }
 
@@ -351,7 +354,6 @@ static void srp_remove_work(void *target
 	spin_lock_irq(target->scsi_host->host_lock);
 	if (target->state != SRP_TARGET_DEAD) {
 		spin_unlock_irq(target->scsi_host->host_lock);
-		scsi_host_put(target->scsi_host);
 		return;
 	}
 	target->state = SRP_TARGET_REMOVED;
@@ -365,8 +367,6 @@ static void srp_remove_work(void *target
 	ib_destroy_cm_id(target->cm_id);
 	srp_free_target_ib(target);
 	scsi_host_put(target->scsi_host);
-	/* And another put to really free the target port... */
-	scsi_host_put(target->scsi_host);
 }
 
 static int srp_connect_target(struct srp_target_port *target)
@@ -1241,7 +1241,7 @@ static int srp_reset_device(struct scsi_
 	list_for_each_entry_safe(req, tmp, &target->req_queue, list)
 		if (req->scmnd->device == scmnd->device) {
 			req->scmnd->result = DID_RESET << 16;
-			scmnd->scsi_done(scmnd);
+			req->scmnd->scsi_done(req->scmnd);
 			srp_remove_req(target, req);
 		}
 

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

* [git pull] Please pull infiniband.git
@ 2006-05-12 22:07 Roland Dreier
  0 siblings, 0 replies; 223+ messages in thread
From: Roland Dreier @ 2006-05-12 22:07 UTC (permalink / raw)
  To: torvalds; +Cc: openib-general, linux-kernel

Linus, please pull from

    master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

This tree is also available from kernel.org mirrors at:

    git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git for-linus

The changes and patch are:

Roland Dreier:
      IB/ipath: Properly terminate PCI ID table

Sean Hefty:
      IB: refcount race fixes

 drivers/infiniband/core/cm.c               |   12 ++++---
 drivers/infiniband/core/mad.c              |   47 +++++++++++++++-------------
 drivers/infiniband/core/mad_priv.h         |    5 ++-
 drivers/infiniband/core/mad_rmpp.c         |   20 ++++++------
 drivers/infiniband/core/ucm.c              |   12 ++++---
 drivers/infiniband/hw/ipath/ipath_driver.c |    7 ++--
 6 files changed, 55 insertions(+), 48 deletions(-)


diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 7cfedb8..86fee43 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -34,6 +34,8 @@
  *
  * $Id: cm.c 2821 2005-07-08 17:07:28Z sean.hefty $
  */
+
+#include <linux/completion.h>
 #include <linux/dma-mapping.h>
 #include <linux/err.h>
 #include <linux/idr.h>
@@ -122,7 +124,7 @@ struct cm_id_private {
 	struct rb_node service_node;
 	struct rb_node sidr_id_node;
 	spinlock_t lock;	/* Do not acquire inside cm.lock */
-	wait_queue_head_t wait;
+	struct completion comp;
 	atomic_t refcount;
 
 	struct ib_mad_send_buf *msg;
@@ -159,7 +161,7 @@ static void cm_work_handler(void *data);
 static inline void cm_deref_id(struct cm_id_private *cm_id_priv)
 {
 	if (atomic_dec_and_test(&cm_id_priv->refcount))
-		wake_up(&cm_id_priv->wait);
+		complete(&cm_id_priv->comp);
 }
 
 static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
@@ -559,7 +561,7 @@ struct ib_cm_id *ib_create_cm_id(struct 
 		goto error;
 
 	spin_lock_init(&cm_id_priv->lock);
-	init_waitqueue_head(&cm_id_priv->wait);
+	init_completion(&cm_id_priv->comp);
 	INIT_LIST_HEAD(&cm_id_priv->work_list);
 	atomic_set(&cm_id_priv->work_count, -1);
 	atomic_set(&cm_id_priv->refcount, 1);
@@ -724,8 +726,8 @@ retest:
 	}
 
 	cm_free_id(cm_id->local_id);
-	atomic_dec(&cm_id_priv->refcount);
-	wait_event(cm_id_priv->wait, !atomic_read(&cm_id_priv->refcount));
+	cm_deref_id(cm_id_priv);
+	wait_for_completion(&cm_id_priv->comp);
 	while ((work = cm_dequeue_work(cm_id_priv)) != NULL)
 		cm_free_work(work);
 	if (cm_id_priv->private_data && cm_id_priv->private_data_len)
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index 469b692..5ad41a6 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -352,7 +352,7 @@ struct ib_mad_agent *ib_register_mad_age
 	INIT_WORK(&mad_agent_priv->local_work, local_completions,
 		   mad_agent_priv);
 	atomic_set(&mad_agent_priv->refcount, 1);
-	init_waitqueue_head(&mad_agent_priv->wait);
+	init_completion(&mad_agent_priv->comp);
 
 	return &mad_agent_priv->agent;
 
@@ -467,7 +467,7 @@ struct ib_mad_agent *ib_register_mad_sno
 	mad_snoop_priv->agent.qp = port_priv->qp_info[qpn].qp;
 	mad_snoop_priv->agent.port_num = port_num;
 	mad_snoop_priv->mad_snoop_flags = mad_snoop_flags;
-	init_waitqueue_head(&mad_snoop_priv->wait);
+	init_completion(&mad_snoop_priv->comp);
 	mad_snoop_priv->snoop_index = register_snoop_agent(
 						&port_priv->qp_info[qpn],
 						mad_snoop_priv);
@@ -486,6 +486,18 @@ error1:
 }
 EXPORT_SYMBOL(ib_register_mad_snoop);
 
+static inline void deref_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
+{
+	if (atomic_dec_and_test(&mad_agent_priv->refcount))
+		complete(&mad_agent_priv->comp);
+}
+
+static inline void deref_snoop_agent(struct ib_mad_snoop_private *mad_snoop_priv)
+{
+	if (atomic_dec_and_test(&mad_snoop_priv->refcount))
+		complete(&mad_snoop_priv->comp);
+}
+
 static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
 {
 	struct ib_mad_port_private *port_priv;
@@ -509,9 +521,8 @@ static void unregister_mad_agent(struct 
 	flush_workqueue(port_priv->wq);
 	ib_cancel_rmpp_recvs(mad_agent_priv);
 
-	atomic_dec(&mad_agent_priv->refcount);
-	wait_event(mad_agent_priv->wait,
-		   !atomic_read(&mad_agent_priv->refcount));
+	deref_mad_agent(mad_agent_priv);
+	wait_for_completion(&mad_agent_priv->comp);
 
 	kfree(mad_agent_priv->reg_req);
 	ib_dereg_mr(mad_agent_priv->agent.mr);
@@ -529,9 +540,8 @@ static void unregister_mad_snoop(struct 
 	atomic_dec(&qp_info->snoop_count);
 	spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
 
-	atomic_dec(&mad_snoop_priv->refcount);
-	wait_event(mad_snoop_priv->wait,
-		   !atomic_read(&mad_snoop_priv->refcount));
+	deref_snoop_agent(mad_snoop_priv);
+	wait_for_completion(&mad_snoop_priv->comp);
 
 	kfree(mad_snoop_priv);
 }
@@ -600,8 +610,7 @@ static void snoop_send(struct ib_mad_qp_
 		spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
 		mad_snoop_priv->agent.snoop_handler(&mad_snoop_priv->agent,
 						    send_buf, mad_send_wc);
-		if (atomic_dec_and_test(&mad_snoop_priv->refcount))
-			wake_up(&mad_snoop_priv->wait);
+		deref_snoop_agent(mad_snoop_priv);
 		spin_lock_irqsave(&qp_info->snoop_lock, flags);
 	}
 	spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
@@ -626,8 +635,7 @@ static void snoop_recv(struct ib_mad_qp_
 		spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
 		mad_snoop_priv->agent.recv_handler(&mad_snoop_priv->agent,
 						   mad_recv_wc);
-		if (atomic_dec_and_test(&mad_snoop_priv->refcount))
-			wake_up(&mad_snoop_priv->wait);
+		deref_snoop_agent(mad_snoop_priv);
 		spin_lock_irqsave(&qp_info->snoop_lock, flags);
 	}
 	spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
@@ -968,8 +976,7 @@ void ib_free_send_mad(struct ib_mad_send
 
 	free_send_rmpp_list(mad_send_wr);
 	kfree(send_buf->mad);
-	if (atomic_dec_and_test(&mad_agent_priv->refcount))
-		wake_up(&mad_agent_priv->wait);
+	deref_mad_agent(mad_agent_priv);
 }
 EXPORT_SYMBOL(ib_free_send_mad);
 
@@ -1757,8 +1764,7 @@ static void ib_mad_complete_recv(struct 
 		mad_recv_wc = ib_process_rmpp_recv_wc(mad_agent_priv,
 						      mad_recv_wc);
 		if (!mad_recv_wc) {
-			if (atomic_dec_and_test(&mad_agent_priv->refcount))
-				wake_up(&mad_agent_priv->wait);
+			deref_mad_agent(mad_agent_priv);
 			return;
 		}
 	}
@@ -1770,8 +1776,7 @@ static void ib_mad_complete_recv(struct 
 		if (!mad_send_wr) {
 			spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
 			ib_free_recv_mad(mad_recv_wc);
-			if (atomic_dec_and_test(&mad_agent_priv->refcount))
-				wake_up(&mad_agent_priv->wait);
+			deref_mad_agent(mad_agent_priv);
 			return;
 		}
 		ib_mark_mad_done(mad_send_wr);
@@ -1790,8 +1795,7 @@ static void ib_mad_complete_recv(struct 
 	} else {
 		mad_agent_priv->agent.recv_handler(&mad_agent_priv->agent,
 						   mad_recv_wc);
-		if (atomic_dec_and_test(&mad_agent_priv->refcount))
-			wake_up(&mad_agent_priv->wait);
+		deref_mad_agent(mad_agent_priv);
 	}
 }
 
@@ -2021,8 +2025,7 @@ void ib_mad_complete_send_wr(struct ib_m
 						   mad_send_wc);
 
 	/* Release reference on agent taken when sending */
-	if (atomic_dec_and_test(&mad_agent_priv->refcount))
-		wake_up(&mad_agent_priv->wait);
+	deref_mad_agent(mad_agent_priv);
 	return;
 done:
 	spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
diff --git a/drivers/infiniband/core/mad_priv.h b/drivers/infiniband/core/mad_priv.h
index 6c9c133..b4fa28d 100644
--- a/drivers/infiniband/core/mad_priv.h
+++ b/drivers/infiniband/core/mad_priv.h
@@ -37,6 +37,7 @@
 #ifndef __IB_MAD_PRIV_H__
 #define __IB_MAD_PRIV_H__
 
+#include <linux/completion.h>
 #include <linux/pci.h>
 #include <linux/kthread.h>
 #include <linux/workqueue.h>
@@ -108,7 +109,7 @@ struct ib_mad_agent_private {
 	struct list_head rmpp_list;
 
 	atomic_t refcount;
-	wait_queue_head_t wait;
+	struct completion comp;
 };
 
 struct ib_mad_snoop_private {
@@ -117,7 +118,7 @@ struct ib_mad_snoop_private {
 	int snoop_index;
 	int mad_snoop_flags;
 	atomic_t refcount;
-	wait_queue_head_t wait;
+	struct completion comp;
 };
 
 struct ib_mad_send_wr_private {
diff --git a/drivers/infiniband/core/mad_rmpp.c b/drivers/infiniband/core/mad_rmpp.c
index dfd4e58..d4704e0 100644
--- a/drivers/infiniband/core/mad_rmpp.c
+++ b/drivers/infiniband/core/mad_rmpp.c
@@ -49,7 +49,7 @@ struct mad_rmpp_recv {
 	struct list_head list;
 	struct work_struct timeout_work;
 	struct work_struct cleanup_work;
-	wait_queue_head_t wait;
+	struct completion comp;
 	enum rmpp_state state;
 	spinlock_t lock;
 	atomic_t refcount;
@@ -69,10 +69,16 @@ struct mad_rmpp_recv {
 	u8 method;
 };
 
+static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
+{
+	if (atomic_dec_and_test(&rmpp_recv->refcount))
+		complete(&rmpp_recv->comp);
+}
+
 static void destroy_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
 {
-	atomic_dec(&rmpp_recv->refcount);
-	wait_event(rmpp_recv->wait, !atomic_read(&rmpp_recv->refcount));
+	deref_rmpp_recv(rmpp_recv);
+	wait_for_completion(&rmpp_recv->comp);
 	ib_destroy_ah(rmpp_recv->ah);
 	kfree(rmpp_recv);
 }
@@ -253,7 +259,7 @@ create_rmpp_recv(struct ib_mad_agent_pri
 		goto error;
 
 	rmpp_recv->agent = agent;
-	init_waitqueue_head(&rmpp_recv->wait);
+	init_completion(&rmpp_recv->comp);
 	INIT_WORK(&rmpp_recv->timeout_work, recv_timeout_handler, rmpp_recv);
 	INIT_WORK(&rmpp_recv->cleanup_work, recv_cleanup_handler, rmpp_recv);
 	spin_lock_init(&rmpp_recv->lock);
@@ -279,12 +285,6 @@ error:	kfree(rmpp_recv);
 	return NULL;
 }
 
-static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
-{
-	if (atomic_dec_and_test(&rmpp_recv->refcount))
-		wake_up(&rmpp_recv->wait);
-}
-
 static struct mad_rmpp_recv *
 find_rmpp_recv(struct ib_mad_agent_private *agent,
 	       struct ib_mad_recv_wc *mad_recv_wc)
diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c
index f6a0596..9164a09 100644
--- a/drivers/infiniband/core/ucm.c
+++ b/drivers/infiniband/core/ucm.c
@@ -32,6 +32,8 @@
  *
  * $Id: ucm.c 2594 2005-06-13 19:46:02Z libor $
  */
+
+#include <linux/completion.h>
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/module.h>
@@ -72,7 +74,7 @@ struct ib_ucm_file {
 
 struct ib_ucm_context {
 	int                 id;
-	wait_queue_head_t   wait;
+	struct completion   comp;
 	atomic_t            ref;
 	int		    events_reported;
 
@@ -138,7 +140,7 @@ static struct ib_ucm_context *ib_ucm_ctx
 static void ib_ucm_ctx_put(struct ib_ucm_context *ctx)
 {
 	if (atomic_dec_and_test(&ctx->ref))
-		wake_up(&ctx->wait);
+		complete(&ctx->comp);
 }
 
 static inline int ib_ucm_new_cm_id(int event)
@@ -178,7 +180,7 @@ static struct ib_ucm_context *ib_ucm_ctx
 		return NULL;
 
 	atomic_set(&ctx->ref, 1);
-	init_waitqueue_head(&ctx->wait);
+	init_completion(&ctx->comp);
 	ctx->file = file;
 	INIT_LIST_HEAD(&ctx->events);
 
@@ -586,8 +588,8 @@ static ssize_t ib_ucm_destroy_id(struct 
 	if (IS_ERR(ctx))
 		return PTR_ERR(ctx);
 
-	atomic_dec(&ctx->ref);
-	wait_event(ctx->wait, !atomic_read(&ctx->ref));
+	ib_ucm_ctx_put(ctx);
+	wait_for_completion(&ctx->comp);
 
 	/* No new events will be generated after destroying the cm_id. */
 	ib_destroy_cm_id(ctx->cm_id);
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index 398add4..3697eda 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -116,10 +116,9 @@ #define PCI_DEVICE_ID_INFINIPATH_HT 0xd
 #define PCI_DEVICE_ID_INFINIPATH_PE800 0x10
 
 static const struct pci_device_id ipath_pci_tbl[] = {
-	{PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE,
-		    PCI_DEVICE_ID_INFINIPATH_HT)},
-	{PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE,
-		    PCI_DEVICE_ID_INFINIPATH_PE800)},
+	{ PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE, PCI_DEVICE_ID_INFINIPATH_HT) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE, PCI_DEVICE_ID_INFINIPATH_PE800) },
+	{ 0, }
 };
 
 MODULE_DEVICE_TABLE(pci, ipath_pci_tbl);

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

end of thread, other threads:[~2015-04-22 17:08 UTC | newest]

Thread overview: 223+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-01  6:36 [GIT PULL] please pull infiniband.git Roland Dreier
  -- strict thread matches above, loose matches on Subject: below --
2015-04-22 17:08 Roland Dreier
2015-04-02 17:27 Roland Dreier
2015-02-20 17:08 Roland Dreier
2015-02-06 21:19 Roland Dreier
2015-02-07 15:58 ` Yann Droneaud
2015-02-03 21:42 Roland Dreier
2014-12-19  0:03 Roland Dreier
2014-10-16 22:52 Roland Dreier
2014-10-20 23:28 ` Doug Ledford
2014-11-02 20:06 ` Dave Airlie
2014-11-03  7:15   ` Eli Cohen
2014-11-03  7:58   ` Sagi Grimberg
2014-09-23 21:58 Roland Dreier
2014-09-27 21:19 ` Or Gerlitz
2014-08-14 16:05 Roland Dreier
2014-07-18 20:40 Roland Dreier
2014-06-10 17:14 Roland Dreier
2014-05-02  0:09 Roland Dreier
2014-04-18 18:40 Roland Dreier
2014-04-03 15:54 Roland Dreier
2014-02-14 17:51 Roland Dreier
2014-01-24 19:43 Roland Dreier
2013-12-23 17:24 Roland Dreier
2013-11-18 18:40 Roland Dreier
2013-11-19 17:25 ` Or Gerlitz
2013-10-22 17:22 Roland Dreier
2013-10-14 18:16 Roland Dreier
2013-10-15  0:52 ` Linus Torvalds
2013-10-15 17:48   ` Roland Dreier
2013-09-04 17:03 Roland Dreier
2013-09-05  0:31 ` Stephen Rothwell
2013-09-05 16:42   ` Linus Torvalds
2013-09-05 16:43     ` David Miller
2013-08-02 16:12 Roland Dreier
2013-07-11 23:52 Roland Dreier
2013-07-09 17:36 Roland Dreier
2013-07-10 14:35 ` Sebastian Riemer
2013-07-10 14:38   ` Roland Dreier
2013-07-10 15:34     ` Bart Van Assche
2013-06-07 22:28 Roland Dreier
2013-05-08 21:20 Roland Dreier
2013-03-25 16:42 Roland Dreier
2013-04-05 15:56 ` David Woodhouse
2013-02-26 17:41 Roland Dreier
2013-02-07  1:15 Roland Dreier
2012-12-21 21:42 Roland Dreier
2012-12-11  5:59 Roland Dreier
2012-12-14  9:56 ` Roland Dreier
2012-12-14 15:36   ` Linus Torvalds
2012-12-14 23:57     ` Roland Dreier
2012-10-26 19:55 Roland Dreier
2012-10-05  2:20 Roland Dreier
2012-10-02 16:08 Roland Dreier
2012-09-17 15:57 Roland Dreier
2012-08-17 18:38 Roland Dreier
2012-07-23 16:17 Roland Dreier
2012-06-24 12:09 Roland Dreier
2012-06-25 14:11 ` Tziporet Koren
2012-05-21  1:14 Roland Dreier
2012-05-21  2:05 ` Stephen Rothwell
2012-05-21  2:35   ` Roland Dreier
2012-05-21  3:39     ` Stephen Rothwell
2012-05-21 16:07 ` Roland Dreier
2012-06-06 17:44 ` Roland Dreier
2012-04-26 17:39 Roland Dreier
2012-04-12 23:45 Roland Dreier
2012-04-11 20:07 Roland Dreier
2012-03-19 17:11 Roland Dreier
2012-03-26 21:04 ` Tziporet Koren
2012-03-26 21:13   ` Roland Dreier
2012-03-27 16:33     ` Tziporet Koren
2012-02-25  2:32 Roland Dreier
2012-02-07 17:34 Roland Dreier
2012-01-06 17:38 Roland Dreier
2011-12-19 17:39 Roland Dreier
2011-11-30 17:50 Roland Dreier
2011-11-04 18:26 Roland Dreier
2011-11-01 16:54 Roland Dreier
2011-08-18 15:54 Roland Dreier
2011-07-22 19:08 Roland Dreier
2011-06-21 16:18 Roland Dreier
2011-05-26 16:46 Roland Dreier
2011-05-19 18:17 Roland Dreier
2011-03-25 19:07 Roland Dreier
2011-03-23 17:47 Roland Dreier
2011-03-23 18:15 ` Roland Dreier
2011-03-15 18:01 Roland Dreier
2011-02-17 22:26 Roland Dreier
2011-02-03 18:05 Roland Dreier
2011-01-17 21:55 Roland Dreier
2011-01-25 16:23 ` Tziporet Koren
2011-01-11 18:38 Roland Dreier
2010-12-13 21:53 Roland Dreier
2010-12-02 18:57 Roland Dreier
2010-10-26 20:52 Roland Dreier
2010-10-26 23:17 ` Roland Dreier
2010-09-27 16:31 Roland Dreier
2010-09-08 21:45 Roland Dreier
2010-08-09 22:44 Roland Dreier
2010-08-05 21:37 [GIT PULL] Please " Roland Dreier
2010-07-08 16:12 [GIT PULL] please " Roland Dreier
2010-05-27 22:18 Roland Dreier
2010-05-25 16:58 Roland Dreier
2010-05-18  3:37 Roland Dreier
2010-04-09 16:13 Roland Dreier
2010-03-12 18:56 Roland Dreier
2010-03-02  7:56 Roland Dreier
2010-03-02 11:52 ` Tziporet Koren
2010-02-10 20:03 Roland Dreier
2010-01-07 19:30 Roland Dreier
2009-12-16  7:41 Roland Dreier
2009-10-28 18:07 Roland Dreier
2009-10-09 17:08 Roland Dreier
2009-09-24 19:45 Roland Dreier
2009-09-11  4:23 Roland Dreier
2009-07-14 18:48 Roland Dreier
2009-06-23 17:39 Roland Dreier
2009-06-14 20:47 Roland Dreier
2009-05-13 22:18 Roland Dreier
2009-04-28 23:03 Roland Dreier
2009-04-09 21:58 Roland Dreier
2009-03-25  4:05 Roland Dreier
2009-01-16 23:07 Roland Dreier
2009-01-13  3:40 Roland Dreier
2008-12-30 23:38 Roland Dreier
2008-12-25 15:21 Roland Dreier
2008-12-01 18:16 Roland Dreier
2008-11-04 21:37 Roland Dreier
2008-10-23  4:37 Roland Dreier
2008-10-10  0:48 Roland Dreier
2008-09-17 16:40 Roland Dreier
2008-08-19 22:03 Roland Dreier
2008-08-12 20:55 Roland Dreier
2008-08-07 21:15 Roland Dreier
2008-07-26 21:02 Roland Dreier
2008-07-24 15:41 Roland Dreier
2008-07-15  6:51 Roland Dreier
2008-07-08 21:41 Roland Dreier
2008-06-23 19:23 Roland Dreier
2008-06-18 22:38 Roland Dreier
2008-06-09 20:10 Roland Dreier
2008-06-06 18:26 Roland Dreier
2008-05-23 17:57 Roland Dreier
2008-05-07 19:17 Roland Dreier
2008-05-05 23:00 Roland Dreier
2008-05-01  3:46 Roland Dreier
2008-04-29 20:57 Roland Dreier
2008-04-22  1:26 Roland Dreier
2008-04-17 14:53 Roland Dreier
2008-04-19  8:16 ` Ingo Molnar
2008-03-21 21:02 Roland Dreier
2008-03-13 20:15 Roland Dreier
2008-03-11  4:33 Roland Dreier
2008-02-29 22:06 Roland Dreier
2008-02-27  0:27 Roland Dreier
2008-02-19 18:51 Roland Dreier
2008-02-18 20:35 Roland Dreier
2008-02-14 23:31 Roland Dreier
2008-02-11 22:25 Roland Dreier
2008-02-08 23:16 Roland Dreier
2008-02-05  4:49 Roland Dreier
2008-01-16 22:46 Roland Dreier
2008-01-08 20:25 Roland Dreier
2007-12-13 17:39 Roland Dreier
2007-12-01  4:03 Roland Dreier
2007-11-27  6:21 Roland Dreier
2007-11-14 16:23 Roland Dreier
2007-10-30 22:17 Roland Dreier
2007-10-23 16:30 Roland Dreier
2007-09-23 20:06 Roland Dreier
2007-07-30 20:18 Roland Dreier
2007-07-21  4:56 Roland Dreier
2007-07-18 22:52 Roland Dreier
2007-07-12 23:07 Roland Dreier
2007-07-03  3:50 Roland Dreier
2007-06-22 16:26 Roland Dreier
2007-06-18 15:49 Roland Dreier
2007-06-08 14:22 Roland Dreier
2007-05-29 23:20 Roland Dreier
2007-05-25 22:06 Roland Dreier
2007-05-21 20:51 Roland Dreier
2007-05-14 21:18 Roland Dreier
2007-05-09  1:06 Roland Dreier
2007-05-07  4:19 Roland Dreier
2007-04-26 18:42 Roland Dreier
2007-04-16 21:16 Roland Dreier
2007-04-12 17:52 Roland Dreier
2007-04-10 17:43 Roland Dreier
2007-03-28 17:25 Roland Dreier
2007-03-22 21:39 Roland Dreier
2007-03-08 23:50 Roland Dreier
2007-02-26 21:05 Roland Dreier
2007-02-16 23:48 Roland Dreier
2007-02-13  0:18 Roland Dreier
2007-02-05 10:15 Roland Dreier
2007-01-23 15:10 Roland Dreier
2007-01-09 22:18 Roland Dreier
2007-01-08  4:29 Roland Dreier
2006-12-16  4:57 Roland Dreier
2006-11-29 23:37 Roland Dreier
2006-11-20 18:44 Roland Dreier
2006-11-13 17:42 Roland Dreier
2006-11-02 22:28 Roland Dreier
2006-10-17 21:44 Roland Dreier
2006-10-10 21:03 Roland Dreier
2006-10-02 21:57 Roland Dreier
2006-09-28 18:20 [GIT PULL] Please " Roland Dreier
2006-09-22 22:37 [GIT PULL] please " Roland Dreier
2006-09-14 20:59 Roland Dreier
2006-09-01  0:29 Roland Dreier
2006-08-23 23:25 Roland Dreier
2006-08-24  1:09 ` Greg KH
2006-08-03 18:07 Roland Dreier
2006-07-24 16:50 Roland Dreier
2006-06-22 16:22 Roland Dreier
2006-06-18 11:49 Roland Dreier
2006-06-13 18:19 [git pull] " Roland Dreier
2006-06-05 17:21 Roland Dreier
2006-05-26  0:09 Roland Dreier
2006-05-23 21:05 Roland Dreier
2006-05-18 19:33 [git pull] Please " Roland Dreier
2006-05-12 22:07 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).