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.