mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Jürgen Groß" <jgross@suse.com>
To: Stefano Stabellini <sstabellini@kernel.org>
Cc: Harshvardhan Jha <harshvardhan.j.jha@oracle.com>,
	Greg KH <gregkh@linuxfoundation.org>,
	Konrad Wilk <konrad.wilk@oracle.com>,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>,
	stable@vger.kernel.org
Subject: Re: v5.4.289 failed to boot with error megasas_build_io_fusion 3219 sge_count (-12) is out of range
Date: Fri, 31 Jan 2025 07:38:53 +0100	[thread overview]
Message-ID: <9316269c-dbc4-45e4-a580-082edcf3a65d@suse.com> (raw)
In-Reply-To: <alpine.DEB.2.22.394.2501301226330.11632@ubuntu-linux-20-04-desktop>


[-- Attachment #1.1.1: Type: text/plain, Size: 3617 bytes --]

On 30.01.25 21:28, Stefano Stabellini wrote:
> On Thu, 30 Jan 2025, Jürgen Groß wrote:
>> Can you try the attached patch, please? I don't have a system at hand
>> showing the problem.
>>
>>  From cff43e997f79a95dc44e02debaeafe5f127f40bb Mon Sep 17 00:00:00 2001
>> From: Juergen Gross <jgross@suse.com>
>> Date: Thu, 30 Jan 2025 09:56:57 +0100
>> Subject: [PATCH] x86/xen: allow larger contiguous memory regions in PV guests
>>
>> Today a PV guest (including dom0) can create 2MB contiguous memory
>> regions for DMA buffers at max. This has led to problems at least
>> with the megaraid_sas driver, which wants to allocate a 2.3MB DMA
>> buffer.
>>
>> The limiting factor is the frame array used to do the hypercall for
>> making the memory contiguous, which has 512 entries and is just a
>> static array in mmu_pv.c.
>>
>> In case a contiguous memory area larger than the initially supported
>> 2MB is requested, allocate a larger buffer for the frame list. Note
>> that such an allocation is tried only after memory management has been
>> initialized properly, which is tested via the early_boot_irqs_disabled
>> flag.
>>
>> Fixes: 9f40ec84a797 ("xen/swiotlb: add alignment check for dma buffers")
>> Signed-off-by: Juergen Gross <jgross@suse.com>
>> ---
>> Note that the "Fixes:" tag is not really correct, as that patch didn't
>> introduce the problem, but rather made it visible. OTOH it is the best
>> indicator we have to identify kernel versions this patch should be
>> backported to.
>> ---
>>   arch/x86/xen/mmu_pv.c | 44 ++++++++++++++++++++++++++++++++++++-------
>>   1 file changed, 37 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
>> index 55a4996d0c04..62aec29b8174 100644
>> --- a/arch/x86/xen/mmu_pv.c
>> +++ b/arch/x86/xen/mmu_pv.c
>> @@ -2200,8 +2200,10 @@ void __init xen_init_mmu_ops(void)
>>   }
>>   
>>   /* Protected by xen_reservation_lock. */
>> -#define MAX_CONTIG_ORDER 9 /* 2MB */
>> -static unsigned long discontig_frames[1<<MAX_CONTIG_ORDER];
>> +#define MIN_CONTIG_ORDER 9 /* 2MB */
>> +static unsigned int discontig_frames_order = MIN_CONTIG_ORDER;
>> +static unsigned long discontig_frames_early[1UL << MIN_CONTIG_ORDER];
>> +static unsigned long *discontig_frames = discontig_frames_early;
>>   
>>   #define VOID_PTE (mfn_pte(0, __pgprot(0)))
>>   static void xen_zap_pfn_range(unsigned long vaddr, unsigned int order,
>> @@ -2319,18 +2321,44 @@ int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
>>   				 unsigned int address_bits,
>>   				 dma_addr_t *dma_handle)
>>   {
>> -	unsigned long *in_frames = discontig_frames, out_frame;
>> +	unsigned long *in_frames, out_frame;
>> +	unsigned long *new_array, *old_array;
>>   	unsigned long  flags;
>>   	int            success;
>>   	unsigned long vstart = (unsigned long)phys_to_virt(pstart);
>>   
>> -	if (unlikely(order > MAX_CONTIG_ORDER))
>> -		return -ENOMEM;
>> +	if (unlikely(order > discontig_frames_order)) {
>> +		if (early_boot_irqs_disabled)
>> +			return -ENOMEM;
>> +
>> +		new_array = vmalloc(sizeof(unsigned long) * (1UL << order));
>> +
>> +		if (!new_array)
>> +			return -ENOMEM;
>> +
>> +		spin_lock_irqsave(&xen_reservation_lock, flags);
>> +
>> +		if (order > discontig_frames_order) {
> 
> 
> This second if check should not be needed because it is the same as the
> outer if check.

It is needed, as inside the locked region I need to verify that no
concurrent call did already update the buffer, maybe with an even
larger size.


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3743 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

  reply	other threads:[~2025-01-31  6:38 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-29  8:27 Harshvardhan Jha
2025-01-29  8:33 ` Harshvardhan Jha
2025-01-29  8:35   ` Greg KH
2025-01-29  8:43     ` Harshvardhan Jha
2025-01-29  8:48       ` Greg KH
2025-01-29  8:59         ` Harshvardhan Jha
2025-01-29  9:04           ` Greg KH
2025-01-29  9:15             ` Harshvardhan Jha
2025-01-29 11:22               ` Juergen Gross
2025-01-29 18:35                 ` Harshvardhan Jha
2025-01-29 18:43                   ` Jürgen Groß
2025-01-29 18:46                     ` Harshvardhan Jha
2025-01-30 12:35                       ` Jürgen Groß
2025-01-30 20:28                         ` Stefano Stabellini
2025-01-31  6:38                           ` Jürgen Groß [this message]
2025-01-31 12:05                         ` Harshvardhan Jha
2025-02-04 11:20                           ` Harshvardhan Jha
2025-01-29 22:01                     ` Stefano Stabellini
2025-01-30  5:27                       ` Harshvardhan Jha
2025-01-30  6:59                         ` Jürgen Groß

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=9316269c-dbc4-45e4-a580-082edcf3a65d@suse.com \
    --to=jgross@suse.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=harshit.m.mogalapalli@oracle.com \
    --cc=harshvardhan.j.jha@oracle.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sstabellini@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®