Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/xen/xen remove support for legacy rx-flip mode for ...



details:   https://anonhg.NetBSD.org/src/rev/05d070f9d1c6
branches:  trunk
changeset: 850499:05d070f9d1c6
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Sun Apr 05 17:26:46 2020 +0000

description:
remove support for legacy rx-flip mode for xennet(4)/xvif(4), making
rx-copy (first shipped in NetBSD 6.0 in 2012) the only supported
mode

this is mostly to simplify maintenance and future development

rx-flip is not supported by Linux Dom0/DomU, and NetBSD Dom0/DomU
defaults to rx-copy for over 8 years now too, so there is little
need to keep the support for compatibility

besides compatibility there is no other reason to keep rx-flip -
page transfer is generally slower than copy due to necessary MMU/TLB
manipulation, especially on MP systems

diffstat:

 sys/arch/xen/xen/if_xennet_xenbus.c  |  196 +-----------------
 sys/arch/xen/xen/xennetback_xenbus.c |  364 +----------------------------------
 2 files changed, 25 insertions(+), 535 deletions(-)

diffs (truncated from 736 to 300 lines):

diff -r ad0f14264a63 -r 05d070f9d1c6 sys/arch/xen/xen/if_xennet_xenbus.c
--- a/sys/arch/xen/xen/if_xennet_xenbus.c       Sun Apr 05 15:41:45 2020 +0000
+++ b/sys/arch/xen/xen/if_xennet_xenbus.c       Sun Apr 05 17:26:46 2020 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: if_xennet_xenbus.c,v 1.98 2020/04/05 14:20:18 jdolecek Exp $      */
+/*      $NetBSD: if_xennet_xenbus.c,v 1.99 2020/04/05 17:26:46 jdolecek Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -81,7 +81,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.98 2020/04/05 14:20:18 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.99 2020/04/05 17:26:46 jdolecek Exp $");
 
 #include "opt_xen.h"
 #include "opt_nfs_boot.h"
@@ -208,18 +208,11 @@
 #define BEST_DISCONNECTED      1
 #define BEST_CONNECTED         2
 #define BEST_SUSPENDED         3
-       unsigned long sc_rx_feature;
-#define FEATURE_RX_FLIP                0
-#define FEATURE_RX_COPY                1
        krndsource_t sc_rnd_source;
 };
 #define SC_NLIVEREQ(sc) ((sc)->sc_rx_ring.req_prod_pvt - \
                            (sc)->sc_rx_ring.sring->rsp_prod)
 
-/* too big to be on stack */
-static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1];
-static u_long xennet_pages[NET_RX_RING_SIZE];
-
 static pool_cache_t if_xennetrxbuf_cache;
 static int if_xennetrxbuf_cache_inited=0;
 
@@ -551,16 +544,12 @@
 
        error = xenbus_read_ul(NULL, sc->sc_xbusd->xbusd_otherend,
            "feature-rx-copy", &rx_copy, 10);
-       if (error)
-               rx_copy = 0; /* default value if key is absent */
-
-       if (rx_copy == 1) {
-               aprint_normal_dev(sc->sc_dev, "using RX copy mode\n");
-               sc->sc_rx_feature = FEATURE_RX_COPY;
-       } else {
-               aprint_normal_dev(sc->sc_dev, "using RX flip mode\n");
-               sc->sc_rx_feature = FEATURE_RX_FLIP;
+       if (error || !rx_copy) {
+               xenbus_dev_fatal(sc->sc_xbusd, error,
+                   "feature-rx-copy not supported");
+               return false;
        }
+       aprint_normal_dev(sc->sc_dev, "using RX copy mode\n");
 
 again:
        xbt = xenbus_transaction_start();
@@ -705,8 +694,7 @@
        RING_IDX req_prod = sc->sc_rx_ring.req_prod_pvt;
        RING_IDX i;
        struct xennet_rxreq *req;
-       struct xen_memory_reservation reservation;
-       int s, otherend_id, notify;
+       int otherend_id, notify;
 
        otherend_id = sc->sc_xbusd->xbusd_otherend_id;
 
@@ -718,23 +706,10 @@
                RING_GET_REQUEST(&sc->sc_rx_ring, req_prod + i)->id =
                    req->rxreq_id;
 
-               switch (sc->sc_rx_feature) {
-               case FEATURE_RX_COPY:
-                       if (xengnt_grant_access(otherend_id,
-                           xpmap_ptom_masked(req->rxreq_pa),
-                           0, &req->rxreq_gntref) != 0) {
-                               goto out_loop;
-                       }
-                       break;
-               case FEATURE_RX_FLIP:
-                       if (xengnt_grant_transfer(otherend_id,
-                           &req->rxreq_gntref) != 0) {
-                               goto out_loop;
-                       }
-                       break;
-               default:
-                       panic("%s: unsupported RX feature mode: %ld\n",
-                           __func__, sc->sc_rx_feature);
+               if (xengnt_grant_access(otherend_id,
+                   xpmap_ptom_masked(req->rxreq_pa),
+                   0, &req->rxreq_gntref) != 0) {
+                       goto out_loop;
                }
 
                RING_GET_REQUEST(&sc->sc_rx_ring, req_prod + i)->gref =
@@ -742,19 +717,6 @@
 
                SLIST_REMOVE_HEAD(&sc->sc_rxreq_head, rxreq_next);
                sc->sc_free_rxreql--;
-
-               if (sc->sc_rx_feature == FEATURE_RX_FLIP) {
-                       /* unmap the page */
-                       MULTI_update_va_mapping(&rx_mcl[i],
-                           req->rxreq_va, 0, 0);
-                       /*
-                        * Remove this page from pseudo phys map before
-                        * passing back to Xen.
-                        */
-                       xennet_pages[i] =
-                           xpmap_ptom(req->rxreq_pa) >> PAGE_SHIFT;
-                       xpmap_ptom_unmap(req->rxreq_pa);
-               }
        }
 
 out_loop:
@@ -762,34 +724,6 @@
                return;
        }
 
