Nobita/026.高速化パッチby junjunn


Top / Nobita / 026.高速化パッチby junjunn

このページは何か? (by ひげぽん)

695  Name: junjunn ◆juNJunRuNQ  [sage] Date: 2007/01/19(金) 21:37:42  ID:  Be:
   >ひげぽんさんへ
   改変ソースはここに上げておきます。
   http://www.geocities.jp/mona_cgui/temp/kernel.zip
   http://www.geocities.jp/mona_cgui/temp/file_server.zip
   いじったのは主にFile.binです。
   IDEドライバの中に大きいボトルネックがあったのを発見したので
   それを取り除いたら一気に伸びました。
   後はカーネルとmonapiの、両方のmemcpyとmemsetをいじったような気がします。
   すみませんがソースの安全性は保証できません・・・
   テストの為に私が後先考えず改造やメモを入れてゴミを撒き散らしましたし、
   もしかしたら新しいバグを作ったりしてたりひどい有様ですが
   それでもよかったら改造箇所をフィードバックするなり自由に使ってください。

取り込み

1169307018*[Mona] junjunnさんのファイルシステム高速化をとりこもう

現在の trunk と junjunnさんのファイルシステムコードの diff をとって差分を把握してからとりこみたい。
ただ単純に diff をとったのでは大量の変更(数千行)が検出されてしまいうれしくない。

問題点は

取り込み

取り込みの前に、file_server_on_linux でテストが通るか、valgrind でリークチェックが必要。
valgrind でエラーが出たので、修正。

今回はウェイトとして入れていた sleep がボトルネックになっていたのだけど、これをなくすのであれば実機での検証が必要。
ただ手元の2個の実機では、Eltorito 周りでエラーになっているっぽくて検証できず。
勢いで commit してしまった。

感想

diff を見ると意外に少ないと思う人もいるかもしれないのだけど、ボトルネックを見つけるまでに、いろいろ試行錯誤した後が多数見られてかなりすごいです。
チューニングに楽な道はなくて

junjunnさんは高速化を実現したという結果と、その過程の両方ですげーな思いました。

diff

====

