svn commit: r289653 - head/sys/dev/ntb/if_ntb

Conrad Meyer cem at FreeBSD.org
Tue Oct 20 19:28:31 UTC 2015


This catches us up to Linus' master branch as of today (the most
recent NTB patch there is from Sep 7, 2015) — modulo no DMA offload in
if_ntb, no debugfs-equivalent statistics, and neither of Linux' NTB
test drivers. Also we don't make any attempt to allocate memory in the
device-local NUMA zone, because that API doesn't exist yet. Nor do we
push back on the upper network stack layers to stop sending when our
queues are full, for the same reason.

That's not quite finished, though; Intel and EMC (ex-Isilon) have some
patches queued up waiting to go into Linux that should be applied too.

Thanks,
Conrad

On Tue, Oct 20, 2015 at 12:21 PM, Conrad E. Meyer <cem at freebsd.org> wrote:
> Author: cem
> Date: Tue Oct 20 19:21:01 2015
> New Revision: 289653
> URL: https://svnweb.freebsd.org/changeset/base/289653
>
> Log:
>   if_ntb: Diff-reduce with Linux; add queue index type
>
>   Add ntb_q_idx_t so it is more clear which struct members are of the same
>   type (some bogus uint64_ts snuck in that should have been unsigned int).
>
>   Add tx_err_no_buf and s/ENOMEM/EBUSY/ in tx_enqueue to match Linux.
>
>   Sponsored by: EMC / Isilon Storage Division
>
> Modified:
>   head/sys/dev/ntb/if_ntb/if_ntb.c
>
> Modified: head/sys/dev/ntb/if_ntb/if_ntb.c
> ==============================================================================
> --- head/sys/dev/ntb/if_ntb/if_ntb.c    Tue Oct 20 19:20:52 2015        (r289652)
> +++ head/sys/dev/ntb/if_ntb/if_ntb.c    Tue Oct 20 19:21:01 2015        (r289653)
> @@ -105,6 +105,8 @@ SYSCTL_UINT(_hw_ntb, OID_AUTO, max_num_c
>
>  STAILQ_HEAD(ntb_queue_list, ntb_queue_entry);
>
> +typedef unsigned ntb_q_idx_t;
> +
>  struct ntb_queue_entry {
>         /* ntb_queue list reference */
>         STAILQ_ENTRY(ntb_queue_entry) entry;
> @@ -117,11 +119,11 @@ struct ntb_queue_entry {
>
>         struct ntb_transport_qp         *qp;
>         struct ntb_payload_header       *x_hdr;
> -       unsigned        index;
> +       ntb_q_idx_t     index;
>  };
>
>  struct ntb_rx_info {
> -       unsigned int entry;
> +       ntb_q_idx_t     entry;
>  };
>
>  struct ntb_transport_qp {
> @@ -143,8 +145,8 @@ struct ntb_transport_qp {
>         struct mtx              ntb_tx_free_q_lock;
>         void                    *tx_mw;
>         bus_addr_t              tx_mw_phys;
> -       uint64_t                tx_index;
> -       uint64_t                tx_max_entry;
> +       ntb_q_idx_t             tx_index;
> +       ntb_q_idx_t             tx_max_entry;
>         uint64_t                tx_max_frame;
>
>         void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data,
> @@ -157,8 +159,8 @@ struct ntb_transport_qp {
>         struct task             rx_completion_task;
>         struct task             rxc_db_work;
>         void                    *rx_buff;
> -       uint64_t                rx_index;
> -       uint64_t                rx_max_entry;
> +       ntb_q_idx_t             rx_index;
> +       ntb_q_idx_t             rx_max_entry;
>         uint64_t                rx_max_frame;
>
>         void (*event_handler)(void *data, enum ntb_link_event status);
> @@ -178,6 +180,7 @@ struct ntb_transport_qp {
>         uint64_t                tx_bytes;
>         uint64_t                tx_pkts;
>         uint64_t                tx_ring_full;
> +       uint64_t                tx_err_no_buf;
>  };
>
>  struct ntb_queue_handlers {
> @@ -842,7 +845,8 @@ ntb_transport_tx_enqueue(struct ntb_tran
>         entry = ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q);
>         if (entry == NULL) {
>                 CTR0(KTR_NTB, "TX: could not get entry from tx_free_q");
> -               return (ENOMEM);
> +               qp->tx_err_no_buf++;
> +               return (EBUSY);
>         }
>         CTR1(KTR_NTB, "TX: got entry %p from tx_free_q", entry);
>
> @@ -961,7 +965,7 @@ static void
>  ntb_transport_rxc_db(void *arg, int pending __unused)
>  {
>         struct ntb_transport_qp *qp = arg;
> -       uint64_t i;
> +       ntb_q_idx_t i;
>         int rc;
>
>         /*
> @@ -1346,7 +1350,7 @@ ntb_transport_setup_qp_mw(struct ntb_tra
>         struct ntb_transport_qp *qp = &nt->qp_vec[qp_num];
>         struct ntb_transport_mw *mw;
>         void *offset;
> -       uint64_t i;
> +       ntb_q_idx_t i;
>         size_t rx_size;
>         unsigned num_qps_mw, mw_num, mw_count;
>
> @@ -1473,7 +1477,8 @@ ntb_qp_link_down_reset(struct ntb_transp
>         qp->rx_ring_empty = 0;
>         qp->tx_ring_full = 0;
>
> -       qp->rx_err_no_buf = qp->rx_err_oflow = qp->rx_err_ver = 0;
> +       qp->rx_err_no_buf = qp->tx_err_no_buf = 0;
> +       qp->rx_err_oflow = qp->rx_err_ver = 0;
>  }
>
>  static void
>


More information about the svn-src-head mailing list