Commit 7ce4de1c authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull rdma updates from Jason Gunthorpe:

 - Various minor code cleanups and fixes for hns, iser, cxgb4, hfi1,
   rxe, erdma, mana_ib

 - Prefetch supprot for rxe ODP

 - Remove memory window support from hns as new device FW is no longer
   support it

 - Remove qib, it is very old and obsolete now, Cornelis wishes to
   restructure the hfi1/qib shared layer

 - Fix a race in destroying CQs where we can still end up with work
   running because the work is cancled before the driver stops
   triggering it

 - Improve interaction with namespaces:
     * Follow the devlink namespace for newly spawned RDMA devices
     * Create iopoib net devces in the parent IB device's namespace
     * Allow CAP_NET_RAW checks to pass in user namespaces

 - A new flow control scheme for IB MADs to try and avoid queue
   overflows in the network

 - Fix 2G message sizes in bnxt_re

 - Optimize mkey layout for mlx5 DMABUF

 - New "DMA Handle" concept to allow controlling PCI TPH and steering
   tags

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (71 commits)
  RDMA/siw: Change maintainer email address
  RDMA/mana_ib: add support of multiple ports
  RDMA/mlx5: Refactor optional counters steering code
  RDMA/mlx5: Add DMAH support for reg_user_mr/reg_user_dmabuf_mr
  IB: Extend UVERBS_METHOD_REG_MR to get DMAH
  RDMA/mlx5: Add DMAH object support
  RDMA/core: Introduce a DMAH object and its alloc/free APIs
  IB/core: Add UVERBS_METHOD_REG_MR on the MR object
  net/mlx5: Add support for device steering tag
  net/mlx5: Expose IFC bits for TPH
  PCI/TPH: Expose pcie_tph_get_st_table_size()
  RDMA/mlx5: Fix incorrect MKEY masking
  RDMA/mlx5: Fix returned type from _mlx5r_umr_zap_mkey()
  RDMA/mlx5: remove redundant check on err on return expression
  RDMA/mana_ib: add additional port counters
  RDMA/mana_ib: Fix DSCP value in modify QP
  RDMA/efa: Add CQ with external memory support
  RDMA/core: Add umem "is_contiguous" and "start_dma_addr" helpers
  RDMA/uverbs: Add a common way to create CQ with umem
  RDMA/mlx5: Optimize DMABUF mkey page size
  ...
parents 2c8c9aae ee235923
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ Benjamin Poirier <benjamin.poirier@gmail.com> <bpoirier@suse.de>
Benjamin Tissoires <bentiss@kernel.org> <benjamin.tissoires@gmail.com>
Benjamin Tissoires <bentiss@kernel.org> <benjamin.tissoires@redhat.com>
Benno Lossin <lossin@kernel.org> <benno.lossin@proton.me>
Bernard Metzler <bernard.metzler@linux.dev> <bmt@zurich.ibm.com>
Bingwu Zhang <xtex@aosc.io> <xtexchooser@duck.com>
Bingwu Zhang <xtex@aosc.io> <xtex@xtexx.eu.org>
Bjorn Andersson <andersson@kernel.org> <bjorn@kryo.se>
+1 −7
Original line number Diff line number Diff line
@@ -20370,12 +20370,6 @@ S: Maintained
F:	drivers/firmware/qemu_fw_cfg.c
F:	include/uapi/linux/qemu_fw_cfg.h
QIB DRIVER
M:	Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
L:	linux-rdma@vger.kernel.org
S:	Supported
F:	drivers/infiniband/hw/qib/
QLOGIC QL41xxx FCOE DRIVER
M:	Saurav Kashyap <skashyap@marvell.com>
M:	Javed Hasan <jhasan@marvell.com>
@@ -23222,7 +23216,7 @@ S: Maintained
F:	drivers/leds/leds-net48xx.c
SOFT-IWARP DRIVER (siw)
M:	Bernard Metzler <bmt@zurich.ibm.com>
M:	Bernard Metzler <bernard.metzler@linux.dev>
L:	linux-rdma@vger.kernel.org
S:	Supported
F:	drivers/infiniband/sw/siw/
+0 −1
Original line number Diff line number Diff line
@@ -92,7 +92,6 @@ source "drivers/infiniband/hw/mlx5/Kconfig"
source "drivers/infiniband/hw/mthca/Kconfig"
source "drivers/infiniband/hw/ocrdma/Kconfig"
source "drivers/infiniband/hw/qedr/Kconfig"
source "drivers/infiniband/hw/qib/Kconfig"
source "drivers/infiniband/hw/usnic/Kconfig"
source "drivers/infiniband/hw/vmw_pvrdma/Kconfig"
source "drivers/infiniband/sw/rdmavt/Kconfig"
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ ib_umad-y := user_mad.o
ib_uverbs-y :=			uverbs_main.o uverbs_cmd.o uverbs_marshall.o \
				rdma_core.o uverbs_std_types.o uverbs_ioctl.o \
				uverbs_std_types_cq.o \
				uverbs_std_types_dmah.o \
				uverbs_std_types_flow_action.o uverbs_std_types_dm.o \
				uverbs_std_types_mr.o uverbs_std_types_counters.o \
				uverbs_uapi.o uverbs_std_types_device.o \
