From: Eric Auger <eric.auger@redhat.com> To: eric.auger.pro@gmail.com, eric.auger@redhat.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, marc.zyngier@arm.com, cdall@linaro.org, peter.maydell@linaro.org, andre.przywara@arm.com, wanghaibin.wang@huawei.com Cc: wu.wubin@huawei.com, drjones@redhat.com, wei@redhat.com Subject: [PATCH v4 08/11] KVM: arm/arm64: vgic-its: new helper functions to free the caches Date: Tue, 17 Oct 2017 09:10:06 +0200 [thread overview] Message-ID: <1508224209-15366-9-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1508224209-15366-1-git-send-email-eric.auger@redhat.com> From: wanghaibin <wanghaibin.wang@huawei.com> We create 2 new functions that frees the device and collection lists. this is currently called by vgic_its_destroy() and we will add other callers in subsequent patches. We also remove the check on its->device_list.next as it looks unnecessary. Indeed, the device list always is initialized when vgic_its_destroy gets called: the kvm device is removed by kvm_destroy_devices() which loops on all the devices added to kvm->devices. kvm_ioctl_create_device() only adds the device to kvm_devices once the lists have been initialized (in vgic_create_its). We also move vgic_its_free_device to prepare for new callers. Signed-off-by: wanghaibin <wanghaibin.wang@huawei.com> Signed-off-by: Eric Auger <eric.auger@redhat.com> --- [Eric] removed its->device_list.next which is not needed as pointed out by Wanghaibin. Reword the commit message --- virt/kvm/arm/vgic/vgic-its.c | 76 ++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c index 1c3e83f..f3f0026f 100644 --- a/virt/kvm/arm/vgic/vgic-its.c +++ b/virt/kvm/arm/vgic/vgic-its.c @@ -611,6 +611,45 @@ static void its_free_ite(struct kvm *kvm, struct its_ite *ite) kfree(ite); } +static void vgic_its_free_device(struct kvm *kvm, struct its_device *dev) +{ + struct its_ite *ite, *tmp; + + list_for_each_entry_safe(ite, tmp, &dev->itt_head, ite_list) + its_free_ite(kvm, ite); + list_del(&dev->dev_list); + kfree(dev); +} + +static void vgic_its_free_device_list(struct kvm *kvm, struct vgic_its *its) +{ + struct list_head *cur, *temp; + + mutex_lock(&its->its_lock); + list_for_each_safe(cur, temp, &its->device_list) { + struct its_device *dev; + + dev = list_entry(cur, struct its_device, dev_list); + vgic_its_free_device(kvm, dev); + } + mutex_unlock(&its->its_lock); +} + +static void vgic_its_free_collection_list(struct kvm *kvm, struct vgic_its *its) +{ + struct list_head *cur, *temp; + + list_for_each_safe(cur, temp, &its->collection_list) { + struct its_collection *coll; + + coll = list_entry(cur, struct its_collection, coll_list); + list_del(cur); + kfree(coll); + } + mutex_unlock(&its->its_lock); +} + + static u64 its_cmd_mask_field(u64 *its_cmd, int word, int shift, int size) { return (le64_to_cpu(its_cmd[word]) >> shift) & (BIT_ULL(size) - 1); @@ -1644,46 +1683,13 @@ static int vgic_its_create(struct kvm_device *dev, u32 type) return vgic_its_set_abi(its, NR_ITS_ABIS - 1); } -static void vgic_its_free_device(struct kvm *kvm, struct its_device *dev) -{ - struct its_ite *ite, *tmp; - - list_for_each_entry_safe(ite, tmp, &dev->itt_head, ite_list) - its_free_ite(kvm, ite); - list_del(&dev->dev_list); - kfree(dev); -} - static void vgic_its_destroy(struct kvm_device *kvm_dev) { struct kvm *kvm = kvm_dev->kvm; struct vgic_its *its = kvm_dev->private; - struct list_head *cur, *temp; - - /* - * We may end up here without the lists ever having been initialized. - * Check this and bail out early to avoid dereferencing a NULL pointer. - */ - if (!its->device_list.next) - return; - - mutex_lock(&its->its_lock); - list_for_each_safe(cur, temp, &its->device_list) { - struct its_device *dev; - - dev = list_entry(cur, struct its_device, dev_list); - vgic_its_free_device(kvm, dev); - } - - list_for_each_safe(cur, temp, &its->collection_list) { - struct its_collection *coll; - - coll = list_entry(cur, struct its_collection, coll_list); - list_del(cur); - kfree(coll); - } - mutex_unlock(&its->its_lock); + vgic_its_free_device_list(kvm, its); + vgic_its_free_collection_list(kvm, its); kfree(its); } -- 2.5.5
WARNING: multiple messages have this Message-ID (diff)
From: Eric Auger <eric.auger@redhat.com> To: eric.auger.pro@gmail.com, eric.auger@redhat.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, marc.zyngier@arm.com, cdall@linaro.org, peter.maydell@linaro.org, andre.przywara@arm.com, wanghaibin.wang@huawei.com Cc: wu.wubin@huawei.com Subject: [PATCH v4 08/11] KVM: arm/arm64: vgic-its: new helper functions to free the caches Date: Tue, 17 Oct 2017 09:10:06 +0200 [thread overview] Message-ID: <1508224209-15366-9-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1508224209-15366-1-git-send-email-eric.auger@redhat.com> From: wanghaibin <wanghaibin.wang@huawei.com> We create 2 new functions that frees the device and collection lists. this is currently called by vgic_its_destroy() and we will add other callers in subsequent patches. We also remove the check on its->device_list.next as it looks unnecessary. Indeed, the device list always is initialized when vgic_its_destroy gets called: the kvm device is removed by kvm_destroy_devices() which loops on all the devices added to kvm->devices. kvm_ioctl_create_device() only adds the device to kvm_devices once the lists have been initialized (in vgic_create_its). We also move vgic_its_free_device to prepare for new callers. Signed-off-by: wanghaibin <wanghaibin.wang@huawei.com> Signed-off-by: Eric Auger <eric.auger@redhat.com> --- [Eric] removed its->device_list.next which is not needed as pointed out by Wanghaibin. Reword the commit message --- virt/kvm/arm/vgic/vgic-its.c | 76 ++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c index 1c3e83f..f3f0026f 100644 --- a/virt/kvm/arm/vgic/vgic-its.c +++ b/virt/kvm/arm/vgic/vgic-its.c @@ -611,6 +611,45 @@ static void its_free_ite(struct kvm *kvm, struct its_ite *ite) kfree(ite); } +static void vgic_its_free_device(struct kvm *kvm, struct its_device *dev) +{ + struct its_ite *ite, *tmp; + + list_for_each_entry_safe(ite, tmp, &dev->itt_head, ite_list) + its_free_ite(kvm, ite); + list_del(&dev->dev_list); + kfree(dev); +} + +static void vgic_its_free_device_list(struct kvm *kvm, struct vgic_its *its) +{ + struct list_head *cur, *temp; + + mutex_lock(&its->its_lock); + list_for_each_safe(cur, temp, &its->device_list) { + struct its_device *dev; + + dev = list_entry(cur, struct its_device, dev_list); + vgic_its_free_device(kvm, dev); + } + mutex_unlock(&its->its_lock); +} + +static void vgic_its_free_collection_list(struct kvm *kvm, struct vgic_its *its) +{ + struct list_head *cur, *temp; + + list_for_each_safe(cur, temp, &its->collection_list) { + struct its_collection *coll; + + coll = list_entry(cur, struct its_collection, coll_list); + list_del(cur); + kfree(coll); + } + mutex_unlock(&its->its_lock); +} + + static u64 its_cmd_mask_field(u64 *its_cmd, int word, int shift, int size) { return (le64_to_cpu(its_cmd[word]) >> shift) & (BIT_ULL(size) - 1); @@ -1644,46 +1683,13 @@ static int vgic_its_create(struct kvm_device *dev, u32 type) return vgic_its_set_abi(its, NR_ITS_ABIS - 1); } -static void vgic_its_free_device(struct kvm *kvm, struct its_device *dev) -{ - struct its_ite *ite, *tmp; - - list_for_each_entry_safe(ite, tmp, &dev->itt_head, ite_list) - its_free_ite(kvm, ite); - list_del(&dev->dev_list); - kfree(dev); -} - static void vgic_its_destroy(struct kvm_device *kvm_dev) { struct kvm *kvm = kvm_dev->kvm; struct vgic_its *its = kvm_dev->private; - struct list_head *cur, *temp; - - /* - * We may end up here without the lists ever having been initialized. - * Check this and bail out early to avoid dereferencing a NULL pointer. - */ - if (!its->device_list.next) - return; - - mutex_lock(&its->its_lock); - list_for_each_safe(cur, temp, &its->device_list) { - struct its_device *dev; - - dev = list_entry(cur, struct its_device, dev_list); - vgic_its_free_device(kvm, dev); - } - - list_for_each_safe(cur, temp, &its->collection_list) { - struct its_collection *coll; - - coll = list_entry(cur, struct its_collection, coll_list); - list_del(cur); - kfree(coll); - } - mutex_unlock(&its->its_lock); + vgic_its_free_device_list(kvm, its); + vgic_its_free_collection_list(kvm, its); kfree(its); } -- 2.5.5
next prev parent reply other threads:[~2017-10-17 7:11 UTC|newest] Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-10-17 7:09 [PATCH v4 00/11] vITS Migration fixes and reset Eric Auger 2017-10-17 7:09 ` Eric Auger 2017-10-17 7:09 ` [PATCH v4 01/11] KVM: arm/arm64: vgic-its: fix return value for device table restore Eric Auger 2017-10-17 7:09 ` Eric Auger 2017-10-17 21:40 ` Christoffer Dall 2017-10-21 14:40 ` Auger Eric 2017-10-21 14:40 ` Auger Eric 2017-10-21 15:42 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 02/11] KVM: arm/arm64: vgic-its: fix vgic_its_restore_collection_table returned value Eric Auger 2017-10-17 21:54 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 03/11] KVM: arm/arm64: vgic-its: Improve error reporting on device table save Eric Auger 2017-10-17 7:10 ` Eric Auger 2017-10-17 22:00 ` Christoffer Dall 2017-10-17 22:00 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 04/11] KVM: arm/arm64: vgic-its: Check CBASER/BASER validity before enabling the ITS Eric Auger 2017-10-17 7:10 ` Eric Auger 2017-10-17 22:02 ` Christoffer Dall 2017-10-17 22:05 ` Christoffer Dall 2017-10-17 22:05 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 05/11] KVM: arm/arm64: vgic-its: Check GITS_BASER Valid bit before saving tables Eric Auger 2017-10-17 7:10 ` [PATCH v4 06/11] KVM: arm/arm64: vgic-its: Check GITS_CBASER validity before processing commands Eric Auger 2017-10-17 7:10 ` Eric Auger 2017-10-17 22:10 ` Christoffer Dall 2017-10-17 22:10 ` Christoffer Dall 2017-10-18 14:34 ` Auger Eric 2017-10-18 14:34 ` Auger Eric 2017-10-17 7:10 ` [PATCH v4 07/11] KVM: arm/arm64: vgic-its: Always attempt to save/restore device and collection tables Eric Auger 2017-10-17 7:10 ` Eric Auger 2017-10-17 22:15 ` Christoffer Dall 2017-10-17 22:15 ` Christoffer Dall 2017-10-17 7:10 ` Eric Auger [this message] 2017-10-17 7:10 ` [PATCH v4 08/11] KVM: arm/arm64: vgic-its: new helper functions to free the caches Eric Auger 2017-10-17 22:24 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 09/11] KVM: arm/arm64: vgic-its: free caches when GITS_BASER Valid bit is cleared Eric Auger 2017-10-17 7:10 ` Eric Auger 2017-10-17 22:34 ` Christoffer Dall 2017-10-17 22:34 ` Christoffer Dall 2017-10-21 10:13 ` Auger Eric 2017-10-21 10:13 ` Auger Eric 2017-10-21 14:31 ` Christoffer Dall 2017-10-21 14:31 ` Christoffer Dall 2017-10-21 14:36 ` Auger Eric 2017-10-21 15:42 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 10/11] KVM: arm/arm64: Document KVM_DEV_ARM_ITS_CTRL_RESET Eric Auger 2017-10-17 22:38 ` Christoffer Dall 2017-10-17 22:38 ` Christoffer Dall 2017-10-17 7:10 ` [PATCH v4 11/11] KVM: arm/arm64: vgic-its: Implement KVM_DEV_ARM_ITS_CTRL_RESET Eric Auger 2017-10-17 7:10 ` Eric Auger
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1508224209-15366-9-git-send-email-eric.auger@redhat.com \ --to=eric.auger@redhat.com \ --cc=andre.przywara@arm.com \ --cc=cdall@linaro.org \ --cc=drjones@redhat.com \ --cc=eric.auger.pro@gmail.com \ --cc=kvm@vger.kernel.org \ --cc=kvmarm@lists.cs.columbia.edu \ --cc=linux-kernel@vger.kernel.org \ --cc=marc.zyngier@arm.com \ --cc=peter.maydell@linaro.org \ --cc=wanghaibin.wang@huawei.com \ --cc=wei@redhat.com \ --cc=wu.wubin@huawei.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.