3 problems with Pine64+ 12.0-CURRENT r328259

Henri Hennebert hlh at restart.be
Mon Jan 29 13:16:09 UTC 2018


Hello,

I encounter some problems with r328259 on Pine64+ 2GB

1. to complete boot I must boot in verbose mode else kernel freeze after:

...
Timecounters tick every 1.000 msec
usbus0: 480Mbps High Speed USB v2.0
usbus1: 12Mbps Full Speed USB v1.0
--- freeze ---

2. If I run multiple times `periodic daily` with root on a USB disk 
connected with a auto powered hub, time drift too fast even with ntpd 
running.

3. The connection to internet with mpd5 and a box in bridge mode has
a sluggish throughput (7 to 9 KB/s)
The same config running r320599 has a throughput of 3 to 4MB/s. This
r320599 run with this patch (Bug 220140):

--- sys/netgraph/ng_iface.c.orig	2017-06-19 19:50:51.428612000 +0700
+++ sys/netgraph/ng_iface.c	2017-06-19 19:51:31.196104000 +0700
@@ -64,6 +64,7 @@
  #include <sys/errno.h>
  #include <sys/proc.h>
  #include <sys/random.h>
+#include <sys/rmlock.h>
  #include <sys/sockio.h>
  #include <sys/socket.h>
  #include <sys/syslog.h>
@@ -112,9 +113,15 @@ struct ng_iface_private {
  	int	unit;			/* Interface unit number */
  	node_p	node;			/* Our netgraph node */
  	hook_p	hooks[NUM_FAMILIES];	/* Hook for each address family */
+	struct rmlock	lock;		/* Protect private data changes */
  };
  typedef struct ng_iface_private *priv_p;

+#define	PRIV_RLOCK(priv, t)	rm_rlock(&priv->lock, t)
+#define	PRIV_RUNLOCK(priv, t)	rm_runlock(&priv->lock, t)
+#define	PRIV_WLOCK(priv)	rm_wlock(&priv->lock)
+#define	PRIV_WUNLOCK(priv)	rm_wunlock(&priv->lock)
+
  /* Interface methods */
  static void	ng_iface_start(struct ifnet *ifp);
  static int	ng_iface_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
@@ -431,6 +438,7 @@ ng_iface_bpftap(struct ifnet *ifp, struc
  static int
  ng_iface_send(struct ifnet *ifp, struct mbuf *m, sa_family_t sa)
  {
+	struct rm_priotracker priv_tracker;
  	const priv_p priv = (priv_p) ifp->if_softc;
  	const iffam_p iffam = get_iffam_from_af(sa);
  	int error;
@@ -448,7 +456,9 @@ ng_iface_send(struct ifnet *ifp, struct

  	/* Send packet. If hook is not connected, mbuf will get freed. */
  	NG_OUTBOUND_THREAD_REF();
+	PRIV_RLOCK(priv, &priv_tracker);
  	NG_SEND_DATA_ONLY(error, *get_hook_from_iffam(priv, iffam), m);
+	PRIV_RUNLOCK(priv, &priv_tracker);
  	NG_OUTBOUND_THREAD_UNREF();

  	/* Update stats. */
@@ -516,6 +526,8 @@ ng_iface_constructor(node_p node)
  		return (ENOMEM);
  	}

+	rm_init(&priv->lock, "ng_iface private rmlock");
+
  	/* Link them together */
  	ifp->if_softc = priv;
  	priv->ifp = ifp;
@@ -562,16 +574,21 @@ static int
  ng_iface_newhook(node_p node, hook_p hook, const char *name)
  {
  	const iffam_p iffam = get_iffam_from_name(name);
+	const priv_p priv = NG_NODE_PRIVATE(node);
  	hook_p *hookptr;

  	if (iffam == NULL)
  		return (EPFNOSUPPORT);
-	hookptr = get_hook_from_iffam(NG_NODE_PRIVATE(node), iffam);
-	if (*hookptr != NULL)
+	PRIV_WLOCK(priv);
+	hookptr = get_hook_from_iffam(priv, iffam);
+	if (*hookptr != NULL) {
+		PRIV_WUNLOCK(priv);
  		return (EISCONN);
+	}
  	*hookptr = hook;
  	NG_HOOK_HI_STACK(hook);
  	NG_HOOK_SET_TO_INBOUND(hook);
+	PRIV_WUNLOCK(priv);
  	return (0);
  }

@@ -730,6 +747,7 @@ ng_iface_shutdown(node_p node)
  	CURVNET_RESTORE();
  	priv->ifp = NULL;
  	free_unr(V_ng_iface_unit, priv->unit);
+	rm_destroy(&priv->lock);
  	free(priv, M_NETGRAPH_IFACE);
  	NG_NODE_SET_PRIVATE(node, NULL);
  	NG_NODE_UNREF(node);
@@ -748,7 +766,9 @@ ng_iface_disconnect(hook_p hook)

  	if (iffam == NULL)
  		panic("%s", __func__);
+	PRIV_WLOCK(priv);
  	*get_hook_from_iffam(priv, iffam) = NULL;
+	PRIV_WUNLOCK(priv);
  	return (0);
  }

Does someone else encounter those problems?

Henri


More information about the freebsd-arm mailing list