Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Sep 2016 07:39:42 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r305966 - head/sys/dev/hyperv/netvsc
Message-ID:  <201609190739.u8J7dge6038791@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Mon Sep 19 07:39:42 2016
New Revision: 305966
URL: https://svnweb.freebsd.org/changeset/base/305966

Log:
  hyperv/hn: Stringent RSS sysctl checks
  
  - Don't change RNDIS RSS configuration for RSS key sysctl, if the
    interface is not capable of RSS yet.
  - Don't change RSS indirect table (both cached one and RNDIS RSS
    configuration), if the interface is not capable of RSS yet.
  
  MFC after:	1 week
  Sponsored by:	Microsoft
  Differential Revision:	https://reviews.freebsd.org/D7924

Modified:
  head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c

Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c	Mon Sep 19 07:32:08 2016	(r305965)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c	Mon Sep 19 07:39:42 2016	(r305966)
@@ -435,6 +435,8 @@ hn_rss_ind_fixup(struct hn_softc *sc, in
 	struct ndis_rssprm_toeplitz *rss = &sc->hn_rss;
 	int i;
 
+	KASSERT(nchan > 1, ("invalid # of channels %d", nchan));
+
 	/*
 	 * Check indirect table to make sure that all channels in it
 	 * can be used.
@@ -2145,7 +2147,12 @@ hn_rss_key_sysctl(SYSCTL_HANDLER_ARGS)
 	if (error)
 		goto back;
 
-	error = hn_rss_reconfig(sc);
+	if (sc->hn_rx_ring_inuse > 1) {
+		error = hn_rss_reconfig(sc);
+	} else {
+		/* Not RSS capable, at least for now; just save the RSS key. */
+		error = 0;
+	}
 back:
 	HN_UNLOCK(sc);
 	return (error);
@@ -2163,6 +2170,15 @@ hn_rss_ind_sysctl(SYSCTL_HANDLER_ARGS)
 	if (error || req->newptr == NULL)
 		goto back;
 
+	/*
+	 * Don't allow RSS indirect table change, if this interface is not
+	 * RSS capable currently.
+	 */
+	if (sc->hn_rx_ring_inuse == 1) {
+		error = EOPNOTSUPP;
+		goto back;
+	}
+
 	error = SYSCTL_IN(req, sc->hn_rss.rss_ind, sizeof(sc->hn_rss.rss_ind));
 	if (error)
 		goto back;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201609190739.u8J7dge6038791>