@@ -141,7 +141,9 @@ struct virtio_mem {
141
141
142
142
/* Timer for retrying to plug/unplug memory. */
143
143
struct hrtimer retry_timer ;
144
- #define VIRTIO_MEM_RETRY_TIMER_MS 30000
144
+ unsigned int retry_timer_ms ;
145
+ #define VIRTIO_MEM_RETRY_TIMER_MIN_MS 50000
146
+ #define VIRTIO_MEM_RETRY_TIMER_MAX_MS 300000
145
147
146
148
/* Memory notifier (online/offline events). */
147
149
struct notifier_block memory_notifier ;
@@ -1550,6 +1552,7 @@ static void virtio_mem_run_wq(struct work_struct *work)
1550
1552
1551
1553
switch (rc ) {
1552
1554
case 0 :
1555
+ vm -> retry_timer_ms = VIRTIO_MEM_RETRY_TIMER_MIN_MS ;
1553
1556
break ;
1554
1557
case - ENOSPC :
1555
1558
/*
@@ -1565,8 +1568,7 @@ static void virtio_mem_run_wq(struct work_struct *work)
1565
1568
*/
1566
1569
case - ENOMEM :
1567
1570
/* Out of memory, try again later. */
1568
- hrtimer_start (& vm -> retry_timer ,
1569
- ms_to_ktime (VIRTIO_MEM_RETRY_TIMER_MS ),
1571
+ hrtimer_start (& vm -> retry_timer , ms_to_ktime (vm -> retry_timer_ms ),
1570
1572
HRTIMER_MODE_REL );
1571
1573
break ;
1572
1574
case - EAGAIN :
@@ -1586,6 +1588,8 @@ static enum hrtimer_restart virtio_mem_timer_expired(struct hrtimer *timer)
1586
1588
retry_timer );
1587
1589
1588
1590
virtio_mem_retry (vm );
1591
+ vm -> retry_timer_ms = min_t (unsigned int , vm -> retry_timer_ms * 2 ,
1592
+ VIRTIO_MEM_RETRY_TIMER_MAX_MS );
1589
1593
return HRTIMER_NORESTART ;
1590
1594
}
1591
1595
@@ -1754,6 +1758,7 @@ static int virtio_mem_probe(struct virtio_device *vdev)
1754
1758
spin_lock_init (& vm -> removal_lock );
1755
1759
hrtimer_init (& vm -> retry_timer , CLOCK_MONOTONIC , HRTIMER_MODE_REL );
1756
1760
vm -> retry_timer .function = virtio_mem_timer_expired ;
1761
+ vm -> retry_timer_ms = VIRTIO_MEM_RETRY_TIMER_MIN_MS ;
1757
1762
1758
1763
/* register the virtqueue */
1759
1764
rc = virtio_mem_init_vq (vm );
0 commit comments