Merge tag 'v5.11' into rdma.git for-next
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 18 Feb 2021 15:17:24 +0000 (11:17 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 18 Feb 2021 15:19:29 +0000 (11:19 -0400)
Linux 5.11

Merged to resolve conflicts with RDMA rc commits

- drivers/infiniband/sw/rxe/rxe_net.c
  The final logic is to call rxe_get_dev_from_net() again with the master
  netdev if the packet was rx'd on a vlan. To keep the elimination of the
  local variables requires a trivial edit to the code in -rc

Link: https://lore.kernel.org/r/20210210131542.215ea67c@canb.auug.org.au
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
1  2 
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_qp.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/sw/rxe/rxe_net.c
drivers/infiniband/sw/rxe/rxe_resp.c
include/linux/mlx5/driver.h

@@@ -408,37 -408,14 +408,37 @@@ static void free_qpn(struct hns_roce_de
  
        ida_free(&hr_dev->qp_table.bank[bankid].ida, hr_qp->qpn >> 3);
  
-       spin_lock(&hr_dev->qp_table.bank_lock);
+       mutex_lock(&hr_dev->qp_table.bank_mutex);
        hr_dev->qp_table.bank[bankid].inuse--;
-       spin_unlock(&hr_dev->qp_table.bank_lock);
+       mutex_unlock(&hr_dev->qp_table.bank_mutex);
  }
  
 +static u32 proc_rq_sge(struct hns_roce_dev *dev, struct hns_roce_qp *hr_qp,
 +                     bool user)
 +{
 +      u32 max_sge = dev->caps.max_rq_sg;
 +
 +      if (dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
 +              return max_sge;
 +
 +      /* Reserve SGEs only for HIP08 in kernel; The userspace driver will
 +       * calculate number of max_sge with reserved SGEs when allocating wqe
 +       * buf, so there is no need to do this again in kernel. But the number
 +       * may exceed the capacity of SGEs recorded in the firmware, so the
 +       * kernel driver should just adapt the value accordingly.
 +       */
 +      if (user)
 +              max_sge = roundup_pow_of_two(max_sge + 1);
 +      else
 +              hr_qp->rq.rsv_sge = 1;
 +
 +      return max_sge;
 +}
 +
  static int set_rq_size(struct hns_roce_dev *hr_dev, struct ib_qp_cap *cap,
 -                     struct hns_roce_qp *hr_qp, int has_rq)
 +                     struct hns_roce_qp *hr_qp, int has_rq, bool user)
  {
 +      u32 max_sge = proc_rq_sge(hr_dev, hr_qp, user);
        u32 cnt;
  
        /* If srq exist, set zero for relative number of rq */
Simple merge
@@@ -152,14 -153,15 +153,16 @@@ static struct dst_entry *rxe_find_route
  static int rxe_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
  {
        struct udphdr *udph;
 +      struct rxe_dev *rxe;
        struct net_device *ndev = skb->dev;
 -      struct net_device *rdev = ndev;
 -      struct rxe_dev *rxe = rxe_get_dev_from_net(ndev);
        struct rxe_pkt_info *pkt = SKB_TO_PKT(skb);
  
 -      if (!rxe && is_vlan_dev(rdev)) {
 -              rdev = vlan_dev_real_dev(ndev);
 -              rxe = rxe_get_dev_from_net(rdev);
 -      }
 +      /* takes a reference on rxe->ib_dev
 +       * drop when skb is freed
 +       */
 +      rxe = rxe_get_dev_from_net(ndev);
++      if (!rxe && is_vlan_dev(ndev))
++              rxe = rxe_get_dev_from_net(vlan_dev_real_dev(ndev));
        if (!rxe)
                goto drop;
  
Simple merge
Simple merge