Skip to content
  • Jack Morgenstein's avatar
    mlx4_core: Implement mechanism for reserved Q_Keys · 396f2feb
    Jack Morgenstein authored
    
    
    The SR-IOV special QP tunneling mechanism uses proxy special QPs
    (instead of the real special QPs) for MADs on guests.  These proxy QPs
    send their packets to a "tunnel" QP owned by the master.  The master
    then forwards the MAD (after any required paravirtualization) to the
    real special QP, which sends out the MAD.
    
    For security reasons (i.e., to prevent guests from sending MADs to
    tunnel QPs belonging to other guests), each proxy-tunnel QP pair is
    assigned a unique, reserved, Q_Key.  These Q_Keys are available only
    for proxy and tunnel QPs -- if the guest tries to use these Q_Keys
    with other QPs, it will fail.
    
    This patch introduces a mechanism for reserving a block of 64K Q_Keys
    for proxy/tunneling use.
    
    The patch introduces also two new fields into mlx4_dev: base_sqpn and
    base_tunnel_sqpn.
    
    In SR-IOV mode, the QP numbers for the "real," proxy, and tunnel sqps
    are added to the reserved QPN area (so that they will not change).
    There are 8 special QPs per port in the HCA, and each of them is
    assigned both a proxy and a tunnel QP, for each VF and for the PF as
    well in SR-IOV mode.
    
    The QPNs for these QPs are arranged as follows:
     1. The real SQP numbers (8)
     2. The proxy SQPs (8 * (max number of VFs + max number of PFs)
     3. The tunnel SQPs (8 * (max number of VFs + max number of PFs)
    
    To support these QPs, two new fields are added to struct mlx4_dev:
    
      base_sqp:  this is the QP number of the first of the real SQPs
      base_tunnel_sqp: this is the qp number of the first qp in the tunnel
                       sqp region. (On guests, this is the first tunnel
                       sqp of the 8 which are assigned to that guest).
    
    In addition, in SR-IOV mode, sqp_start is the number of the first
    proxy SQP in the proxy SQP region.  (In guests, this is the first
    proxy SQP of the 8 which are assigned to that guest)
    
    Note that in non-SR-IOV mode, there are no proxies and no tunnels.
    In this case, sqp_start is set to sqp_base -- which minimizes code
    changes.
    
    Signed-off-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
    Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    396f2feb