Page 6 of 12

Re: AHCI

Posted: Thu Apr 04, 2013 3:25 pm
by Mario_r4
Размер не влияет, потому что там алгоритм перебирает по кольцу все номера секторов кешированных, никаких хитрых списков ускоряющих поиск. Так что с увеличением кеша скорость даже может упасть при текущем алгоритме поиска.

Re: AHCI

Posted: Thu Apr 04, 2013 4:15 pm
by Serge
Для AHCI пришлось делать в драйвере свой собственный кэш с поиском по хеш-таблице, потому что fat32 читает с диска по одному сектору, а это очень медленно.
Тесты: кэш 4 Мб
256 элементов по 16КБ - 7.4 с
128 х 32КБ - 6.3 с
64 х 128КБ - 5.8 с

кэш 8 МБ
512 х 16Кб - 7.3 с
256 х 32КБ - 6.4 с
128 х 64 КБ - 5.8 с

кэш 2МБ
128 х 32КБ - 6.3 с

Re: AHCI

Posted: Thu Apr 04, 2013 4:23 pm
by Leency
Копировал 100500 файлов из /sd в /tmp и где-то что-то пошло не так. В системе были /bd.
В логе, кстати, видно место, когда произошла проблема с копированием файла. Потом я пытался убить безуспешно поток (видно в логах), т.к. после изменений CleverMouse поток умрёт только после полного окончания работы с ФС.

Re: AHCI

Posted: Thu Apr 04, 2013 4:47 pm
by Serge
Leency
Ты про
Error: CopyFile->ReadFile
/bd1/4/Testing files/Big_folder_1/1 (1345).txt
Error #6 - End of file, EOF
или
K : Process - forced terminate PID: 00000029 [EOLITE]
K : Page fault
K : EAX : 0C49A5C8 EBX : 00C30010 ECX : 00270003
K : EDX : 00FFFFFF ESI : 00021730 EDI : 0001025C
K : EBP : 0009FFCC EIP : 00019247 ESP : 0009FFC0
K : Flags : 00011202 CS : 0000001B (application)
Я не могу пока отключить /bd после загрузки AHCI, но тот, кто использует два разных механизма для доступа к одному устройству - ССЗБ.

Re: AHCI

Posted: Thu Apr 04, 2013 4:55 pm
by Leency
Первое. ОК, в следующий раз буду отключать.

Re: AHCI

Posted: Thu Apr 04, 2013 5:34 pm
by Mario_r4
Serge wrote:Для AHCI пришлось делать в драйвере свой собственный кэш с поиском по хеш-таблице,
Было бы замечательно прикрутить и к IDE режиму. Я в свое время не осилил к сожалению, хоть и планы были.
Serge wrote:потому что fat32 читает с диска по одному сектору, а это очень медленно.
Для DMA есть предварительный кэш на 16 секторов, которые считываются одним запросом.

Re: AHCI

Posted: Fri Jun 07, 2013 8:28 am
by Mario_r4

Re: AHCI

Posted: Thu Jun 20, 2013 4:45 pm
by Serge
Для справки, дисковый кеш ahci
Spoiler:

Code: Select all

#define BLOCK_SIZE    64
#define BLOCK_SHIFT    6
#define CACHE_SIZE    64
#define SECTOR_SIZE  512

size_t  _stdcall ahci_adjust_cache_size(void* userdata, size_t suggested_size)
{
    printf("LRU cache %dx%dKB size %d\n",CACHE_SIZE,BLOCK_SIZE/2, CACHE_SIZE*BLOCK_SIZE*SECTOR_SIZE);
    return 0; //suggested_size;
}

typedef struct
{
    struct list_head lru_list;
    struct list_head key_list;
    int64_t start;
    char   *mem;
    void   *r;
}dcache_t;

dcache_t dcache[CACHE_SIZE];

struct list_head key_hash[CACHE_SIZE];

struct list_head dcache_lru;

int init_dcache()
{
    int i;
    char *mem;

    mem = KernelAlloc(CACHE_SIZE*BLOCK_SIZE*SECTOR_SIZE);

    if(mem == NULL)
        return -ENOMEM;

    for(i = 0; i < CACHE_SIZE; i++)
        INIT_LIST_HEAD(&key_hash[i]);

    INIT_LIST_HEAD(&dcache_lru);

    for(i = 0; i < CACHE_SIZE; i++)
    {
        INIT_LIST_HEAD(&dcache[i].key_list);

        dcache[i].mem = mem + i * BLOCK_SIZE * SECTOR_SIZE;
        list_add_tail(&dcache[i].lru_list, &dcache_lru);
    }

    return 0;
};


int _stdcall dcache_disk_read(void* userdata, void* buffer, int64_t startsector, int* numsectors)
{
    int i, key;
    int64_t sector;
    int     offset;
    dcache_t *cache, *tmp_cache;

//    return ahci_disk_read(userdata, buffer, startsector, *numsectors);

    for(i = 0; i < *numsectors; i++)
    {
        sector = (startsector + i) & ~((u64)BLOCK_SIZE - 1);
        offset = (startsector + i) & (BLOCK_SIZE - 1);

        key = (sector >> BLOCK_SHIFT) & (CACHE_SIZE - 1);

        cache = NULL;

        list_for_each_entry(tmp_cache, &key_hash[key], key_list)
        {
            if(tmp_cache->start == sector)
            {
                cache = tmp_cache;
                list_del(&cache->lru_list);
                break;
            }
        };

        if(cache == NULL)
        {
            cache = container_of(dcache_lru.next, dcache_t, lru_list);
            list_del(&cache->key_list);
            list_del(&cache->lru_list);

            ahci_disk_read(userdata, cache->mem, sector, BLOCK_SIZE);
            cache->start = sector;
            list_add_tail(&cache->key_list, &key_hash[key]);
        }

        list_add_tail(&cache->lru_list, &dcache_lru);

        memcpy((char*)buffer + i * SECTOR_SIZE, cache->mem + offset *SECTOR_SIZE, SECTOR_SIZE);
    };

    return 0;
};

Re: AHCI

Posted: Mon Jul 01, 2013 7:43 pm
by CleverMouse
Начиная с ядра r3742, разделы ntfs и ext2 с драйвером тоже должны работать.
Dell Vostro: таки да, чтение работает.

Re: AHCI

Posted: Mon Jul 01, 2013 8:01 pm
by Serge
Отличная новость !

Re: AHCI

Posted: Mon Jul 01, 2013 8:22 pm
by Serge
Проверил воспроизведение видео, работает, но скорости чтения файловой системы недостаточно.

Re: AHCI

Posted: Mon Jul 29, 2013 4:51 pm
by popovpa
Лог на моём ноутбуке.

Re: AHCI

Posted: Sun Aug 11, 2013 5:00 pm
by Leency
Диски не видны. Ноутбук Aspire 4740G

Re: AHCI

Posted: Tue Aug 20, 2013 9:41 am
by Serge
popovpa
А как всё в реальности подключено ?

Leency
А драйвер вообще запускался ? Я никаких следов этого не обнаружил.

Re: AHCI

Posted: Tue Aug 20, 2013 9:50 am
by Serge
ftp://ftp.kolibrios.org/users/Serge/new/ahci_rc06.7z
Отключены режимы энергосбережения. Прощайте, батарейки.
Mario_r4
Интересует вредный Dell Inspiron N7010