Commit 7ad75eea authored by Luke Shumaker's avatar Luke Shumaker Committed by Laurent Vivier
Browse files

linux-user: init_guest_space: Clean up control flow a bit



Instead of doing

        if (check1) {
            if (check2) {
               success;
            }
        }

        retry;

Do a clearer

        if (!check1) {
           goto try_again;
        }

        if (!check2) {
           goto try_again;
        }

        success;

    try_again:
        retry;

Besides being clearer, this makes it easier to insert more checks that
need to trigger a retry on check failure, or rearrange them, or anything
like that.

Because some indentation is changing, "ignore space change" may be useful
for viewing this patch.

Signed-off-by: default avatarLuke Shumaker <lukeshu@parabola.nu>
Message-Id: <20171228180814.9749-8-lukeshu@lukeshu.com>
Reviewed-by: default avatarPeter Maydell <peter.maydell@linaro.org>
[lv: modified to try again fi valid == 0, not valid == -1 (error case)]
Signed-off-by: default avatarLaurent Vivier <laurent@vivier.eu>
parent 955e304f
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
@@ -1880,24 +1880,28 @@ unsigned long init_guest_space(unsigned long host_start,
        }

        /* Check to see if the address is valid.  */
        if (!host_start || aligned_start == current_start) {
        if (host_start && aligned_start != current_start) {
            goto try_again;
        }

#if defined(TARGET_ARM) && !defined(TARGET_AARCH64)
        /* On 32-bit ARM, we need to also be able to map the commpage.  */
        int valid = init_guest_commpage(aligned_start - guest_start,
                                        aligned_size + guest_start);
            if (valid == 1) {
                break;
            } else if (valid == -1) {
        if (valid == -1) {
            munmap((void *)real_start, real_size);
            return (unsigned long)-1;
        } else if (valid == 0) {
            goto try_again;
        }
            /* valid == 0, so try again. */
#else
            /* On other architectures, whatever we have here is fine.  */
            break;
#endif
        }

        /* If nothing has said `return -1` or `goto try_again` yet,
         * then the address we have is good.
         */
        break;

    try_again:
        /* That address didn't work.  Unmap and try a different one.
         * The address the host picked because is typically right at
         * the top of the host address space and leaves the guest with