-       if (sc->sc_rx_feature == FEATURE_RX_FLIP) {
-               /* also make sure to flush all TLB entries */
-               rx_mcl[i-1].args[MULTI_UVMFLAGS_INDEX] =
-                   UVMF_TLB_FLUSH | UVMF_ALL;
-               /*
-                * We may have allocated buffers which have entries
-                * outstanding in the page update queue -- make sure we flush
-                * those first!
-                */
-               s = splvm(); /* XXXSMP */
-               xpq_flush_queue();
-               splx(s);
-               /* now decrease reservation */
-               set_xen_guest_handle(reservation.extent_start, xennet_pages);
-               reservation.nr_extents = i;
-               reservation.extent_order = 0;
-               reservation.address_bits = 0;
-               reservation.domid = DOMID_SELF;
-               rx_mcl[i].op = __HYPERVISOR_memory_op;
-               rx_mcl[i].args[0] = XENMEM_decrease_reservation;
-               rx_mcl[i].args[1] = (unsigned long)&reservation;
-               HYPERVISOR_multicall(rx_mcl, i+1);
-               if (__predict_false(rx_mcl[i].result != i)) {
-                       panic("xennet_alloc_rx_buffer: "
-                           "XENMEM_decrease_reservation");
-               }
-       }
-
        sc->sc_rx_ring.req_prod_pvt = req_prod + i;
        RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&sc->sc_rx_ring, notify);
        if (notify)
@@ -803,11 +737,7 @@
 static void
 xennet_free_rx_buffer(struct xennet_xenbus_softc *sc)
 {
-       paddr_t ma, pa;
-       vaddr_t va;
        RING_IDX i;
-       mmu_update_t mmu[1];
-       multicall_entry_t mcl[2];
 
        mutex_enter(&sc->sc_rx_lock);
 
@@ -825,56 +755,8 @@
                            rxreq_next);
                        sc->sc_free_rxreql++;
 
-                       switch (sc->sc_rx_feature) {
-                       case FEATURE_RX_COPY:
-                               xengnt_revoke_access(rxreq->rxreq_gntref);
-                               rxreq->rxreq_gntref = GRANT_INVALID_REF;
-                               break;
-                       case FEATURE_RX_FLIP:
-                               ma = xengnt_revoke_transfer(
-                                   rxreq->rxreq_gntref);
-                               rxreq->rxreq_gntref = GRANT_INVALID_REF;
-                               if (ma == 0) {
-                                       u_long pfn;
-                                       struct xen_memory_reservation xenres;
-                                       /*
-                                        * transfer not complete, we lost the page.
-                                        * Get one from hypervisor
-                                        */
-                                       set_xen_guest_handle(
-                                           xenres.extent_start, &pfn);
-                                       xenres.nr_extents = 1;
-                                       xenres.extent_order = 0;
-                                       xenres.address_bits = 31;
-                                       xenres.domid = DOMID_SELF;
-                                       if (HYPERVISOR_memory_op(
-                                           XENMEM_increase_reservation, &xenres) < 0) {
-                                               panic("xennet_free_rx_buffer: "
-                                                   "can't get memory back");
-                                       }
-                                       ma = pfn;
-                                       KASSERT(ma != 0);
-                               }
-                               pa = rxreq->rxreq_pa;
-                               va = rxreq->rxreq_va;
-                               /* remap the page */
-                               mmu[0].ptr = (ma << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
-                               mmu[0].val = pa >> PAGE_SHIFT;
-                               MULTI_update_va_mapping(&mcl[0], va,
-                                   (ma << PAGE_SHIFT) | PTE_P | PTE_W | xpmap_pg_nx,
-                                   UVMF_TLB_FLUSH|UVMF_ALL);
-                               xpmap_ptom_map(pa, ptoa(ma));
-                               mcl[1].op = __HYPERVISOR_mmu_update;
-                               mcl[1].args[0] = (unsigned long)mmu;
-                               mcl[1].args[1] = 1;
-                               mcl[1].args[2] = 0;
-                               mcl[1].args[3] = DOMID_SELF;
-                               HYPERVISOR_multicall(mcl, 2);
-                               break;
-                       default:
-                               panic("%s: unsupported RX feature mode: %ld\n",
-                                   __func__, sc->sc_rx_feature);
-                       }
+                       xengnt_revoke_access(rxreq->rxreq_gntref);
+                       rxreq->rxreq_gntref = GRANT_INVALID_REF;
                }
 
        }
