]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[arp] Try to avoid discarding ARP cache entries
authorMichael Brown <mcb30@ipxe.org>
Mon, 9 Jul 2012 08:55:26 +0000 (09:55 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 9 Jul 2012 09:08:38 +0000 (10:08 +0100)
Discarding the active ARP cache entry in the middle of a download will
substantially disrupt the TCP stream.  Try to minimise any such
disruption by treating ARP cache entries as expensive, and discarding
them only when nothing else is available to discard.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/crypto/x509.c
src/include/ipxe/malloc.h
src/net/arp.c
src/net/tcp.c

index a99f6ab93436dae91003048de87e4617e021df1a..a3a17991973fc86dc816172a14e08609de86e44b 100644 (file)
@@ -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,
 };
 
index c435a7ddb6472d2f65658272ae452f768d273c0a..d41b056284cf8a6102c3cd986c92cbc29a7ed9e0 100644 (file)
@@ -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 */
index d6b4e731ac40d698e8edd9ff64e58628b493e504..7cec73d5fdaba7d5c033d0d81031652a364e1663 100644 (file)
@@ -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,
 };
index 7a127260592636d6612a0b1ba2dc211dca54fb47..e98d8b17d256a2f486e9255f4b3f9890b42d5bc3 100644 (file)
@@ -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,
 };