Author: cperciva
Date: Fri Jul  7 00:34:51 2017
New Revision: 320760
URL: https://svnweb.freebsd.org/changeset/base/320760

Log:
  MF11 r320731,320749,320759: Add Amazon Elastic Network Adapter driver
  and turn it on in EC2 AMI builds
  
  Approved by:  re (gjb)
  Relnotes:     FreeBSD now supports "next generation" Enhanced Networking
                in the Amazon EC2 cloud
  Sponsored by: Amazon.com Inc. (original work)

Added:
  releng/11.1/share/man/man4/ena.4
     - copied unchanged from r320731, stable/11/share/man/man4/ena.4
  releng/11.1/sys/contrib/ena-com/
     - copied from r320731, stable/11/sys/contrib/ena-com/
  releng/11.1/sys/dev/ena/
     - copied from r320731, stable/11/sys/dev/ena/
  releng/11.1/sys/modules/ena/
     - copied from r320731, stable/11/sys/modules/ena/
Modified:
  releng/11.1/release/Makefile.ec2
  releng/11.1/release/tools/ec2.conf
  releng/11.1/sys/conf/files
  releng/11.1/sys/dev/ena/ena.c
  releng/11.1/sys/dev/ena/ena.h
  releng/11.1/sys/modules/Makefile
Directory Properties:
  releng/11.1/   (props changed)

Modified: releng/11.1/release/Makefile.ec2
==============================================================================
--- releng/11.1/release/Makefile.ec2    Thu Jul  6 22:34:54 2017        
(r320759)
+++ releng/11.1/release/Makefile.ec2    Fri Jul  7 00:34:51 2017        
(r320760)
@@ -51,7 +51,7 @@ ec2ami: cw-ec2 ${CW_EC2_PORTINSTALL}
        @echo "--------------------------------------------------------------"
        @false
 .endif
-       /usr/local/bin/bsdec2-image-upload ${PUBLISH} --sriov \
+       /usr/local/bin/bsdec2-image-upload ${PUBLISH} --sriov --ena \
            ${.OBJDIR}/ec2.raw \
            "${TYPE} ${REVISION}-${BRANCH}-${TARGET}${AMINAMESUFFIX}" \
            "${TYPE} ${REVISION}-${BRANCH}-${TARGET}" \

