Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Aug 2018 05:06:17 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r338236 - in head: sbin/devmatch sys/kern sys/sys
Message-ID:  <201808230506.w7N56HjE062942@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Thu Aug 23 05:06:16 2018
New Revision: 338236
URL: https://svnweb.freebsd.org/changeset/base/338236

Log:
  Add a new device flag: DF_ATTACHED_ONCE
  
  This flag is set once the device has been successfully attached. When
  set, it inhibits devmatch from trying to match the device. This in
  turn allows kldunload to work as expected. Prior to the change, the
  driver would immediately reload because devmatch had no notion that
  the driver had once been attached, and therefore shouldn't participate
  in further matching.
  
  Differential Revision: https://reviews.freebsd.org/D16735

Modified:
  head/sbin/devmatch/devmatch.c
  head/sys/kern/subr_bus.c
  head/sys/sys/bus.h

Modified: head/sbin/devmatch/devmatch.c
==============================================================================
--- head/sbin/devmatch/devmatch.c	Thu Aug 23 05:06:11 2018	(r338235)
+++ head/sbin/devmatch/devmatch.c	Thu Aug 23 05:06:16 2018	(r338236)
@@ -422,6 +422,8 @@ find_unmatched(struct devinfo_dev *dev, void *arg)
 			break;
 		if (!(dev->dd_flags & DF_ENABLED))
 			break;
+		if (dev->dd_flags & DF_ATTACHED_ONCE)
+			break;
 		parent = devinfo_handle_to_device(dev->dd_parent);
 		bus = strdup(parent->dd_name);
 		p = bus + strlen(bus) - 1;

Modified: head/sys/kern/subr_bus.c
==============================================================================
--- head/sys/kern/subr_bus.c	Thu Aug 23 05:06:11 2018	(r338235)
+++ head/sys/kern/subr_bus.c	Thu Aug 23 05:06:16 2018	(r338236)
@@ -2950,6 +2950,7 @@ device_attach(device_t dev)
 		dev->state = DS_NOTPRESENT;
 		return (error);
 	}
+	dev->flags |= DF_ATTACHED_ONCE;
 	attachtime = get_cyclecount() - attachtime;
 	/*
 	 * 4 bits per device is a reasonable value for desktop and server

Modified: head/sys/sys/bus.h
==============================================================================
--- head/sys/sys/bus.h	Thu Aug 23 05:06:11 2018	(r338235)
+++ head/sys/sys/bus.h	Thu Aug 23 05:06:16 2018	(r338236)
@@ -93,6 +93,7 @@ struct u_device {
 #define	DF_REBID	0x80		/* Can rebid after attach */
 #define	DF_SUSPENDED	0x100		/* Device is suspended. */
 #define	DF_QUIET_CHILDREN 0x200		/* Default to quiet for all my children */
+#define	DF_ATTACHED_ONCE 0x400		/* Has been attached at least once */
 #define	DF_NEEDNOMATCH	0x800		/* Has a pending NOMATCH event */
 
 /**



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