|diff|
Index: ISO9660/ISO9660FileSystem.cpp
===================================================================

  • ISO9660/ISO9660FileSystem.cpp (リビジョン 3961)
  1. ISO9660/ISO9660FileSystem.cpp (リビジョン 3962)
    @@ -96,13 +96,14 @@
        int sectorCount = (offset + readSize + SECTOR_SIZE - 1) / SECTOR_SIZE - offset / SECTOR_SIZE;
        uint32_t sectorSize = sectorCount * SECTOR_SIZE;
    
  • uint8_t* temp = new uint8_t[sectorSize];
  1. #if 0
  2. byte* temp = new byte[sectorSize];
        if (temp == NULL) return MONA_FAILURE;
    
        bool readResult = drive_->read(lba, temp, sectorSize) == 0;
        if (!readResult)
        {
  • delete temp;
  1. delete[] temp;
            return MONA_FAILURE;
        }
    
    @@ -117,6 +118,45 @@
        delete[] temp;
        context->resultSize = readSize;
        return MONA_SUCCESS;
  2. #else
  3. int dataOffset = offset - (lba - fileEntry->attribute.extent) * SECTOR_SIZE;
  4. context->memory = monapi_cmemoryinfo_new();
  5. if (!monapi_cmemoryinfo_create(context->memory, readSize, MONAPI_FALSE))
  6. {
  7. monapi_cmemoryinfo_delete(context->memory);
  8. return MONA_ERROR_MEMORY_NOT_ENOUGH;
  9. }
  10. // by junjunn
  11. if (0 == dataOffset)
  12. {
  13. // by higepon
  14. // bool readResult = drive_->read(lba, context->memory->Data, sectorSize) == 0;
  15. bool readResult = drive_->read(lba, context->memory->Data, readSize) == 0;
  16. if (!readResult)
  17. {
  18. return MONA_FAILURE;
  19. }
  20. }
  21. else
  22. {
  23. uint8_t* temp = new uint8_t[sectorSize];
  24. if (temp == NULL) return MONA_FAILURE;
  25. bool readResult = drive_->read(lba, temp, sectorSize) == 0;
  26. if (!readResult)
  27. {
  28. delete temp;
  29. return MONA_FAILURE;
  30. }
  31. memcpy(context->memory->Data, temp + dataOffset, readSize);
  32. delete[] temp;
  33. }
  34. context->resultSize = readSize;
  35. return MONA_SUCCESS;
  36. #endif
    }
    
    int ISO9660FileSystem::seek(Vnode* file, uint32_t offset, uint32_t origin)
    Index: IDEDriver.cpp
    ===================================================================
    • IDEDriver.cpp (リビジョン 3961)
    1. IDEDriver.cpp (リビジョン 3962)
      @@ -17,6 +17,7 @@
      using namespace MonAPI;
      
      //#define DEBUG_READ_TRACE
  37. #define FAST_JUNJUNN 1
    /*----------------------------------------------------------------------
        IDEDRIVER
    @@ -357,7 +358,9 @@
        outp8(controller, ATA_BLR, (uint8_t)(command->limit & 0xff));
        outp8(controller, ATA_BHR, (uint8_t)(command->limit >> 8));
        outp8(controller, ATA_CMR, 0xa0);
  38. #ifndef FAST_JUNJUNN
        sleep(1);
  39. #endif
        uint32_t i;
        for (i = 0; i < ATA_TIMEOUT; i++)
    @@ -455,7 +458,9 @@
        }
    
        outp8(controllers, ATA_CMR, command->command);
  40. #ifndef FAST_JUNJUNN
        sleep(1);
  41. #endif
        /* wait busy clear */
        if (!waitBusyClear(controller))
    @@ -504,7 +509,9 @@
        }
    
        outp8(controller, ATA_CMR, command->command);
  42. #ifndef FAST_JUNJUNN
        sleep(1);
  43. #endif
        /* read atlternate status once */
        inp8(controller, ATA_ASR);
    @@ -708,11 +715,15 @@
    {
        /* software reset */
        outp8(controller, ATA_DCR, 0x06);
  44. #ifndef FAST_JUNJUNN
        sleep(5);
  45. #endif
        /* no interrupt */
        outp8(controller, ATA_DCR, 0x02);
  46. #ifndef FAST_JUNJUNN
        sleep(5);
  47. #endif
        setDeviceTypeFirst(controller, MASTER);
        setDeviceTypeSecond(controller, MASTER);
    @@ -740,7 +751,7 @@
        {
            /* select device */
            outp8(controller, ATA_DHR, deviceValue(deviceNo));
  • sleep(10);
  1. // sleep(10);
            c = inp8(controller, ATA_STR);
            if (c == 0xff) break;
    @@ -800,7 +811,9 @@
        {
            bool firstResult = commandIdentify(controller, deviceNo, buffer);
            int firstError   = getLastError();
  2. #ifndef FAST_JUNJUNN
            sleep(5);
  3. #endif
            bool secondResult = commandIdentify(controller, deviceNo, buffer);
            int secondError   = getLastError();
    
    @@ -863,7 +876,9 @@
            if (whichController == controller && device->deviceNo == deviceNo)
            {
                outp8(controller, ATA_DHR, deviceValue(deviceNo));
  4. #ifndef FAST_JUNJUNN
                sleep(10);
  5. #endif
                return true;
            }
        }
    @@ -872,9 +887,10 @@
        /* select device */
        outp8(controller, ATA_DHR, deviceValue(deviceNo));
  6. #ifndef FAST_JUNJUNN
        sleep(10);
  •     if (!waitBusyAndDataRequestBothClear(controller)) return false;
  1. #endif
        whichController = controller;
        whichController->selectedDevice = &controller->devices[deviceNo];
    ||<

コメント

コメントはありません。 コメント/Nobita/026.高速化パッチby junjunn?

お名前:

MENU

now: 3

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2423, today: 1, yesterday: 0

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:47:55 (3737d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.088 sec.