Thread (39 messages) 39 messages, 7 authors, 2023-10-11

Re: [PATCH v4 09/15] Drivers: hv: Introduce hv_output_arg_exists in hv_common.c

From: Alex Ionescu <hidden>
Date: 2023-10-02 19:29:29
Also in: linux-arch, linux-hyperv, linux-patches, lkml

Hi Nuno,

Is it possible to simply change to always allocating the output page?
For example, the output page could be needed in scenarios where Linux
is not running as the root partition, since certain hypercalls that a
guest can make will still require one (I realize that's not the case
_today_, but I don't believe this optimization buys much).

Best regards,
Alex Ionescu

Best regards,
Alex Ionescu


On Fri, Sep 29, 2023 at 2:02 PM Nuno Das Neves
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
This is a more flexible approach for determining whether to allocate the
output page.

Signed-off-by: Nuno Das Neves <redacted>
Acked-by: Wei Liu <wei.liu@kernel.org>
---
 drivers/hv/hv_common.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
index 39077841d518..3f6f23e4c579 100644
--- a/drivers/hv/hv_common.c
+++ b/drivers/hv/hv_common.c
@@ -58,6 +58,14 @@ EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg);
 void * __percpu *hyperv_pcpu_output_arg;
 EXPORT_SYMBOL_GPL(hyperv_pcpu_output_arg);

+/*
+ * Determine whether output arg is needed
+ */
+static inline bool hv_output_arg_exists(void)
+{
+       return hv_root_partition ? true : false;
+}
+
 static void hv_kmsg_dump_unregister(void);

 static struct ctl_table_header *hv_ctl_table_hdr;
@@ -342,10 +350,12 @@ int __init hv_common_init(void)
        hyperv_pcpu_input_arg = alloc_percpu(void  *);
        BUG_ON(!hyperv_pcpu_input_arg);

-       /* Allocate the per-CPU state for output arg for root */
-       if (hv_root_partition) {
+       if (hv_output_arg_exists()) {
                hyperv_pcpu_output_arg = alloc_percpu(void *);
                BUG_ON(!hyperv_pcpu_output_arg);
+       }
+
+       if (hv_root_partition) {
                hv_synic_eventring_tail = alloc_percpu(u8 *);
                BUG_ON(hv_synic_eventring_tail == NULL);
        }
@@ -375,7 +385,7 @@ int hv_common_cpu_init(unsigned int cpu)
        u8 **synic_eventring_tail;
        u64 msr_vp_index;
        gfp_t flags;
-       int pgcount = hv_root_partition ? 2 : 1;
+       int pgcount = hv_output_arg_exists() ? 2 : 1;
        void *mem;
        int ret;
@@ -393,9 +403,12 @@ int hv_common_cpu_init(unsigned int cpu)
                if (!mem)
                        return -ENOMEM;

-               if (hv_root_partition) {
+               if (hv_output_arg_exists()) {
                        outputarg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg);
                        *outputarg = (char *)mem + HV_HYP_PAGE_SIZE;
+               }
+
+               if (hv_root_partition) {
                        synic_eventring_tail = (u8 **)this_cpu_ptr(hv_synic_eventring_tail);
                        *synic_eventring_tail = kcalloc(HV_SYNIC_SINT_COUNT, sizeof(u8),
                                                        flags);
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help