[PATCH v6 08/13] numa: use QLIST_FOREACH_SAFE() for RAM block notifiers

Stefan Hajnoczi posted 13 patches 3 years, 4 months ago
Maintainers: Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>, Fam Zheng <fam@euphon.net>, John Snow <jsnow@redhat.com>, Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>, Eric Blake <eblake@redhat.com>, "Philippe Mathieu-Daudé" <f4bug@amsat.org>, "Denis V. Lunev" <den@openvz.org>, Wen Congyang <wencongyang2@huawei.com>, Xie Changlong <xiechanglong.d@gmail.com>, "Richard W.M. Jones" <rjones@redhat.com>, Jeff Cody <codyprime@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Eduardo Habkost <eduardo@habkost.net>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Yanan Wang <wangyanan55@huawei.com>, Richard Henderson <richard.henderson@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Markus Armbruster <armbru@redhat.com>, Peter Xu <peterx@redhat.com>, David Hildenbrand <david@redhat.com>, Thomas Huth <thuth@redhat.com>, Laurent Vivier <lvivier@redhat.com>
There is a newer version of this series
[PATCH v6 08/13] numa: use QLIST_FOREACH_SAFE() for RAM block notifiers
Posted by Stefan Hajnoczi 3 years, 4 months ago
Make list traversal work when a callback removes a notifier
mid-traversal. This is a cleanup to prevent bugs in the future.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/core/numa.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/hw/core/numa.c b/hw/core/numa.c
index 31e6fe1caa..ea24a5fa8c 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -857,8 +857,9 @@ void ram_block_notifier_remove(RAMBlockNotifier *n)
 void ram_block_notify_add(void *host, size_t size, size_t max_size)
 {
     RAMBlockNotifier *notifier;
+    RAMBlockNotifier *next;
 
-    QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) {
+    QLIST_FOREACH_SAFE(notifier, &ram_list.ramblock_notifiers, next, next) {
         if (notifier->ram_block_added) {
             notifier->ram_block_added(notifier, host, size, max_size);
         }
@@ -868,8 +869,9 @@ void ram_block_notify_add(void *host, size_t size, size_t max_size)
 void ram_block_notify_remove(void *host, size_t size, size_t max_size)
 {
     RAMBlockNotifier *notifier;
+    RAMBlockNotifier *next;
 
-    QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) {
+    QLIST_FOREACH_SAFE(notifier, &ram_list.ramblock_notifiers, next, next) {
         if (notifier->ram_block_removed) {
             notifier->ram_block_removed(notifier, host, size, max_size);
         }
@@ -879,8 +881,9 @@ void ram_block_notify_remove(void *host, size_t size, size_t max_size)
 void ram_block_notify_resize(void *host, size_t old_size, size_t new_size)
 {
     RAMBlockNotifier *notifier;
+    RAMBlockNotifier *next;
 
-    QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) {
+    QLIST_FOREACH_SAFE(notifier, &ram_list.ramblock_notifiers, next, next) {
         if (notifier->ram_block_resized) {
             notifier->ram_block_resized(notifier, host, old_size, new_size);
         }
-- 
2.37.3
Re: [PATCH v6 08/13] numa: use QLIST_FOREACH_SAFE() for RAM block notifiers
Posted by David Hildenbrand 3 years, 4 months ago
On 06.10.22 23:35, Stefan Hajnoczi wrote:
> Make list traversal work when a callback removes a notifier
> mid-traversal. This is a cleanup to prevent bugs in the future.
> 
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
>   hw/core/numa.c | 9 ++++++---
>   1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/core/numa.c b/hw/core/numa.c
> index 31e6fe1caa..ea24a5fa8c 100644
> --- a/hw/core/numa.c
> +++ b/hw/core/numa.c
> @@ -857,8 +857,9 @@ void ram_block_notifier_remove(RAMBlockNotifier *n)
>   void ram_block_notify_add(void *host, size_t size, size_t max_size)
>   {
>       RAMBlockNotifier *notifier;
> +    RAMBlockNotifier *next;
>   
> -    QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) {
> +    QLIST_FOREACH_SAFE(notifier, &ram_list.ramblock_notifiers, next, next) {
>           if (notifier->ram_block_added) {
>               notifier->ram_block_added(notifier, host, size, max_size);
>           }
> @@ -868,8 +869,9 @@ void ram_block_notify_add(void *host, size_t size, size_t max_size)
>   void ram_block_notify_remove(void *host, size_t size, size_t max_size)
>   {
>       RAMBlockNotifier *notifier;
> +    RAMBlockNotifier *next;
>   
> -    QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) {
> +    QLIST_FOREACH_SAFE(notifier, &ram_list.ramblock_notifiers, next, next) {
>           if (notifier->ram_block_removed) {
>               notifier->ram_block_removed(notifier, host, size, max_size);
>           }
> @@ -879,8 +881,9 @@ void ram_block_notify_remove(void *host, size_t size, size_t max_size)
>   void ram_block_notify_resize(void *host, size_t old_size, size_t new_size)
>   {
>       RAMBlockNotifier *notifier;
> +    RAMBlockNotifier *next;
>   
> -    QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) {
> +    QLIST_FOREACH_SAFE(notifier, &ram_list.ramblock_notifiers, next, next) {
>           if (notifier->ram_block_resized) {
>               notifier->ram_block_resized(notifier, host, old_size, new_size);
>           }

Reviewed-by: David Hildenbrand <david@redhat.com>

-- 
Thanks,

David / dhildenb