diff --git a/src/crypto/x509.c b/src/crypto/x509.c index a99f6ab93..a3a179919 100644 --- a/src/crypto/x509.c +++ b/src/crypto/x509.c @@ -143,7 +143,7 @@ static unsigned int x509_discard ( void ) { } /** X.509 cache discarder */ -struct cache_discarder x509_cache_discarder __cache_discarder = { +struct cache_discarder x509_discarder __cache_discarder ( CACHE_NORMAL ) = { .discard = x509_discard, }; diff --git a/src/include/ipxe/malloc.h b/src/include/ipxe/malloc.h index c435a7ddb..d41b05628 100644 --- a/src/include/ipxe/malloc.h +++ b/src/include/ipxe/malloc.h @@ -76,6 +76,17 @@ struct cache_discarder { #define CACHE_DISCARDERS __table ( struct cache_discarder, "cache_discarders" ) /** Declare a cache discarder */ -#define __cache_discarder __table_entry ( CACHE_DISCARDERS, 01 ) +#define __cache_discarder( cost ) __table_entry ( CACHE_DISCARDERS, cost ) + +/** @defgroup cache_cost Cache discarder costs + * + * @{ + */ + +#define CACHE_CHEAP 01 /**< Items with a low replacement cost */ +#define CACHE_NORMAL 02 /**< Items with a normal replacement cost */ +#define CACHE_EXPENSIVE 03 /**< Items with a high replacement cost */ + +/** @} */ #endif /* _IPXE_MALLOC_H */ diff --git a/src/net/arp.c b/src/net/arp.c index d6b4e731a..7cec73d5f 100644 --- a/src/net/arp.c +++ b/src/net/arp.c @@ -525,7 +525,12 @@ static unsigned int arp_discard ( void ) { return 0; } -/** ARP cache discarder */ -struct cache_discarder arp_cache_discarder __cache_discarder = { +/** ARP cache discarder + * + * ARP cache entries are deemed to have a high replacement cost, since + * flushing an active ARP cache entry midway through a TCP transfer + * will cause substantial disruption. + */ +struct cache_discarder arp_discarder __cache_discarder ( CACHE_EXPENSIVE ) = { .discard = arp_discard, }; diff --git a/src/net/tcp.c b/src/net/tcp.c index 7a1272605..e98d8b17d 100644 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -1315,7 +1315,7 @@ static unsigned int tcp_discard ( void ) { } /** TCP cache discarder */ -struct cache_discarder tcp_cache_discarder __cache_discarder = { +struct cache_discarder tcp_discarder __cache_discarder ( CACHE_NORMAL ) = { .discard = tcp_discard, };