@@ -981,10 +863,8 @@
        struct ifnet *ifp = &sc->sc_ethercom.ec_if;
        RING_IDX resp_prod, i;
        struct xennet_rxreq *req;
-       paddr_t ma, pa;
+       paddr_t pa;
        vaddr_t va;
-       mmu_update_t mmu[1];
-       multicall_entry_t mcl[2];
        struct mbuf *m;
        void *pktp;
        int more_to_do;
@@ -1011,55 +891,11 @@
                KASSERT(req->rxreq_gntref != GRANT_INVALID_REF);
                KASSERT(req->rxreq_id == rx->id);
 
-               ma = 0;
-               switch (sc->sc_rx_feature) {
-               case FEATURE_RX_COPY:
-                       xengnt_revoke_access(req->rxreq_gntref);
-                       break;
-               case FEATURE_RX_FLIP:
-                       ma = xengnt_revoke_transfer(req->rxreq_gntref);
-                       if (ma == 0) {
-                               DPRINTFN(XEDB_EVENT, ("xennet_handler ma == 0\n"));
-                               /*
-                                * the remote could't send us a packet.
-                                * we can't free this rxreq as no page will be mapped
-                                * here. Instead give it back immediatly to backend.
-                                */
-                               if_statinc(ifp, if_ierrors);
-                               RING_GET_REQUEST(&sc->sc_rx_ring,
-                                   sc->sc_rx_ring.req_prod_pvt)->id = req->rxreq_id;
-                               RING_GET_REQUEST(&sc->sc_rx_ring,
-                                   sc->sc_rx_ring.req_prod_pvt)->gref =
-                                       req->rxreq_gntref;
-                               sc->sc_rx_ring.req_prod_pvt++;
-                               RING_PUSH_REQUESTS(&sc->sc_rx_ring);
-                               continue;
-                       }
-                       break;
-               default:
-                       panic("%s: unsupported RX feature mode: %ld\n",
-                           __func__, sc->sc_rx_feature);
-               }
+               xengnt_revoke_access(req->rxreq_gntref);
 
                pa = req->rxreq_pa;
                va = req->rxreq_va;
 
-               if (sc->sc_rx_feature == FEATURE_RX_FLIP) {
-                       /* remap the page */
-                       mmu[0].ptr = (ma << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
-                       mmu[0].val = pa >> PAGE_SHIFT;
-                       MULTI_update_va_mapping(&mcl[0], va,
-                           (ma << PAGE_SHIFT) | PTE_P | PTE_W | xpmap_pg_nx,
-                           UVMF_TLB_FLUSH|UVMF_ALL);
-                       xpmap_ptom_map(pa, ptoa(ma));
-                       mcl[1].op = __HYPERVISOR_mmu_update;
-                       mcl[1].args[0] = (unsigned long)mmu;
-                       mcl[1].args[1] = 1;
-                       mcl[1].args[2] = 0;
-                       mcl[1].args[3] = DOMID_SELF;
-                       HYPERVISOR_multicall(mcl, 2);
-               }
-
                pktp = (void *)(va + rx->offset);
 #ifdef XENNET_DEBUG_DUMP
                xennet_hex_dump(pktp, rx->status, "r", rx->id);
diff -r ad0f14264a63 -r 05d070f9d1c6 sys/arch/xen/xen/xennetback_xenbus.c
--- a/sys/arch/xen/xen/xennetback_xenbus.c      Sun Apr 05 15:41:45 2020 +0000
+++ b/sys/arch/xen/xen/xennetback_xenbus.c      Sun Apr 05 17:26:46 2020 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: xennetback_xenbus.c,v 1.91 2020/04/04 14:45:37 jdolecek Exp $      */
+/*      $NetBSD: xennetback_xenbus.c,v 1.92 2020/04/05 17:26:46 jdolecek Exp $      */
 
 /*



Home | Main Index | Thread Index | Old Index