Print this page
1925 stack overflow from mac code

*** 20,36 **** --- 20,41 ---- */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ + /* + * Copyright 2011 Joyent, Inc. All rights reserved. + */ #include <sys/types.h> #include <sys/callb.h> #include <sys/sdt.h> #include <sys/strsubr.h> #include <sys/strsun.h> #include <sys/vlan.h> + #include <sys/stack.h> + #include <sys/archsystm.h> #include <inet/ipsec_impl.h> #include <inet/ip_impl.h> #include <inet/sadb.h> #include <inet/ipsecesp.h> #include <inet/ipsecah.h>
*** 413,422 **** --- 418,449 ---- cookie = (mac_tx_cookie_t)srs; \ *ret_mp = mp_chain; \ } /* + * MAC_RX_SRS_TOODEEP + * + * Macro called as part of receive-side processing to determine if handling + * can occur in situ (in the interrupt thread) or if it should be left to a + * worker thread. Note that the constant used to make this determination is + * not entirely made-up, and is a result of some emprical validation. That + * said, the constant is left as a static variable to allow it to be + * dynamically tuned in the field if and as needed. + */ + static uintptr_t mac_rx_srs_stack_needed = 10240; + static uint_t mac_rx_srs_stack_toodeep; + + #ifndef STACK_GROWTH_DOWN + #error Downward stack growth assumed. + #endif + + #define MAC_RX_SRS_TOODEEP() (STACK_BIAS + (uintptr_t)getfp() - \ + (uintptr_t)curthread->t_stkbase < mac_rx_srs_stack_needed && \ + ++mac_rx_srs_stack_toodeep) + + + /* * Drop the rx packet and advance to the next one in the chain. */ static void mac_rx_drop_pkt(mac_soft_ring_set_t *srs, mblk_t *mp) {
*** 2417,2431 **** MAC_RX_SRS_ENQUEUE_CHAIN(mac_srs, mp_chain, tail, count, sz); if (!(mac_srs->srs_state & SRS_PROC)) { /* ! * If we are coming via loopback or if we are not ! * optimizing for latency, we should signal the ! * worker thread. */ ! if (loopback || !(mac_srs->srs_state & SRS_LATENCY_OPT)) { /* * For loopback, We need to let the worker take * over as we don't want to continue in the same * thread even if we can. This could lead to stack * overflows and may also end up using --- 2444,2459 ---- MAC_RX_SRS_ENQUEUE_CHAIN(mac_srs, mp_chain, tail, count, sz); if (!(mac_srs->srs_state & SRS_PROC)) { /* ! * If we are coming via loopback, if we are not optimizing for ! * latency, or if our stack is running deep, we should signal ! * the worker thread. */ ! if (loopback || !(mac_srs->srs_state & SRS_LATENCY_OPT) || ! MAC_RX_SRS_TOODEEP()) { /* * For loopback, We need to let the worker take * over as we don't want to continue in the same * thread even if we can. This could lead to stack * overflows and may also end up using