#ifndef MPOA_CACHES_H #define MPOA_CACHES_H #include #include #include #include #include struct mpoa_client; void atm_mpoa_init_cache(struct mpoa_client *mpc); typedef struct in_cache_entry { struct in_cache_entry *next; struct in_cache_entry *prev; struct timeval tv; struct timeval reply_wait; struct timeval hold_down; uint32_t packets_fwded; uint16_t entry_state; uint32_t retry_time; uint32_t refresh_time; uint32_t count; struct atm_vcc *shortcut; uint8_t MPS_ctrl_ATM_addr[ATM_ESA_LEN]; struct in_ctrl_info ctrl_info; atomic_t use; } in_cache_entry; struct in_cache_ops{ in_cache_entry *(*add_entry)(__be32 dst_ip, struct mpoa_client *client); in_cache_entry *(*get)(__be32 dst_ip, struct mpoa_client *client); in_cache_entry *(*get_with_mask)(__be32 dst_ip, struct mpoa_client *client, __be32 mask); in_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc, struct mpoa_client *client); void (*put)(in_cache_entry *entry); void (*remove_entry)(in_cache_entry *delEntry, struct mpoa_client *client ); int (*cache_hit)(in_cache_entry *entry, struct mpoa_client *client); void (*clear_count)(struct mpoa_client *client); void (*check_resolving)(struct mpoa_client *client); void (*refresh)(struct mpoa_client *client); void (*destroy_cache)(struct mpoa_client *mpc); }; typedef struct eg_cache_entry{ struct eg_cache_entry *next; struct eg_cache_entry *prev; struct timeval tv; uint8_t MPS_ctrl_ATM_addr[ATM_ESA_LEN]; struct atm_vcc *shortcut; uint32_t packets_rcvd; uint16_t entry_state; __be32 latest_ip_addr; /* The src IP address of the last packet */ struct eg_ctrl_info ctrl_info; atomic_t use; } eg_cache_entry; struct eg_cache_ops{ eg_cache_entry *(*add_entry)(struct k_message *msg, struct mpoa_client *client); eg_cache_entry *(*get_by_cache_id)(__be32 cache_id, struct mpoa_client *client); eg_cache_entry *(*get_by_tag)(__be32 cache_id, struct mpoa_client *client); eg_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc, struct mpoa_client *client); eg_cache_entry *(*get_by_src_ip)(__be32 ipaddr, struct mpoa_client *client); void (*put)(eg_cache_entry *entry); void (*remove_entry)(eg_cache_entry *entry, struct mpoa_client *client); void (*update)(eg_cache_entry *entry, uint16_t holding_time); void (*clear_expired)(struct mpoa_client *client); void (*destroy_cache)(struct mpoa_client *mpc); }; /* Ingress cache entry states */ #define INGRESS_REFRESHING 3 #define INGRESS_RESOLVED 2 #define INGRESS_RESOLVING 1 #define INGRESS_INVALID 0 /* VCC states */ #define OPEN 1 #define CLOSED 0 /* Egress cache entry states */ #define EGRESS_RESOLVED 2 #define EGRESS_PURGE 1 #define EGRESS_INVALID 0 #endif 828785b589f686725ff5bc3b9b25'>class/Kconfig
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2017-01-31 09:37:34 +0100
committerThomas Gleixner <tglx@linutronix.de>2017-01-31 21:47:58 +0100
commit0becc0ae5b42828785b589f686725ff5bc3b9b25 (patch)
treebe6d0e1f37c38ed0a7dd5da2d4b1e93f0fb43101 /drivers/usb/class/Kconfig
parent24c2503255d35c269b67162c397a1a1c1e02f6ce (diff)
x86/mce: Make timer handling more robust
Erik reported that on a preproduction hardware a CMCI storm triggers the BUG_ON in add_timer_on(). The reason is that the per CPU MCE timer is started by the CMCI logic before the MCE CPU hotplug callback starts the timer with add_timer_on(). So the timer is already queued which triggers the BUG. Using add_timer_on() is pretty pointless in this code because the timer is strictlty per CPU, initialized as pinned and all operations which arm the timer happen on the CPU to which the timer belongs. Simplify the whole machinery by using mod_timer() instead of add_timer_on() which avoids the problem because mod_timer() can handle already queued timers. Use __start_timer() everywhere so the earliest armed expiry time is preserved. Reported-by: Erik Veijola <erik.veijola@intel.com> Tested-by: Borislav Petkov <bp@alien8.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Borislav Petkov <bp@alien8.de> Cc: Tony Luck <tony.luck@intel.com> Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1701310936080.3457@nanos Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/usb/class/Kconfig')