git: 9b3e252e59c6 - main - e1000: Lock nvm print sysctl

From: Kevin Bowling <kbowling_at_FreeBSD.org>
Date: Wed, 06 Oct 2021 23:23:59 UTC
The branch main has been updated by kbowling (ports committer):

URL: https://cgit.FreeBSD.org/src/commit/?id=9b3e252e59c6e63594fb20e3f65188dab9e1eeff

commit 9b3e252e59c6e63594fb20e3f65188dab9e1eeff
Author:     Kevin Bowling <kbowling@FreeBSD.org>
AuthorDate: 2021-10-06 23:20:26 +0000
Commit:     Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2021-10-06 23:20:26 +0000

    e1000: Lock nvm print sysctl
    
    Otherwise results in KASSERT with debug kernels because we rely on the
    iflib CTX lock to implement the software serialization to the NVM model
    
    Reviewed by:    gallatin
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D32333
---
 sys/dev/e1000/if_em.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index 3153a44000c5..52eff393e848 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -4510,20 +4510,27 @@ em_sysctl_nvm_info(SYSCTL_HANDLER_ARGS)
 static void
 em_print_nvm_info(struct e1000_softc *sc)
 {
+	struct e1000_hw *hw = &sc->hw;
+	struct sx *iflib_ctx_lock = iflib_ctx_lock_get(sc->ctx);
 	u16 eeprom_data;
 	int i, j, row = 0;
 
 	/* Its a bit crude, but it gets the job done */
 	printf("\nInterface EEPROM Dump:\n");
 	printf("Offset\n0x0000  ");
+
+	/* We rely on the IFLIB_CTX_LOCK as part of NVM locking model */
+	sx_xlock(iflib_ctx_lock);
+	ASSERT_CTX_LOCK_HELD(hw);
 	for (i = 0, j = 0; i < 32; i++, j++) {
 		if (j == 8) { /* Make the offset block */
 			j = 0; ++row;
 			printf("\n0x00%x0  ",row);
 		}
-		e1000_read_nvm(&sc->hw, i, 1, &eeprom_data);
+		e1000_read_nvm(hw, i, 1, &eeprom_data);
 		printf("%04x ", eeprom_data);
 	}
+	sx_xunlock(iflib_ctx_lock);
 	printf("\n");
 }