EFA updates 2020-02-25
Subsystems (2)
PATCH v2 1/3 RDMA/efa: Unified getters/setters for device structs bitmask access
In reply to Gal PressmanUse unified macros for device structs access instead of open coding the shifts and masks over and over again.
--- .../infiniband/hw/efa/efa_admin_cmds_defs.h | 7 +- drivers/infiniband/hw/efa/efa_admin_defs.h | 4 +- drivers/infiniband/hw/efa/efa_com.c | 142 ++++++++---------- drivers/infiniband/hw/efa/efa_com_cmd.c | 29 ++-- drivers/infiniband/hw/efa/efa_common_defs.h | 13 +- drivers/infiniband/hw/efa/efa_regs_defs.h | 22 +-- 6 files changed, 93 insertions(+), 124 deletions(-)
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h +1 -6
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ /* -* Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved. +* Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved. */ #ifndef _EFA_ADMIN_CMDS_H_
@@ -801,21 +801,16 @@ struct efa_admin_mmio_req_read_less_resp {/* create_qp_cmd */ #define EFA_ADMIN_CREATE_QP_CMD_SQ_VIRT_MASK BIT(0) -#define EFA_ADMIN_CREATE_QP_CMD_RQ_VIRT_SHIFT 1#define EFA_ADMIN_CREATE_QP_CMD_RQ_VIRT_MASK BIT(1)/* reg_mr_cmd */ #define EFA_ADMIN_REG_MR_CMD_PHYS_PAGE_SIZE_SHIFT_MASK GENMASK(4, 0) -#define EFA_ADMIN_REG_MR_CMD_MEM_ADDR_PHY_MODE_EN_SHIFT 7#define EFA_ADMIN_REG_MR_CMD_MEM_ADDR_PHY_MODE_EN_MASK BIT(7)#define EFA_ADMIN_REG_MR_CMD_LOCAL_WRITE_ENABLE_MASK BIT(0) -#define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_SHIFT 2#define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_MASK BIT(2)/* create_cq_cmd */ -#define EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED_SHIFT 5#define EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED_MASK BIT(5) -#define EFA_ADMIN_CREATE_CQ_CMD_VIRT_SHIFT 6#define EFA_ADMIN_CREATE_CQ_CMD_VIRT_MASK BIT(6)#define EFA_ADMIN_CREATE_CQ_CMD_CQ_ENTRY_SIZE_WORDS_MASK GENMASK(4, 0)
drivers/infiniband/hw/efa/efa_admin_defs.h +1 -3
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ /* -* Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved. +* Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved. */ #ifndef _EFA_ADMIN_H_
@@ -121,9 +121,7 @@ struct efa_admin_aenq_entry {/* aq_common_desc */ #define EFA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK GENMASK(11, 0)#define EFA_ADMIN_AQ_COMMON_DESC_PHASE_MASK BIT(0) -#define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_SHIFT 1#define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_MASK BIT(1) -#define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_SHIFT 2#define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK BIT(2)/* acq_common_desc */
drivers/infiniband/hw/efa/efa_com.c +63 -79
314 lines not on this page · raw message
drivers/infiniband/hw/efa/efa_com_cmd.c +15 -14
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause /* -* Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved. +* Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved. */ #include "efa_com.h"
@@ -161,8 +161,9 @@ int efa_com_create_cq(struct efa_com_dev *edev,int err; create_cmd.aq_common_desc.opcode =EFA_ADMIN_CREATE_CQ ; - create_cmd.cq_caps_2 = (params->entry_size_in_bytes /4 ) & -EFA_ADMIN_CREATE_CQ_CMD_CQ_ENTRY_SIZE_WORDS_MASK ; +EFA_SET (&create_cmd.cq_caps_2, +EFA_ADMIN_CREATE_CQ_CMD_CQ_ENTRY_SIZE_WORDS , + params->entry_size_in_bytes /4 ); create_cmd.cq_depth = params->cq_depth; create_cmd.num_sub_cqs = params->num_sub_cqs; create_cmd.uar = params->uarn;
@@ -227,8 +228,8 @@ int efa_com_register_mr(struct efa_com_dev *edev, mr_cmd.aq_common_desc.opcode =EFA_ADMIN_REG_MR ; mr_cmd.pd = params->pd; mr_cmd.mr_length = params->mr_length_in_bytes; - mr_cmd.flags |= params->page_shift & -EFA_ADMIN_REG_MR_CMD_PHYS_PAGE_SIZE_SHIFT_MASK ; +EFA_SET (&mr_cmd.flags,EFA_ADMIN_REG_MR_CMD_PHYS_PAGE_SIZE_SHIFT , + params->page_shift); mr_cmd.iova = params->iova; mr_cmd.permissions = params->permissions;
@@ -242,11 +243,11 @@ int efa_com_register_mr(struct efa_com_dev *edev, params->pbl.pbl.address.mem_addr_low; mr_cmd.pbl.pbl.address.mem_addr_high = params->pbl.pbl.address.mem_addr_high; - mr_cmd.aq_common_desc.flags |= -EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_MASK ; +EFA_SET (&mr_cmd.aq_common_desc.flags, +EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA ,1 );if (params->indirect) - mr_cmd.aq_common_desc.flags |= -EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK ; +EFA_SET (&mr_cmd.aq_common_desc.flags, +EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT ,1 ); } err = efa_com_cmd_exec(aq,
@@ -386,9 +387,8 @@ static int efa_com_get_feature_ex(struct efa_com_dev *edev, get_cmd.aq_common_descriptor.opcode =EFA_ADMIN_GET_FEATURE ;if (control_buff_size) - get_cmd.aq_common_descriptor.flags = -EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK ; - +EFA_SET (&get_cmd.aq_common_descriptor.flags, +EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT ,1 ); efa_com_set_dma_addr(control_buf_dma_addr, &get_cmd.control_buffer.address.mem_addr_high,
@@ -538,8 +538,9 @@ static int efa_com_set_feature_ex(struct efa_com_dev *edev, set_cmd->aq_common_descriptor.opcode =EFA_ADMIN_SET_FEATURE ;if (control_buff_size) { - set_cmd->aq_common_descriptor.flags = -EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK ; + set_cmd->aq_common_descriptor.flags =0 ; +EFA_SET (&set_cmd->aq_common_descriptor.flags, +EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT ,1 );efa_com_set_dma_addr (control_buf_dma_addr, &set_cmd->control_buffer.address.mem_addr_high, &set_cmd->control_buffer.address.mem_addr_low);
drivers/infiniband/hw/efa/efa_common_defs.h +12 -1
@@ -1,14 +1,25 @@/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ /* -* Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved. +* Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved. */ #ifndef _EFA_COMMON_H_ #define _EFA_COMMON_H_ +#include <linux/bitfield.h> + #define EFA_COMMON_SPEC_VERSION_MAJOR 2 #define EFA_COMMON_SPEC_VERSION_MINOR 0 +#define EFA_GET(ptr, mask) FIELD_GET(mask##_MASK, *(ptr)) + +#define EFA_SET(ptr, mask, value) \ + ({ \ + typeof(ptr) _ptr = ptr; \ + *_ptr = (*_ptr & ~(mask##_MASK)) | \ + FIELD_PREP(mask##_MASK, value); \ + }) + struct efa_common_mem_addr { u32 mem_addr_low;
drivers/infiniband/hw/efa/efa_regs_defs.h +1 -21
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ /* -* Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved. +* Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved. */ #ifndef _EFA_REGS_H_
@@ -45,69 +45,49 @@ enum efa_regs_reset_reason_types {/* version register */ #define EFA_REGS_VERSION_MINOR_VERSION_MASK 0xff -#define EFA_REGS_VERSION_MAJOR_VERSION_SHIFT 8#define EFA_REGS_VERSION_MAJOR_VERSION_MASK 0xff00/* controller_version register */ #define EFA_REGS_CONTROLLER_VERSION_SUBMINOR_VERSION_MASK 0xff -#define EFA_REGS_CONTROLLER_VERSION_MINOR_VERSION_SHIFT 8#define EFA_REGS_CONTROLLER_VERSION_MINOR_VERSION_MASK 0xff00 -#define EFA_REGS_CONTROLLER_VERSION_MAJOR_VERSION_SHIFT 16#define EFA_REGS_CONTROLLER_VERSION_MAJOR_VERSION_MASK 0xff0000 -#define EFA_REGS_CONTROLLER_VERSION_IMPL_ID_SHIFT 24#define EFA_REGS_CONTROLLER_VERSION_IMPL_ID_MASK 0xff000000/* caps register */ #define EFA_REGS_CAPS_CONTIGUOUS_QUEUE_REQUIRED_MASK 0x1 -#define EFA_REGS_CAPS_RESET_TIMEOUT_SHIFT 1#define EFA_REGS_CAPS_RESET_TIMEOUT_MASK 0x3e -#define EFA_REGS_CAPS_DMA_ADDR_WIDTH_SHIFT 8#define EFA_REGS_CAPS_DMA_ADDR_WIDTH_MASK 0xff00 -#define EFA_REGS_CAPS_ADMIN_CMD_TO_SHIFT 16#define EFA_REGS_CAPS_ADMIN_CMD_TO_MASK 0xf0000/* aq_caps register */ #define EFA_REGS_AQ_CAPS_AQ_DEPTH_MASK 0xffff -#define EFA_REGS_AQ_CAPS_AQ_ENTRY_SIZE_SHIFT 16#define EFA_REGS_AQ_CAPS_AQ_ENTRY_SIZE_MASK 0xffff0000/* acq_caps register */ #define EFA_REGS_ACQ_CAPS_ACQ_DEPTH_MASK 0xffff -#define EFA_REGS_ACQ_CAPS_ACQ_ENTRY_SIZE_SHIFT 16#define EFA_REGS_ACQ_CAPS_ACQ_ENTRY_SIZE_MASK 0xff0000 -#define EFA_REGS_ACQ_CAPS_ACQ_MSIX_VECTOR_SHIFT 24#define EFA_REGS_ACQ_CAPS_ACQ_MSIX_VECTOR_MASK 0xff000000/* aenq_caps register */ #define EFA_REGS_AENQ_CAPS_AENQ_DEPTH_MASK 0xffff -#define EFA_REGS_AENQ_CAPS_AENQ_ENTRY_SIZE_SHIFT 16#define EFA_REGS_AENQ_CAPS_AENQ_ENTRY_SIZE_MASK 0xff0000 -#define EFA_REGS_AENQ_CAPS_AENQ_MSIX_VECTOR_SHIFT 24#define EFA_REGS_AENQ_CAPS_AENQ_MSIX_VECTOR_MASK 0xff000000/* dev_ctl register */ #define EFA_REGS_DEV_CTL_DEV_RESET_MASK 0x1 -#define EFA_REGS_DEV_CTL_AQ_RESTART_SHIFT 1#define EFA_REGS_DEV_CTL_AQ_RESTART_MASK 0x2 -#define EFA_REGS_DEV_CTL_RESET_REASON_SHIFT 28#define EFA_REGS_DEV_CTL_RESET_REASON_MASK 0xf0000000/* dev_sts register */ #define EFA_REGS_DEV_STS_READY_MASK 0x1 -#define EFA_REGS_DEV_STS_AQ_RESTART_IN_PROGRESS_SHIFT 1#define EFA_REGS_DEV_STS_AQ_RESTART_IN_PROGRESS_MASK 0x2 -#define EFA_REGS_DEV_STS_AQ_RESTART_FINISHED_SHIFT 2#define EFA_REGS_DEV_STS_AQ_RESTART_FINISHED_MASK 0x4 -#define EFA_REGS_DEV_STS_RESET_IN_PROGRESS_SHIFT 3#define EFA_REGS_DEV_STS_RESET_IN_PROGRESS_MASK 0x8 -#define EFA_REGS_DEV_STS_RESET_FINISHED_SHIFT 4#define EFA_REGS_DEV_STS_RESET_FINISHED_MASK 0x10 -#define EFA_REGS_DEV_STS_FATAL_ERROR_SHIFT 5#define EFA_REGS_DEV_STS_FATAL_ERROR_MASK 0x20/* mmio_reg_read register */ #define EFA_REGS_MMIO_REG_READ_REQ_ID_MASK 0xffff -#define EFA_REGS_MMIO_REG_READ_REG_OFF_SHIFT 16#define EFA_REGS_MMIO_REG_READ_REG_OFF_MASK 0xffff0000#endif /* _EFA_REGS_H_ */
Signature · 1 line
2.25.0
v2 cover EFA updates 2020-02-25
This series contains various updates to the device definitions handling and documentation.
The last patch is based on a discussion that came up during the recent mmap machanism review on list:
https://lore.kernel.org/linux-rdma/[email protected]/
We no longer delay the free_pages_exact call of mmaped DMA pages, as the pages won't be freed in case they are still referenced by the vma.
Changelog -v1->v2: https://lore.kernel.org/linux-rdma/[email protected]/
* Use FIELD_GET and FIELD_PREP for EFA_GET/SET
* Make sure to mask (clear) the field before ORing it with a new value
* Clarify the commit message of the last patch
* Reorder the cleanup in the last commit, entry removal now happens first
Gal Pressman (3):
RDMA/efa: Unified getters/setters for device structs bitmask access RDMA/efa: Properly document the interrupt mask register RDMA/efa: Do not delay freeing of DMA pages
.../infiniband/hw/efa/efa_admin_cmds_defs.h | 7 +- drivers/infiniband/hw/efa/efa_admin_defs.h | 4 +- drivers/infiniband/hw/efa/efa_com.c | 146 ++++++++---------- drivers/infiniband/hw/efa/efa_com_cmd.c | 29 ++-- drivers/infiniband/hw/efa/efa_common_defs.h | 13 +- drivers/infiniband/hw/efa/efa_regs_defs.h | 25 +-- drivers/infiniband/hw/efa/efa_verbs.c | 44 +++--- 7 files changed, 119 insertions(+), 149 deletions(-)
base-commit: f03d9fadfe13a78ee28fec320d43f7b37574adcb
Signature · 1 line
2.25.0
PATCH v2 2/3 RDMA/efa: Properly document the interrupt mask register
The fact that the LSB in the register is the enable bit should not be an implicit assumption between the driver and the device, properly document that in the register definition.
--- drivers/infiniband/hw/efa/efa_com.c | 4 +--- drivers/infiniband/hw/efa/efa_regs_defs.h | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/infiniband/hw/efa/efa_com.c +1 -3
@@ -23,8 +23,6 @@#define EFA_DMA_ADDR_TO_UINT32_LOW (x) ((u32)((u64)(x)))#define EFA_DMA_ADDR_TO_UINT32_HIGH (x) ((u32)(((u64)(x)) >> 32)) -#define EFA_REGS_ADMIN_INTR_MASK 1 -enum efa_cmd_status {EFA_CMD_SUBMITTED ,EFA_CMD_COMPLETED ,
@@ -689,7 +687,7 @@ void efa_com_set_admin_polling_mode(struct efa_com_dev *edev, bool polling)u32 mask_value =0 ;if (polling) - mask_value =EFA_REGS_ADMIN_INTR_MASK ; +EFA_SET (&mask_value,EFA_REGS_INTR_MASK_EN ,1 );writel (mask_value, edev->reg_bar +EFA_REGS_INTR_MASK_OFF );if (polling)
drivers/infiniband/hw/efa/efa_regs_defs.h +3 -0
@@ -73,6 +73,9 @@ enum efa_regs_reset_reason_types {#define EFA_REGS_AENQ_CAPS_AENQ_ENTRY_SIZE_MASK 0xff0000#define EFA_REGS_AENQ_CAPS_AENQ_MSIX_VECTOR_MASK 0xff000000 +/* intr_mask register */ +#define EFA_REGS_INTR_MASK_EN_MASK 0x1 +/* dev_ctl register */ #define EFA_REGS_DEV_CTL_DEV_RESET_MASK 0x1#define EFA_REGS_DEV_CTL_AQ_RESTART_MASK 0x2
Signature · 1 line
2.25.0
PATCH v2 3/3 RDMA/efa: Do not delay freeing of DMA pages
In reply to Gal PressmanWhen destroying a DMA mmapped object, there is no need to artificially delay the freeing of the pages to the mmap entry removal. Since the vma keeps reference count on these pages, free_pages_exact can be called on the destroy verb as it won't really free the pages until the reference count is cleared (in case the user hasn't called munmap yet).
Remove the special handling of DMA pages and call free_pages_exact on destroy_qp/cq. The mmap entry removal is moved to the beginning of the destroy flows, so the driver can safely free the pages.
--- drivers/infiniband/hw/efa/efa_verbs.c | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-)
drivers/infiniband/hw/efa/efa_verbs.c +22 -22
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* -* Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved. +* Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved. */ #include <linux/vmalloc.h>
@@ -169,6 +169,14 @@ static void *efa_zalloc_mapped(struct efa_dev *dev, dma_addr_t *dma_addr,return addr; } +static void efa_free_mapped (struct efa_dev *dev,void *cpu_addr, +dma_addr_t dma_addr, +size_t size,enum dma_data_direction dir) +{ +dma_unmap_single (&dev->pdev->dev, dma_addr, size, dir); +free_pages_exact (cpu_addr, size); +} +int efa_query_device (struct ib_device *ibdev,struct ib_device_attr *props,struct ib_udata *udata)
@@ -402,6 +410,9 @@ int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)int err;ibdev_dbg (&dev->ibdev,"Destroy qp[%u]\n" , ibqp->qp_num); + +efa_qp_user_mmap_entries_remove (qp); + err =efa_destroy_qp_handle (dev, qp->qp_handle);if (err)return err;
@@ -411,11 +422,10 @@ int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)"qp->cpu_addr[0x%p] freed: size[%lu], dma[%pad]\n" , qp->rq_cpu_addr, qp->rq_size, &qp->rq_dma_addr); -dma_unmap_single (&dev->pdev->dev, qp->rq_dma_addr, qp->rq_size, -DMA_TO_DEVICE ); +efa_free_mapped (dev, qp->rq_cpu_addr, qp->rq_dma_addr, + qp->rq_size,DMA_TO_DEVICE ); } -efa_qp_user_mmap_entries_remove (qp);kfree (qp);return 0 ; }
@@ -720,13 +730,9 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd, err_destroy_qp:efa_destroy_qp_handle (dev, create_qp_resp.qp_handle); err_free_mapped: -if (qp->rq_size) { -dma_unmap_single (&dev->pdev->dev, qp->rq_dma_addr, qp->rq_size, -DMA_TO_DEVICE ); - -if (!qp->rq_mmap_entry) -free_pages_exact (qp->rq_cpu_addr, qp->rq_size); - } +if (qp->rq_size) +efa_free_mapped (dev, qp->rq_cpu_addr, qp->rq_dma_addr, + qp->rq_size,DMA_TO_DEVICE ); err_free_qp:kfree (qp); err_out:
@@ -845,10 +851,10 @@ void efa_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)"Destroy cq[%d] virt[0x%p] freed: size[%lu], dma[%pad]\n" , cq->cq_idx, cq->cpu_addr, cq->size, &cq->dma_addr); -efa_destroy_cq_idx (dev, cq->cq_idx); -dma_unmap_single (&dev->pdev->dev, cq->dma_addr, cq->size, -DMA_FROM_DEVICE );rdma_user_mmap_entry_remove (cq->mmap_entry); +efa_destroy_cq_idx (dev, cq->cq_idx); +efa_free_mapped (dev, cq->cpu_addr, cq->dma_addr, cq->size, +DMA_FROM_DEVICE ); } static int cq_mmap_entries_setup(struct efa_dev *dev, struct efa_cq *cq,
@@ -985,10 +991,8 @@ int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, err_destroy_cq:efa_destroy_cq_idx (dev, cq->cq_idx); err_free_mapped: -dma_unmap_single (&dev->pdev->dev, cq->dma_addr, cq->size, -DMA_FROM_DEVICE ); -if (!cq->mmap_entry) -free_pages_exact (cq->cpu_addr, cq->size); +efa_free_mapped (dev, cq->cpu_addr, cq->dma_addr, cq->size, +DMA_FROM_DEVICE ); err_out:atomic64_inc (&dev->stats.sw_stats.create_cq_err);
@@ -1550,10 +1554,6 @@ void efa_mmap_free(struct rdma_user_mmap_entry *rdma_entry) {struct efa_user_mmap_entry *entry =to_emmap (rdma_entry); -/* DMA mapping is already gone, now free the pages */ -if (entry->mmap_flag ==EFA_MMAP_DMA_PAGE ) -free_pages_exact (phys_to_virt (entry->address), - entry->rdma_entry.npages *PAGE_SIZE );kfree (entry); }
Signature · 1 line
2.25.0
Jason Gunthorpe
AppliedQuoted 18 lines · Gal Pressman
This series contains various updates to the device definitions handling and documentation.
The last patch is based on a discussion that came up during the recent mmap machanism review on list:
https://lore.kernel.org/linux-rdma/[email protected]/We no longer delay the
free_pages_exactcall of mmaped DMA pages, as the pages won't be freed in case they are still referenced by the vma.Changelog -
v1->v2: https://lore.kernel.org/linux-rdma/[email protected]/
* UseFIELD_GETandFIELD_PREPfor EFA_GET/SET
* Make sure to mask (clear) the field before ORing it with a new value
* Clarify the commit message of the last patch
* Reorder the cleanup in the last commit, entry removal now happens first
Quoted 4 lines
Gal Pressman (3):
RDMA/efa: Unified getters/setters for device structs bitmask access RDMA/efa: Properly document the interrupt mask register RDMA/efa: Do not delay freeing of DMA pages
Applied to for-next, thanks
Jason