DragonFly commits List (threaded) for 2007-01
DragonFly BSD
DragonFly commits List (threaded) for 2007-01
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: cvs commit: src/sys/boot/pc32/libi386 biosacpi.c src/sys/conf acpi.mk files src/sys/dev/acpica5 Makefile Makefile.inc acdragonfly.h acpi.c acpi_acad.c acpi_button.c acpi_cmbat.c acpi_cpu.c acpi_ec.c acpi_lid.c acpi_resource.c acpi_thermal.c ...


From: Johannes Hofmann <Johannes.Hofmann@xxxxxx>
Date: 19 Jan 2007 21:53:05 GMT

YONETANI Tomokazu <qhwt+dfly@les.ath.cx> wrote:
> On Fri, Jan 19, 2007 at 01:45:26PM +0100, Simon 'corecode' Schubert wrote:
>> YONETANI Tomokazu wrote:
>> >>Uff, now I've got it.
>> >>It hangs in OsdCache.c:AcpiOsAcquireObject
>> >>
>> >>Object = objcache_get(Cache->cache, M_WAITOK);
>> 
>> Heh.  The ACPI docs are simply not nice enough:
>> 
>> /*******************************************************************************
>> *
>> * FUNCTION:    AcpiOsCreateCache
>> *
>> * PARAMETERS:  CacheName       - Ascii name for the cache
>> *              ObjectSize      - Size of each cached object
>> *              MaxDepth        - Maximum depth of the cache (in objects)
>> *              ReturnCache     - Where the new cache object is returned
>> 
>> we interpret MaxDepth as "object limit".
>> 
>> but look what utcache.c/AcpiOsReleaseObject does:
>> 
>>    /* If cache is full, just free this object */
>> 
>>    if (Cache->CurrentDepth >= Cache->MaxDepth)
>>    {
>>        ACPI_FREE (Object);
>>        ACPI_MEM_TRACKING (Cache->TotalFreed++);
>>    }
>> 
>>    /* Otherwise put this object back into the cache */
>> 
>> Quite differently.  Basically MaxDepth is "maximum number of unallocated 
>> objects", not "maximum number of allocated objects".  bummer :)
> 
> A-ha, good catch.  So what can we do to this problem?  Since
> ACPI-CA original version doesn't have an upper limit to
> the number of allocated objects anyway, do we just ignore
> the MaxDepth parameter and trust our objcache's effectiveness?
> 
> Index: Osd/OsdCache.c
> ===================================================================
> RCS file: /home/source/dragonfly/cvs/src/sys/dev/acpica5/Osd/OsdCache.c,v
> retrieving revision 1.1
> diff -u -p -r1.1 OsdCache.c
> --- Osd/OsdCache.c      17 Jan 2007 17:31:19 -0000      1.1
> +++ Osd/OsdCache.c      19 Jan 2007 17:22:47 -0000
> @@ -52,8 +52,8 @@ AcpiOsCreateCache(char *CacheName, UINT1
>        cache = kmalloc(sizeof(*cache), M_TEMP, M_WAITOK);
>        cache->args.objsize = ObjectSize;
>        cache->args.mtype = M_CACHE;
> -       cache->cache = objcache_create(CacheName, MaxDepth, 0, NULL, NULL, NULL,
> -           objcache_malloc_alloc, objcache_malloc_free, &cache->args);
> +       cache->cache = objcache_create(CacheName, 0, 0, NULL, NULL,
> +           NULL, objcache_malloc_alloc, objcache_malloc_free, &cache->args);
>        *ReturnCache = cache;
>        return AE_OK;
> }


This fixes the hang for me!

 Thanks, Johannes



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]