Modified: releng/11.1/release/tools/ec2.conf
==============================================================================
--- releng/11.1/release/tools/ec2.conf  Thu Jul  6 22:34:54 2017        
(r320759)
+++ releng/11.1/release/tools/ec2.conf  Fri Jul  7 00:34:51 2017        
(r320760)
@@ -78,6 +78,9 @@ vm_extra_pre_umount() {
        # nodes, but apply the workaround just in case.
        echo 'hw.broken_txfifo="1"' >> ${DESTDIR}/boot/loader.conf
 
+       # Load the kernel module for the Amazon "Elastic Network Adapter"
+       echo 'if_ena_load="YES"' >> ${DESTDIR}/boot/loader.conf
+
        # The first time the AMI boots, the installed "first boot" scripts
        # should be allowed to run:
        # * ec2_configinit (download and process EC2 user-data)

Copied: releng/11.1/share/man/man4/ena.4 (from r320731, 
stable/11/share/man/man4/ena.4)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ releng/11.1/share/man/man4/ena.4    Fri Jul  7 00:34:51 2017        
(r320760, copy of r320731, stable/11/share/man/man4/ena.4)
@@ -0,0 +1,255 @@
+.\" Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\"
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+.\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+.\" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+.\" OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+.\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd May 04, 2017
+.Dt ENA 4
+.Os
+.Sh NAME
+.Nm ena
+.Nd "FreeBSD kernel driver for Elastic Network Adapter (ENA) family"
+.Sh SYNOPSIS
+To compile this driver into the kernel,
+place the following line in your
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device ena"
+.Ed
+.Pp
+Alternatively, to load the driver as a
+module at boot time, place the following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+if_ena_load="YES"
+.Ed
+.Sh DESCRIPTION
+The ENA is a networking interface designed to make good use of modern CPU
+features and system architectures.
+.Pp
+The ENA device exposes a lightweight management interface with a
+minimal set of memory mapped registers and extendable command set
+through an Admin Queue.
+.Pp
+The driver supports a range of ENA devices, is link-speed independent
+(i.e., the same driver is used for 10GbE, 25GbE, 40GbE, etc.), and has
+a negotiated and extendable feature set.
+.Pp
+Some ENA devices support SR-IOV. This driver is used for both the
+SR-IOV Physical Function (PF) and Virtual Function (VF) devices.
+.Pp
+The ENA devices enable high speed and low overhead network traffic
+processing by providing multiple Tx/Rx queue pairs (the maximum number
+is advertised by the device via the Admin Queue), a dedicated MSI-X
+interrupt vector per Tx/Rx queue pair, and CPU cacheline optimized
+data placement.
+.Pp
+The
+.Nm
+driver supports industry standard TCP/IP offload features such
+as checksum offload and TCP transmit segmentation offload (TSO).
+Receive-side scaling (RSS) is supported for multi-core scaling.
+.Pp
+The
+.Nm
+driver and its corresponding devices implement health
+monitoring mechanisms such as watchdog, enabling the device and driver
+to recover in a manner transparent to the application, as well as
+debug logs.
+.Pp
+Some of the ENA devices support a working mode called Low-latency
+Queue (LLQ), which saves several more microseconds. This feature will
+be implemented for driver in future releases.
+.Sh HARDWARE
+Supported PCI vendor ID/device IDs:
+.Pp
+.Bl -bullet -compact
+.It
+1d0f:0ec2 - ENA PF
+.It
+1d0f:1ec2 - ENA PF with LLQ support
+.It
+1d0f:ec20 - ENA VF
+.It
+1d0f:ec21 - ENA VF with LLQ support
+.El
+.Sh DIAGNOSTICS
+.Ss Device initialization phase:
+.Bl -diag
+.It ena%d: failed to init mmio read less
+.Pp
+Error occured during initialization of the mmio register read request.
+.It ena%d: Can not reset device
+.Pp
+Device could not be reset; device may not be responding or is already
+during reset.
+.It ena%d: device version is too low
+.Pp
+Version of the controller is too low and it is not supported by the driver.
+.It ena%d: Invalid dma width value %d
+.Pp
+The controller is able to request dma transcation width. Device stopped
+responding or it demanded invalid value.
+.It ena%d: Can not initialize ena admin queue with device
+.Pp
+Initialization of the Admin Queue failed; device may not be responding or there
+was a problem with initialization of the resources.
+.It ena%d: Cannot get attribute for ena device rc: %d
+.Pp
+Failed to get attributes of the device from the controller.
+.It ena%d: Cannot configure aenq groups rc: %d
+.Pp
+Errors occured when trying to configure AENQ groups.
+.El
+.Ss Driver initialisation/shutdown phase:
+.Bl -diag
+.It ena%d: PCI resource allocation failed!
+.It ena%d: allocating ena_dev failed
+.It ena%d: failed to pmap registers bar
+.It ena%d: Error while setting up bufring
+.It ena%d: Error with initialization of IO rings
+.It ena%d: can not allocate ifnet structure
+.It ena%d: Error with network interface setup
+.It ena%d: Failed to enable and set the admin interrupts
+.It ena%d: Failed to allocate %d, vectors %d
+.It ena%d: Failed to enable MSIX, vectors %d rc %d
+.It ena%d: Error with MSI-X enablement
+.It ena%d: could not allocate irq vector: %d
+.It ena%d: Unable to allocate bus resource: registers
+.Pp
+Resource allocation failed when initializing the device; driver will not
+be attached.
+.It ena%d: ENA device init failed (err: %d)
+.Pp
+Device initialization failed; driver will not be attached.
+.It ena%d: could not activate irq vector: %d
+.Pp
+Error occured when trying to activate interrupt vectors for Admin Queue.
+.It ena%d: failed to register interrupt handler for irq %ju: %d
+.Pp
+Error occured when trying to register Admin Queue interrupt handler.
+.It ena%d: Cannot setup mgmnt queue intr
+.Pp
+Error occured during configuration of the Admin Queue interrupts.
+.It ena%d: Enable MSI-X failed
+.Pp
+Configuration of the MSI-X for Admin Queue failed; there could be lack
+of resources or interrupts could not have been configured; driver will
+not be attached.
+.It ena%d: VLAN is in use, detach first
+.Pp
+VLANs are being used when trying to detach the driver; VLANs should be detached
+first and then detach routine should be called again.
+.It ena%d: Unmapped RX DMA tag associations
+.It ena%d: Unmapped TX DMA tag associations
+.Pp
+Error occured when trying to destroy RX/TX DMA tag.
+.It ena%d: Cannot init RSS
+.It ena%d: Cannot fill indirect table
+.It ena%d: Cannot fill indirect table
+.It ena%d: Cannot fill hash function
+.It ena%d: Cannot fill hash control
+.It ena%d: WARNING: RSS was not properly initialized, it will affect bandwidth
+.Pp
+Error occured during initialization of one of RSS resources; device is still
+going to work but it will affect performance because all RX packets will be
+passed to queue 0 and there will be no hash information.
+.It ena%d: failed to tear down irq: %d
+.It ena%d: dev has no parent while releasing res for irq: %d
+Release of the interrupts failed.
+.El
+.Ss Additional diagnostic:
+.Bl -diag
+.It ena%d: Cannot get attribute for ena device
+.Pp
+This message appears when trying to change MTU and driver is unable to get
+attributes from the device.
+.It ena%d: Invalid MTU setting. new_mtu: %d
+.Pp
+Requested MTU value is not supported and will not be set.
+.It ena%d: keep alive watchdog timeout
+.Pp
+Device stopped responding and will be reset.
+.It ena%d: Found a Tx that wasn't completed on time, qid %d, index %d.
+.Pp
+Packet was pushed to the NIC but not sent within given time limit; it may
+be caused by hang of the IO queue.
+.It ena%d: The number of lost tx completion is aboce the threshold (%d > %d). 
Reset the device
+.Pp
+If too many Tx wasn't completed on time the device is going to be reset; it may
+be caused by hanged queue or device.
+.It ena%d: trigger reset is on
+.Pp
+Device will be reset; reset is triggered either by watchdog or if too many TX
+packets were not completed on time.
+.It ena%d: invalid value recvd
+.Pp
+Link status received from the device in the AENQ handler is invalid.
+.It ena%d: Allocation for Tx Queue %u failed
+.It ena%d: Allocation for Rx Queue %u failed
+.It ena%d: Unable to create Rx DMA map for buffer %d
+.It ena%d: Failed to create io TX queue #%d rc: %d
+.It ena%d: Failed to get TX queue handlers. TX queue num %d rc: %d
+.It ena%d: Failed to create io RX queue[%d] rc: %d
+.It ena%d: Failed to get RX queue handlers. RX queue num %d rc: %d
+.It ena%d: failed to request irq
+.It ena%d: could not allocate irq vector: %d
+.It ena%d: failed to register interrupt handler for irq %ju: %d
+.Pp
+IO resources initialization failed. Interface will not be brought up.
+.It ena%d: LRO[%d] Initialization failed!
+.Pp
+Initialization of the LRO for the RX ring failed.
+.It ena%d: failed to alloc buffer for rx queue
+.It ena%d: failed to add buffer for rx queue %d
+.It ena%d: refilled rx queue %d with %d pages only
+.Pp
+Allocation of resources used on RX path failed; if happened during
+initialization of the IO queue, the interface will not be brought up.
+.It ena%d: ioctl promisc/allmulti
+.Pp
+IOCTL request for the device to work in promiscuous/allmulti mode; see
+.Xr ifconfig 8
+for more details.
+.It ena%d: too many fragments. Last fragment: %d!
+.Pp
+Packet with unsupported number of segments was queued for sending to the
+device; packet will be dropped.
+.Sh SUPPORT
+If an issue is identified with the released source code with a supported 
adapter
+email the specific information related to the issue to
+.Aq Mt [email protected]
+and
+.Aq Mt [email protected] .
+.Sh SEE ALSO
+.Xr vlan 4 ,
+.Xr ifconfig 8
+.Sh AUTHORS
+The
+.Nm
+driver was written by
+.An Semihalf.

Modified: releng/11.1/sys/conf/files
==============================================================================
--- releng/11.1/sys/conf/files  Thu Jul  6 22:34:54 2017        (r320759)
+++ releng/11.1/sys/conf/files  Fri Jul  7 00:34:51 2017        (r320760)
@@ -1547,6 +1547,12 @@ dev/e1000/e1000_mbx.c            optional em | igb \
 dev/e1000/e1000_osdep.c                optional em | igb \
        compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/et/if_et.c                 optional et
+dev/ena/ena.c                  optional ena \
+       compile-with "${NORMAL_C} -I$S/contrib"
+dev/ena/ena_sysctl.c           optional ena \
+       compile-with "${NORMAL_C} -I$S/contrib"
+contrib/ena-com/ena_com.c      optional ena
+contrib/ena-com/ena_eth_com.c  optional ena
 dev/en/if_en_pci.c             optional en pci
 dev/en/midway.c                        optional en
 dev/ep/if_ep.c                 optional ep

Modified: releng/11.1/sys/dev/ena/ena.c
==============================================================================
--- stable/11/sys/dev/ena/ena.c Thu Jul  6 11:45:13 2017        (r320731)
+++ releng/11.1/sys/dev/ena/ena.c       Fri Jul  7 00:34:51 2017        
(r320760)
@@ -141,6 +141,7 @@ static void ena_free_irqs(struct ena_adapter*);
 static void    ena_disable_msix(struct ena_adapter *);
 static void    ena_unmask_all_io_irqs(struct ena_adapter *);
 static int     ena_rss_configure(struct ena_adapter *);
+static void    ena_update_hw_stats(void *, int);
 static int     ena_up_complete(struct ena_adapter *);
 static int     ena_up(struct ena_adapter *);
 static void    ena_down(struct ena_adapter *);
@@ -2062,6 +2063,25 @@ static int ena_rss_configure(struct ena_adapter *adapt
        return 0;
 }
 
+static void
+ena_update_hw_stats(void *arg, int pending)
+{
+       struct ena_adapter *adapter = arg;
+       int rc;
+
+       for (;;) {
+               if (!adapter->up)
+                       return;
+
+               rc = ena_update_stats_counters(adapter);
+               if (rc)
+                       ena_trace(ENA_WARNING,
+                           "Error updating stats counters, rc = %d", rc);
+
+               pause("ena update hw stats", hz);
+       }
+}
+
 static int
 ena_up_complete(struct ena_adapter *adapter)
 {
@@ -2144,6 +2164,8 @@ ena_up(struct ena_adapter *adapter)
                callout_reset_sbt(&adapter->timer_service, SBT_1S, SBT_1S,
                    ena_timer_service, (void *)adapter, 0);
 
+               taskqueue_enqueue(adapter->stats_tq, &adapter->stats_task);
+
                adapter->up = true;
 
                ena_unmask_all_io_irqs(adapter);
@@ -2198,24 +2220,8 @@ ena_get_counter(if_t ifp, ift_counter cnt)
 {
        struct ena_adapter *adapter;
        struct ena_hw_stats *stats;
-       int rc;
 
        adapter = if_getsoftc(ifp);
-
-       /*
-        * Update only when asking for first counter and interface is up.
-        * Usually asks for all statistics in sequence.
-        */
-       if (adapter->up) {
-               if (cnt == 0) {
-                       rc = ena_update_stats_counters(adapter);
-                       if (rc) {
-                               ena_trace(ENA_WARNING,
-                                   "Error updating stats counters, rc = %d",
-                                   rc);
-                       }
-               }
-       }
        stats = &adapter->hw_stats;
 
        switch (cnt) {
@@ -2510,6 +2516,10 @@ ena_down(struct ena_adapter *adapter)
                if_setdrvflagbits(adapter->ifp, IFF_DRV_OACTIVE,
                    IFF_DRV_RUNNING);
 
+               /* Drain task responsible for updating hw stats */
+               while (taskqueue_cancel(adapter->stats_tq, 
&adapter->stats_task, NULL))
+                       taskqueue_drain(adapter->stats_tq, 
&adapter->stats_task);
+
                ena_free_io_irq(adapter);
 
                ena_destroy_all_io_queues(adapter);
@@ -3627,6 +3637,18 @@ ena_attach(device_t pdev)
        taskqueue_start_threads(&adapter->reset_tq, 1, PI_NET,
            "%s rstq", device_get_nameunit(adapter->pdev));
 
+       /* Initialize task queue responsible for updating hw stats */
+       TASK_INIT(&adapter->stats_task, 0, ena_update_hw_stats, adapter);
+       adapter->stats_tq = taskqueue_create_fast("ena_stats_update",
+           M_WAITOK | M_ZERO, taskqueue_thread_enqueue, &adapter->stats_tq);
+       if (adapter->stats_tq == NULL) {
+               device_printf(adapter->pdev,
+                   "Unable to create taskqueue for updating hw stats\n");
+               goto err_stats_tq;
+       }
+       taskqueue_start_threads(&adapter->stats_tq, 1, PI_REALTIME,
+           "%s stats tq", device_get_nameunit(adapter->pdev));
+
        /* Initialize statistics */
        ena_alloc_counters((counter_u64_t *)&adapter->dev_stats,
            sizeof(struct ena_stats_dev));
@@ -3639,6 +3661,8 @@ ena_attach(device_t pdev)
        adapter->running = true;
        return (0);
 
+err_stats_tq:
+       taskqueue_free(adapter->reset_tq);
 err_reset_tq:
        ena_free_mgmnt_irq(adapter);
        ena_disable_msix(adapter);
@@ -3693,6 +3717,8 @@ ena_detach(device_t pdev)
        sx_xlock(&adapter->ioctl_sx);
        ena_down(adapter);
        sx_unlock(&adapter->ioctl_sx);
+
+       taskqueue_free(adapter->stats_tq);
 
        if (adapter->ifp != NULL) {
                ether_ifdetach(adapter->ifp);

Modified: releng/11.1/sys/dev/ena/ena.h
==============================================================================
--- stable/11/sys/dev/ena/ena.h Thu Jul  6 11:45:13 2017        (r320731)
+++ releng/11.1/sys/dev/ena/ena.h       Fri Jul  7 00:34:51 2017        
(r320760)
@@ -403,6 +403,10 @@ struct ena_adapter {
        uint32_t missing_tx_max_queues;
        uint32_t missing_tx_threshold;
 
+       /* Task updating hw stats */
+       struct task stats_task;
+       struct taskqueue *stats_tq;
+
        /* Statistics */
        struct ena_stats_dev dev_stats;
        struct ena_hw_stats hw_stats;

Modified: releng/11.1/sys/modules/Makefile
==============================================================================
--- releng/11.1/sys/modules/Makefile    Thu Jul  6 22:34:54 2017        
(r320759)
+++ releng/11.1/sys/modules/Makefile    Fri Jul  7 00:34:51 2017        
(r320760)
@@ -109,6 +109,7 @@ SUBDIR=     \
        ${_efirt} \
        ${_elink} \
        ${_em} \
+       ${_ena} \
        en \
        ${_ep} \
        ${_epic} \
@@ -575,6 +576,7 @@ _drm=               drm
 _drm2=         drm2
 _ed=           ed
 _em=           em
+_ena=          ena
 _ep=           ep
 _et=           et
 _exca=         exca
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to