The branch main has been updated by kbowling (ports committer):

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

commit 9b3e252e59c6e63594fb20e3f65188dab9e1eeff
Author:     Kevin Bowling <kbowl...@freebsd.org>
AuthorDate: 2021-10-06 23:20:26 +0000
Commit:     Kevin Bowling <kbowl...@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");
 }
 

Reply via email to