memory allocation in spinlock context

2013-03-01 Thread Andriy Gapon

I am trying to understand if it is possible to allow memory allocations 
(M_NOWAIT,
of course) in a spinlock context.
I do not see any obvious architectural obstacles.
But the fact that all of the uma locks, system map lock, object locks, page 
queue
locks and so on are regular mutexes makes it impossible to allocate memory 
without
violating the fundamental lock ordering rules.

Could all of the above mentioned locks potentially be converted to spin mutexes?
(And that seems to be a large nasty change)
Are there any alternative possibilities?

BTW, currently we have at least one place where a memory allocation of this kind
is done stealthily (and thus dangerously?).  ACPI resume code must execute
AcpiLeaveSleepStatePrep with interrupts disabled and ACPICA code performs memory
allocations in that code path.  Since the interrupts are disabled by means of
intr_disable(), witness(9) and similar are completely oblivious of the fact.

-- 
Andriy Gapon
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: memory allocation in spinlock context

2013-03-01 Thread Matthew Jacob

On 3/1/2013 5:50 AM, Andriy Gapon wrote:

I am trying to understand if it is possible to allow memory allocations 
(M_NOWAIT,
of course) in a spinlock context.

There are mechanisms to do just this- essentially by creating private 
pools that are organized in a way to allow for spinlock (and thus 
possible interrupt level) safe allocations (and failure if the pool is 
empty). Are you trying to make a general mechanism for this?

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: memory allocation in spinlock context

2013-03-01 Thread Davide Italiano
On Fri, Mar 1, 2013 at 2:50 PM, Andriy Gapon a...@freebsd.org wrote:

 I am trying to understand if it is possible to allow memory allocations 
 (M_NOWAIT,
 of course) in a spinlock context.
 I do not see any obvious architectural obstacles.
 But the fact that all of the uma locks, system map lock, object locks, page 
 queue
 locks and so on are regular mutexes makes it impossible to allocate memory 
 without
 violating the fundamental lock ordering rules.

 Could all of the above mentioned locks potentially be converted to spin 
 mutexes?
 (And that seems to be a large nasty change)

AFAIK they're suitable for particular uses and not in general.
For example if the critical section is short, spinning rather than
sleeping could avoid a potential context switches, increasing
performances. OTOH has the disadvantage of wasting time that could be
used in other activities. So, IMHO, if such a change need to be
adopted, ti should be pondered/profiled more than a bit, and I doubt
it could be used for the wide class of locks you mentioned.

 Are there any alternative possibilities?


Is there anything that prevent you to drop the lock, perform the
allocation in a reliable fashion (M_WAITOK) and try to reacquire the
lock later on?

 BTW, currently we have at least one place where a memory allocation of this 
 kind
 is done stealthily (and thus dangerously?).  ACPI resume code must execute
 AcpiLeaveSleepStatePrep with interrupts disabled and ACPICA code performs 
 memory
 allocations in that code path.  Since the interrupts are disabled by means of
 intr_disable(), witness(9) and similar are completely oblivious of the fact.

 --
 Andriy Gapon
 ___
 freebsd-hackers@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
 To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org

Thanks,

-- 
Davide
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: memory allocation in spinlock context

2013-03-01 Thread Andriy Gapon
on 01/03/2013 16:22 Matthew Jacob said the following:
 On 3/1/2013 5:50 AM, Andriy Gapon wrote:
 I am trying to understand if it is possible to allow memory allocations 
 (M_NOWAIT,
 of course) in a spinlock context.

 There are mechanisms to do just this- essentially by creating private pools 
 that
 are organized in a way to allow for spinlock (and thus possible interrupt 
 level)
 safe allocations (and failure if the pool is empty). Are you trying to make a
 general mechanism for this?

I am just pondering what would it take to develop such a general mechanism.

-- 
Andriy Gapon
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: memory allocation in spinlock context

2013-03-01 Thread Alfred Perlstein

On 3/1/13 5:50 AM, Andriy Gapon wrote:

I am trying to understand if it is possible to allow memory allocations 
(M_NOWAIT,
of course) in a spinlock context.
I do not see any obvious architectural obstacles.
But the fact that all of the uma locks, system map lock, object locks, page 
queue
locks and so on are regular mutexes makes it impossible to allocate memory 
without
violating the fundamental lock ordering rules.

Could all of the above mentioned locks potentially be converted to spin mutexes?
(And that seems to be a large nasty change)
Are there any alternative possibilities?

BTW, currently we have at least one place where a memory allocation of this kind
is done stealthily (and thus dangerously?).  ACPI resume code must execute
AcpiLeaveSleepStatePrep with interrupts disabled and ACPICA code performs memory
allocations in that code path.  Since the interrupts are disabled by means of
intr_disable(), witness(9) and similar are completely oblivious of the fact.

Typically the need for such a facility means that the locks are being 
held for too long.


I think someone has suggested using a private allocator carving out of a 
pre-allocated space.


Depending on the subsystem you are allocating for this may work for you.

I am looking to do this for the kernel gzip routines so that we can do 
compressed kernel dumps as soon as I verify the bounds of the gzip 
allocations.


-Alfred
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org