On 10 May 2019, at 2:41, Eric Joyner wrote:
Author: erj
Date: Fri May 10 00:41:42 2019
New Revision: 347418
URL: https://svnweb.freebsd.org/changeset/base/347418

Log:
  iflib: use default ntxd and nrxd when user value is not power of 2

  From Jake:
  A user may set a sysctl to override the default number of Tx or Rx
descriptors. However, certain calculations in the iflib core expect the
  number of descriptors to be a power of 2.

Update _iflib_assert to verify that all of the shared context parameters
  for the number of descriptors are powers of 2.

Modify iflib_reset_qvalues to check that the provided isc_nrxd value is
  a power of 2. If it's not, print a warning message and then use the
  default value.

  An alternative might be to try rounding the number down instead.
However, this creates problems in case the rounded down value is below
  the minimum value that the driver would support.

This commit appears to trigger a panic I see on a system with a Broadcom BCM57416 (if_bnxt) nic.

It trips over the power of two assertion:

panic: Assertion powerof2(sctx->isc_nrxd_max[i]) failed at /usr/src/sys/net/iflib.c:5320
        Tracing pid 0 tid 100000 td 0xffffffff81c8c640
        kdb_enter() at kdb_enter+0x37/frame 0xffffffff825be990
        vpanic() at vpanic+0x19e/frame 0xffffffff825be9e0
        panic() at panic+0x43/frame 0xffffffff825bea40
        iflib_register() at iflib_register+0x340/frame 0xffffffff825bea80
iflib_device_register() at iflib_device_register+0x9f/frame 0xffffffff825bee10 iflib_device_attach() at iflib_device_attach+0xb5/frame 0xffffffff825bee40
        device_attach() at device_attach+0x3ca/frame 0xffffffff825bee80
device_probe_and_attach() at device_probe_and_attach+0x70/frame 0xffffffff825beeb0 bus_generic_attach() at bus_generic_attach+0x18/frame 0xffffffff825beed0
        pci_attach() at pci_attach+0xe0/frame 0xffffffff825bef10
        acpi_pci_attach() at acpi_pci_attach+0x19/frame 0xffffffff825bf150
        device_attach() at device_attach+0x3ca/frame 0xffffffff825bf190
device_probe_and_attach() at device_probe_and_attach+0x70/frame 0xffffffff825bf1c0 bus_generic_attach() at bus_generic_attach+0x18/frame 0xffffffff825bf1e0 acpi_pcib_acpi_attach() at acpi_pcib_acpi_attach+0x431/frame 0xffffffff825bf250
        device_attach() at device_attach+0x3ca/frame 0xffffffff825bf290
device_probe_and_attach() at device_probe_and_attach+0x70/frame 0xffffffff825bf2c0 bus_generic_attach() at bus_generic_attach+0x18/frame 0xffffffff825bf2e0
        acpi_attach() at acpi_attach+0xbb7/frame 0xffffffff825bf370
        device_attach() at device_attach+0x3ca/frame 0xffffffff825bf3b0
device_probe_and_attach() at device_probe_and_attach+0x70/frame 0xffffffff825bf3e0 bus_generic_attach() at bus_generic_attach+0x18/frame 0xffffffff825bf400
        device_attach() at device_attach+0x3ca/frame 0xffffffff825bf440
device_probe_and_attach() at device_probe_and_attach+0x70/frame 0xffffffff825bf470 bus_generic_new_pass() at bus_generic_new_pass+0xed/frame 0xffffffff825bf4a0
        bus_set_pass() at bus_set_pass+0x46/frame 0xffffffff825bf4d0
        configure() at configure+0x9/frame 0xffffffff825bf4e0
        mi_startup() at mi_startup+0xec/frame 0xffffffff825bf530
        btext() at btext+0x2c

The if_bnxt driver initialises `.isc_nrxd_max = {INT32_MAX, INT32_MAX, INT32_MAX},`, so presumably that’s the cause. I don’t know what a sane value would be though. I’ve defaulted to 4096 (because that’s what some other iflib users seems to do) for now, and that seems to work. It doesn’t panic and I can get traffic through it at least:

        diff --git a/sys/dev/bnxt/if_bnxt.c b/sys/dev/bnxt/if_bnxt.c
        index 50827106024..3958d95cab9 100644
        --- a/sys/dev/bnxt/if_bnxt.c
        +++ b/sys/dev/bnxt/if_bnxt.c
        @@ -316,11 +316,11 @@ static struct if_shared_ctx bnxt_sctx_init = {
                .isc_nrxd_default = {PAGE_SIZE / sizeof(struct cmpl_base) * 8,
                    PAGE_SIZE / sizeof(struct rx_prod_pkt_bd),
                    PAGE_SIZE / sizeof(struct rx_prod_pkt_bd)},
        -       .isc_nrxd_max = {INT32_MAX, INT32_MAX, INT32_MAX},
        +       .isc_nrxd_max = {4096, 4096, 4096},
                .isc_ntxd_min = {16, 16, 16},
                .isc_ntxd_default = {PAGE_SIZE / sizeof(struct cmpl_base) * 2,
                    PAGE_SIZE / sizeof(struct tx_bd_short)},
        -       .isc_ntxd_max = {INT32_MAX, INT32_MAX, INT32_MAX},
        +       .isc_ntxd_max = {4096, 4096, 4096},

                .isc_admin_intrcnt = 1,
                .isc_vendor_info = bnxt_vendor_info_array,


Best regards,
Kristof
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to