On 6/24/26 18:56, David Hildenbrand (Arm) wrote:
> On 6/24/26 17:40, Denis V. Lunev wrote:
>> Like tell_host(), stats_handle_request() ignores the return value of
>> virtqueue_add_outbuf() and kicks the queue regardless. The same "we
>> should always be able to add one buffer to an empty queue" assumption
>> does not hold once the virtqueue has been broken (e.g. on device
>> shutdown), where the add fails with -EIO. Unlike tell_host() it does
>> not wait_event() afterwards so it cannot hang, but it still kicks a
>> queue with nothing queued.
>>
>> Warn and bail out on failure, mirroring tell_host() and
>> virtballoon_free_page_report().
>>
>> Suggested-by: David Hildenbrand <[email protected]>
>> Signed-off-by: Denis V. Lunev <[email protected]>
>> ---
>>  drivers/virtio/virtio_balloon.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/virtio/virtio_balloon.c 
>> b/drivers/virtio/virtio_balloon.c
>> index 0866a8781f0b..454bbb77331d 100644
>> --- a/drivers/virtio/virtio_balloon.c
>> +++ b/drivers/virtio/virtio_balloon.c
>> @@ -445,6 +445,7 @@ static void stats_handle_request(struct virtio_balloon 
>> *vb)
>>      struct virtqueue *vq;
>>      struct scatterlist sg;
>>      unsigned int len, num_stats;
>> +    int err;
>>  
>>      num_stats = update_balloon_stats(vb);
>>  
>> @@ -452,7 +453,9 @@ static void stats_handle_request(struct virtio_balloon 
>> *vb)
>>      if (!virtqueue_get_buf(vq, &len))
>>              return;
>>      sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats);
>> -    virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL);
>> +    err = virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL);
>> +    if (WARN_ON_ONCE(err))
>> +            return;
>>      virtqueue_kick(vq);
>>  }
>>  
> Reviewed-by: David Hildenbrand (Arm) <[email protected]>
>
> Although I would just squash #4 and #5.
>
Sure thing. Does this way to avoid re-submit if that is possible.

Den

Reply via email to