|
@@ -530,6 +530,13 @@ static int cache_defer_req(struct cache_req *req, struct cache_head *item)
|
|
struct cache_deferred_req *dreq;
|
|
struct cache_deferred_req *dreq;
|
|
int hash = DFR_HASH(item);
|
|
int hash = DFR_HASH(item);
|
|
|
|
|
|
|
|
+ if (cache_defer_cnt >= DFR_MAX) {
|
|
|
|
+ /* too much in the cache, randomly drop this one,
|
|
|
|
+ * or continue and drop the oldest below
|
|
|
|
+ */
|
|
|
|
+ if (net_random()&1)
|
|
|
|
+ return -ETIMEDOUT;
|
|
|
|
+ }
|
|
dreq = req->defer(req);
|
|
dreq = req->defer(req);
|
|
if (dreq == NULL)
|
|
if (dreq == NULL)
|
|
return -ETIMEDOUT;
|
|
return -ETIMEDOUT;
|
|
@@ -548,17 +555,8 @@ static int cache_defer_req(struct cache_req *req, struct cache_head *item)
|
|
/* it is in, now maybe clean up */
|
|
/* it is in, now maybe clean up */
|
|
dreq = NULL;
|
|
dreq = NULL;
|
|
if (++cache_defer_cnt > DFR_MAX) {
|
|
if (++cache_defer_cnt > DFR_MAX) {
|
|
- /* too much in the cache, randomly drop
|
|
|
|
- * first or last
|
|
|
|
- */
|
|
|
|
- if (net_random()&1)
|
|
|
|
- dreq = list_entry(cache_defer_list.next,
|
|
|
|
- struct cache_deferred_req,
|
|
|
|
- recent);
|
|
|
|
- else
|
|
|
|
- dreq = list_entry(cache_defer_list.prev,
|
|
|
|
- struct cache_deferred_req,
|
|
|
|
- recent);
|
|
|
|
|
|
+ dreq = list_entry(cache_defer_list.prev,
|
|
|
|
+ struct cache_deferred_req, recent);
|
|
list_del(&dreq->recent);
|
|
list_del(&dreq->recent);
|
|
list_del(&dreq->hash);
|
|
list_del(&dreq->hash);
|
|
cache_defer_cnt--;
|
|
cache_defer_cnt--;
|