+41 −6
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@ struct cm_counter_attribute {
struct cm_port {
	struct cm_device *cm_dev;
	struct ib_mad_agent *mad_agent;
	struct ib_mad_agent *rep_agent;
	u32 port_num;
	atomic_long_t counters[CM_COUNTER_GROUPS][CM_ATTR_COUNT];
};
@@ -274,7 +275,8 @@ static inline void cm_deref_id(struct cm_id_private *cm_id_priv)
		complete(&cm_id_priv->comp);
}

static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv)
static struct ib_mad_send_buf *
cm_alloc_msg_agent(struct cm_id_private *cm_id_priv, bool rep_agent)
{
	struct ib_mad_agent *mad_agent;
	struct ib_mad_send_buf *m;
@@ -286,7 +288,8 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv)
		return ERR_PTR(-EINVAL);

	read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
	mad_agent = cm_id_priv->av.port->mad_agent;
	mad_agent = rep_agent ? cm_id_priv->av.port->rep_agent :
				cm_id_priv->av.port->mad_agent;
	if (!mad_agent) {
		m = ERR_PTR(-EINVAL);
		goto out;
@@ -315,6 +318,11 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv)
	return m;
}

static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv)
{
	return cm_alloc_msg_agent(cm_id_priv, false);
}

static void cm_free_msg(struct ib_mad_send_buf *msg)
{
	if (msg->ah)
@@ -323,13 +331,14 @@ static void cm_free_msg(struct ib_mad_send_buf *msg)
}

static struct ib_mad_send_buf *
cm_alloc_priv_msg(struct cm_id_private *cm_id_priv, enum ib_cm_state state)
cm_alloc_priv_msg_rep(struct cm_id_private *cm_id_priv, enum ib_cm_state state,
		      bool rep_agent)
{
	struct ib_mad_send_buf *msg;

	lockdep_assert_held(&cm_id_priv->lock);

	msg = cm_alloc_msg(cm_id_priv);
	msg = cm_alloc_msg_agent(cm_id_priv, rep_agent);
	if (IS_ERR(msg))
		return msg;

@@ -344,6 +353,12 @@ cm_alloc_priv_msg(struct cm_id_private *cm_id_priv, enum ib_cm_state state)
	return msg;
}

static struct ib_mad_send_buf *
cm_alloc_priv_msg(struct cm_id_private *cm_id_priv, enum ib_cm_state state)
{
	return cm_alloc_priv_msg_rep(cm_id_priv, state, false);
}

static void cm_free_priv_msg(struct ib_mad_send_buf *msg)
{
	struct cm_id_private *cm_id_priv = msg->context[0];
@@ -2295,7 +2310,7 @@ int ib_send_cm_rep(struct ib_cm_id *cm_id,
		goto out;
	}

	msg = cm_alloc_priv_msg(cm_id_priv, IB_CM_REP_SENT);
	msg = cm_alloc_priv_msg_rep(cm_id_priv, IB_CM_REP_SENT, true);
	if (IS_ERR(msg)) {
		ret = PTR_ERR(msg);
		goto out;
@@ -4380,9 +4395,22 @@ static int cm_add_one(struct ib_device *ib_device)
			goto error2;
		}

		port->rep_agent = ib_register_mad_agent(ib_device, i,
							IB_QPT_GSI,
							NULL,
							0,
							cm_send_handler,
							NULL,
							port,
							0);
		if (IS_ERR(port->rep_agent)) {
			ret = PTR_ERR(port->rep_agent);
			goto error3;
		}

		ret = ib_modify_port(ib_device, i, 0, &port_modify);
		if (ret)
			goto error3;
			goto error4;

		count++;
	}
@@ -4397,6 +4425,8 @@ static int cm_add_one(struct ib_device *ib_device)
	write_unlock_irqrestore(&cm.device_lock, flags);
	return 0;

error4:
	ib_unregister_mad_agent(port->rep_agent);
error3:
	ib_unregister_mad_agent(port->mad_agent);
error2:
@@ -4410,6 +4440,7 @@ static int cm_add_one(struct ib_device *ib_device)

		port = cm_dev->port[i-1];
		ib_modify_port(ib_device, port->port_num, 0, &port_modify);
		ib_unregister_mad_agent(port->rep_agent);
		ib_unregister_mad_agent(port->mad_agent);
		ib_port_unregister_client_groups(ib_device, i,
						 cm_counter_groups);
@@ -4439,12 +4470,14 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)

	rdma_for_each_port (ib_device, i) {
		struct ib_mad_agent *mad_agent;
		struct ib_mad_agent *rep_agent;

		if (!rdma_cap_ib_cm(ib_device, i))
			continue;

		port = cm_dev->port[i-1];
		mad_agent = port->mad_agent;
		rep_agent = port->rep_agent;
		ib_modify_port(ib_device, port->port_num, 0, &port_modify);
		/*
		 * We flush the queue here after the going_down set, this
@@ -4458,8 +4491,10 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
		 */
		write_lock(&cm_dev->mad_agent_lock);
		port->mad_agent = NULL;
		port->rep_agent = NULL;
		write_unlock(&cm_dev->mad_agent_lock);
		ib_unregister_mad_agent(mad_agent);
		ib_unregister_mad_agent(rep_agent);
		ib_port_unregister_client_groups(ib_device, i,
						 cm_counter_groups);
	}
Loading