Dear. genode...
I have an issue in the "part_blk" Example code. I have tested the program on the pandaboard with a little modifcation.
I have "Packet Overrun" problem when i apply request size of 128kbytes. Could you please advice me how can i solve this issue. Following Example code is the modified version of "part_blk" Example.
Modified version genode Example code -------------------------------------------------------------------------------------
class Sector { ~~~~~~~~~ skip ~~~~~~~~ }
#define DB_SIZE 1*1024*1024 // 1M #define RETRY_NUM 5 #define _HIGH(_A_) (unsigned int)(_A_) #define _LOW(_B_, _C_ ) (unsigned int)(((_B_) - (unsigned int)(_B_))*(_C_)) unsigned int request_size = 0; static Timer::Connection timer; unsigned long timer_start, timer_end; unsigned int request_table[10] = { 512, 1024, 2048, 4096, 8192, 16384 , 32768, 65536, 131072, 0 }; Sector s; int main() {
Genode::printf("**************************************************\n"); Genode::printf("** Test Program for part blk speed check. **\n"); Genode::printf("**************************************************\n");
unsigned pattern; try { Genode::config()->xml_node().attribute("pattern").value(&pattern); } catch (...) { PERR("Test Failed"); return 1; }
size_t blk_count; Block::Session::Operations ops; _blk.info(&blk_count, &_blk_size, &ops); if (verbose) printf("Found device %zu blocks of %zu bytes\n", blk_count, _blk_size);
size_t bytes_sended = 0; size_t toWrite_blk_count = DB_SIZE / _blk_size; unsigned int request_blk_count = 0; double speed[RETRY_NUM] = {0.0,}; int k =0; // Write speed check code with re-try number and variablable request_size. while ( (request_size = request_table[k]) != 0 ) { request_blk_count = request_size / _blk_size; bytes_sended = toWrite_blk_count * _blk_size; int i =0; /* write first and last block of device useing 'pattern' */ for( i=0; i < RETRY_NUM ; i++ ) { timer_start = timer.elapsed_ms(); for( int j =0; j < toWrite_blk_count/request_blk_count ; j++) { s = Sector( j*request_blk_count + i*toWrite_blk_count , request_blk_count, true); memset(s.addr<void *>(), pattern + i, request_blk_count * _blk_size); s.submit_request(); } timer_end = timer.elapsed_ms(); speed[i] = ((double)bytes_sended * 1000.0) / static_cast<double>(timer_end - timer_start); }
double total_speed = 0; for( i =0; i < RETRY_NUM; i++) total_speed += speed[i]; total_speed = total_speed / RETRY_NUM; double spd_kbps = total_speed / 1024; PLOG("WRITE request_size=%u : speed_KBPS=%u.%03u, bytes_send: %u TRY_num: %d", request_size, _HIGH(spd_kbps), _LOW(spd_kbps, 1000) , bytes_sended, RETRY_NUM ); k++; }
unsigned *val = 0; unsigned *val_last = 0; size_t bytes_rcved = 0; k = 0; request_size = 0; char ** rcv_buffer = 0; rcv_buffer = new ( env()->heap() ) char * [RETRY_NUM]; for(int i=0; i < RETRY_NUM; i++) rcv_buffer[i] = new ( env()->heap() ) char[DB_SIZE];
while ( (request_size = request_table[k]) != 0 ) { request_blk_count = request_size / _blk_size; bytes_rcved = toWrite_blk_count * _blk_size; int i =0;
/* write first and last block of device useing 'pattern' */ for( i=0; i < RETRY_NUM ; i++ ) { timer_start = timer.elapsed_ms();
for(int j =0; j < toWrite_blk_count/request_blk_count ; j++) { /* read first and last block from device and compare to 'pattern' */ s = Sector( j*request_blk_count + i*toWrite_blk_count , request_blk_count, false ); s.submit_request(); val = s.addr<unsigned *>(); memcpy( &(rcv_buffer[i][j*request_blk_count*_blk_size]) , val , request_blk_count * _blk_size ); }
timer_end = timer.elapsed_ms(); speed[i] = ((double)bytes_rcved * 1000.0) / static_cast<double>(timer_end - timer_start); }
double total_speed = 0; for( i =0; i < RETRY_NUM; i++) total_speed += speed[i]; total_speed = total_speed / RETRY_NUM; double spd_kbps = total_speed / 1024;
PLOG("READ request_size=%u : speed_KBPS=%u.%03u, bytes_rcved: %u TRY_num: %d", request_size, _HIGH(spd_kbps), _LOW(spd_kbps, 1000) , bytes_rcved, RETRY_NUM ); k++; } for( int i=0; i< RETRY_NUM ; i++ ) destroy( env()->heap() , rcv_buffer[i] ); destroy( env()->heap() , rcv_buffer );
}
return 0; }
Have a good day. Thank you for your attention.
Eun Seok, Kim.