Patch "RDMA/qedr: Dispatch port active event from qedr_add" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
RDMA/qedr: Dispatch port active event from qedr_add
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rdma-qedr-dispatch-port-active-event-from-qedr_add.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jun 15 16:35:05 CEST 2017
From: Ram Amrani <[email protected]>
Date: Tue, 24 Jan 2017 13:51:43 +0200
Subject: RDMA/qedr: Dispatch port active event from qedr_add
From: Ram Amrani <[email protected]>
[ Upstream commit f449c7a2d822c2d81b5bcb2c50eec80796766726 ]
Relying on qede to trigger qedr on startup is problematic. When probing both if qedr loads slowly then qede can assume qedr is missing and not trigger it. This patch adds a triggering from qedr and protects against a race via an atomic bit.
--- drivers/infiniband/hw/qedr/main.c | 20 ++++++++++++++------ drivers/infiniband/hw/qedr/qedr.h | 5 +++++ 2 files changed, 19 insertions(+), 6 deletions(-)
drivers/infiniband/hw/qedr/main.c +14 -6
@@ -792,6 +792,9 @@ static struct qedr_dev *qedr_add(structif (device_create_file (&dev->ibdev.dev, qedr_attributes[i])) goto sysfs_err; +if (!test_and_set_bit (QEDR_ENET_STATE_BIT , &dev->enet_state)) +qedr_ib_dispatch_event (dev,QEDR_PORT ,IB_EVENT_PORT_ACTIVE ); +DP_DEBUG (dev,QEDR_MSG_INIT ,"qedr driver loaded successfully\n" );return dev;
@@ -824,11 +827,10 @@ static void qedr_remove(struct qedr_devib_dealloc_device (&dev->ibdev); } -static int qedr_close (struct qedr_dev *dev) +static void qedr_close (struct qedr_dev *dev) { -qedr_ib_dispatch_event (dev,1 ,IB_EVENT_PORT_ERR ); - -return 0 ; +if (test_and_clear_bit (QEDR_ENET_STATE_BIT , &dev->enet_state)) +qedr_ib_dispatch_event (dev,QEDR_PORT ,IB_EVENT_PORT_ERR ); }static void qedr_shutdown (struct qedr_dev *dev)
@@ -837,6 +839,12 @@ static void qedr_shutdown(struct qedr_deqedr_remove (dev); } +static void qedr_open (struct qedr_dev *dev) +{ +if (!test_and_set_bit (QEDR_ENET_STATE_BIT , &dev->enet_state)) +qedr_ib_dispatch_event (dev,QEDR_PORT ,IB_EVENT_PORT_ACTIVE ); +} +static void qedr_mac_address_change (struct qedr_dev *dev) {union ib_gid *sgid = &dev->sgid_tbl[0 ];
@@ -863,7 +871,7 @@ static void qedr_mac_address_change(struether_addr_copy (dev->gsi_ll2_mac_address, dev->ndev->dev_addr); -qedr_ib_dispatch_event (dev,1 ,IB_EVENT_GID_CHANGE ); +qedr_ib_dispatch_event (dev,QEDR_PORT ,IB_EVENT_GID_CHANGE );if (rc)DP_ERR (dev,"Error updating mac filter\n" );
@@ -877,7 +885,7 @@ static void qedr_notify(struct qedr_dev {switch (event) {case QEDE_UP : -qedr_ib_dispatch_event (dev,1 ,IB_EVENT_PORT_ACTIVE ); +qedr_open (dev);break ;case QEDE_DOWN :qedr_close (dev);
drivers/infiniband/hw/qedr/qedr.h +5 -0
@@ -113,6 +113,8 @@ struct qedr_device_attr {struct qed_rdma_events events; }; +#define QEDR_ENET_STATE_BIT (0) +struct qedr_dev {struct ib_device ibdev;struct qed_dev *cdev;
@@ -153,6 +155,8 @@ struct qedr_dev {struct qedr_cq *gsi_sqcq;struct qedr_cq *gsi_rqcq;struct qedr_qp *gsi_qp; + +unsigned long enet_state; };#define QEDR_MAX_SQ_PBL (0x8000)
@@ -188,6 +192,7 @@ struct qedr_dev {#define QEDR_ROCE_MAX_CNQ_SIZE (0x4000)#define QEDR_MAX_PORT (1) +#define QEDR_PORT (1)#define QEDR_UVERBS (CMD_NAME ) (1ull << IB_USER_VERBS_CMD_##CMD_NAME)
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/rdma-qedr-don-t-spam-dmesg-if-qp-is-in-error-state.patch queue-4.9/rdma-qedr-dispatch-port-active-event-from-qedr_add.patch queue-4.9/rdma-qedr-don-t-reset-qp-when-queues-aren-t-flushed.patch queue-4.9/rdma-qedr-fix-and-simplify-memory-leak-in-pd-alloc.patch queue-4.9/rdma-qedr-return-max-inline-data-in-qp-query-result.patch