add png
[lttv.git] / ltt / branches / poly / lttv / modules / gui / diskperformance / diskperformance.c
CommitLineData
a4f37ccd 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2005 Peter Ho
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19
20#include <math.h>
21
22#include <glib.h>
23#include <gtk/gtk.h>
24#include <gdk/gdk.h>
a4f37ccd 25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
a4f37ccd 28#include <ltt/ltt.h>
29#include <ltt/event.h>
30#include <ltt/type.h>
31#include <ltt/trace.h>
32#include <ltt/facility.h>
33#include <lttv/module.h>
34#include <lttv/hook.h>
35#include <lttv/tracecontext.h>
36#include <lttv/state.h>
37#include <lttv/filter.h>
38#include <lttvwindow/lttvwindow.h>
39#include <ltt/time.h>
40
41#include "hDiskPerformanceInsert.xpm"
42
43
44#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
45#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
4ea3dbbf 46#define TRACE_NUMBER 0
a4f37ccd 47#define NO_ITEMS 0
48
49enum{
50 DISKNAME_COLUMN,
51 BYTES_RD_COLUMN,
52 BYTES_RD_SEC_COLUMN,
53 NUM_RD_COLUMN,
54 BYTES_WR_COLUMN,
55 BYTES_WR_SEC_COLUMN,
56 NUM_WR_COLUMN,
57 N_COLUMNS
58};
4ea3dbbf 59
a4f37ccd 60enum operation_t {
61 LTTV_READ_OPERATION = 1,
62 LTTV_WRITE_OPERATION
63};
64
65typedef struct _DiskPerformanceData {
66
67 Tab * tab;
4ea3dbbf 68
a4f37ccd 69 LttvHooks * hooks_trace_after;
4ea3dbbf 70
a4f37ccd 71 LttvHooks * hooks_trace_before;
4ea3dbbf 72 /* time window */
73 TimeWindow time_window;
a4f37ccd 74
75 GtkWidget * scroll_win;
4ea3dbbf 76
a4f37ccd 77 /* Model containing list data */
78 GtkListStore *store_m;
4ea3dbbf 79
a4f37ccd 80 GtkWidget *hbox_v;
4ea3dbbf 81
a4f37ccd 82 /* Widget to display the data in a columned list */
83 GtkWidget *tree_v;
4ea3dbbf 84
a4f37ccd 85 /* Selection handler */
86 GtkTreeSelection *select_c;
87
88 GArray *disk_array;
89
4ea3dbbf 90 LttvHooksById * event_by_id_hooks;
91
a4f37ccd 92} DiskPerformanceData;
93
94
95typedef struct _lttv_block {
96 guint major_number;
97 guint minor_number;
98 guint size;
99} lttv_block;
100
101typedef struct _lttv_total_block {
102 char diskname[10];
103 guint64 total_bytes_read;
104 guint num_read_operations;
105 guint64 total_bytes_written;
106 guint num_write_operations;
107
108} lttv_total_block;
109
110GSList *g_disk_data_list = NULL ;
111
4ea3dbbf 112
113
114/* facility */
115GQuark LTT_FACILITY_BLOCK;
116
117/* events */
118GQuark LTT_EVENT_BLOCK_READ;
119GQuark LTT_EVENT_BLOCK_WRITE;
120
121static DiskPerformanceData *disk_performance_data(Tab *tab);
a4f37ccd 122static void disk_destroy_walk(gpointer data, gpointer user_data);
a4f37ccd 123static gboolean disk_show(void *hook_data, void *call_data);
124static gboolean trace_header(void *hook_data, void *call_data);
125static gboolean disk_update_time_window(void * hook_data, void * call_data);
a4f37ccd 126static void request_event( DiskPerformanceData *disk_performance);
127void gui_disperformance_free(DiskPerformanceData *event_viewer_data);
4ea3dbbf 128static void get_event_detail(LttEvent *e, lttv_block* disk_data);
a4f37ccd 129static char * major_minor_to_diskname( lttv_block* disk_data);
130static void sum_data(char* diskname, guint size, enum operation_t opt, GArray *disk_array);
4ea3dbbf 131static GtkWidget *disk_performance(Tab * tab);
132
133static gboolean block_read_callback(void *hook_data, void *call_data);
134
135static gboolean block_write_callback(void *hook_data, void *call_data);
136
137
138static gboolean disk_show(void *hook_data, void *call_data){
139
140 guint i;
141 lttv_total_block element;
142 GtkTreeIter iter;
143 LttTime time_interval;
144 guint64 time_interval_64;
145 guint64 temp_variable;
146 guint64 bytes_read_per_sec, bytes_written_per_sec;
147 g_info(" diskperformance: disk_show() \n");
148 DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
149 GArray *disk_array = disk_performance->disk_array;
150 time_interval = ltt_time_sub(disk_performance->time_window.end_time, disk_performance->time_window.start_time);
151
152 time_interval_64 = time_interval.tv_sec;
153 time_interval_64 *= NANOSECONDS_PER_SECOND;
154 time_interval_64 += time_interval.tv_nsec;
155 gtk_list_store_clear(disk_performance->store_m);
156 for(i = 0; i < disk_array->len; i++){
157
158 element = g_array_index(disk_array,lttv_total_block,i);
159 temp_variable = element.total_bytes_read * NANOSECONDS_PER_SECOND;
160 bytes_read_per_sec = (guint64) temp_variable / time_interval_64;
161
162 temp_variable = element.total_bytes_written * NANOSECONDS_PER_SECOND;
163 bytes_written_per_sec = (guint64) temp_variable / time_interval_64;
164
165 gtk_list_store_append (disk_performance->store_m, &iter);
166 gtk_list_store_set (disk_performance->store_m, &iter,
167 DISKNAME_COLUMN, element.diskname,
168 BYTES_RD_COLUMN, element.total_bytes_read,
169 BYTES_RD_SEC_COLUMN,bytes_read_per_sec,
170 NUM_RD_COLUMN, element.num_read_operations,
171 BYTES_WR_COLUMN, element.total_bytes_written,
172 BYTES_WR_SEC_COLUMN, bytes_written_per_sec,
173 NUM_WR_COLUMN, element.num_write_operations,
174 -1);
175
176 }
177 if(disk_performance->disk_array->len)
178 g_array_remove_range (disk_performance->disk_array,0,disk_performance->disk_array->len);
179 return FALSE;
180}
181
182static gboolean trace_header(void *hook_data, void *call_data){
183 return FALSE;
184}
185
186
187static gboolean disk_update_time_window(void * hook_data, void * call_data){
188
189 DiskPerformanceData *disk_performance = (DiskPerformanceData *) hook_data;
190 const TimeWindowNotifyData *time_window_nofify_data = ((const TimeWindowNotifyData *)call_data);
191 disk_performance->time_window = *time_window_nofify_data->new_time_window;
192 Tab *tab = disk_performance->tab;
193 lttvwindow_events_request_remove_all(tab, disk_performance);
194 request_event( disk_performance);
195
196
197 return FALSE;
198}
199
200void gui_disperformance_free(DiskPerformanceData *eventdata){
201 Tab *tab = eventdata->tab;
202 g_info("disperformance.c : gui_disperformance_free, %p", eventdata);
203 g_info("%p, %p", eventdata, tab);
204 if(tab != NULL)
205 {
206 g_array_free (eventdata->disk_array, TRUE);
207
208 lttvwindow_unregister_time_window_notify(tab,
209 disk_update_time_window,
210 eventdata);
211
212 lttvwindow_events_request_remove_all(eventdata->tab,
213 eventdata);
214 g_disk_data_list = g_slist_remove(g_disk_data_list, eventdata);
215 }
216 g_free(eventdata);
217 g_info("disperformance.c : gui_disperformance_free end, %p", eventdata);
218}
219
220
221
222
223
224
225void disk_destructor_full(DiskPerformanceData *disk_data)
226{
227
228 if(GTK_IS_WIDGET(disk_data->hbox_v))
229 gtk_widget_destroy(disk_data->hbox_v);
230
231}
232
233static void disk_destroy_walk(gpointer data, gpointer user_data)
234{
235 g_info("Walk destroy GUI disk performance Viewer");
236 disk_destructor_full((DiskPerformanceData*)data);
237}
238/**
239 * init function
240 *
241 *
242 * This is the entry point of the viewer.
243 *
244 */
245static void init()
246{
247
248 g_info("Init diskPerformance.c");
249
250 LTT_FACILITY_BLOCK = g_quark_from_string("block");
251 LTT_EVENT_BLOCK_READ = g_quark_from_string("read");
252 LTT_EVENT_BLOCK_WRITE = g_quark_from_string("write");
253
254 lttvwindow_register_constructor("diskperformance",
255 "/",
256 "Insert Disk Performance",
257 hDiskPerformanceInsert_xpm,
258 "Insert Disk Performance",
259 disk_performance);
260}
a4f37ccd 261
4ea3dbbf 262/**
263 * Constructor hook
264 *
265 */
266GtkWidget *disk_performance(Tab * tab)
267{
a4f37ccd 268
269 DiskPerformanceData* disk_data = disk_performance_data(tab);
270 if(disk_data)
271 return disk_data->hbox_v;
272 else
273 return NULL;
a4f37ccd 274}
275
4ea3dbbf 276/**
277 * This function initializes the Event Viewer functionnality through the
278 * GTK API.
279 */
280DiskPerformanceData *disk_performance_data(Tab *tab)
281{
a4f37ccd 282 LttTime end;
283 GtkTreeViewColumn *column;
284 GtkCellRenderer *renderer;
285 DiskPerformanceData* disk_data = g_new(DiskPerformanceData,1) ;
286
287 g_info("enter disk_performance_data \n");
288
289 disk_data->tab = tab;
290 disk_data->time_window = lttvwindow_get_time_window(tab);
291
292 disk_data->disk_array = g_array_new(FALSE, FALSE, sizeof(lttv_total_block ));
293
294 lttvwindow_register_time_window_notify(tab,
295 disk_update_time_window,
296 disk_data);
297
298 disk_data->scroll_win = gtk_scrolled_window_new (NULL, NULL);
299 gtk_widget_show (disk_data->scroll_win);
300 gtk_scrolled_window_set_policy(
301 GTK_SCROLLED_WINDOW(disk_data->scroll_win),
4ea3dbbf 302 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
303
a4f37ccd 304 /* Create a model for storing the data list */
305 disk_data->store_m = gtk_list_store_new (
306 N_COLUMNS, /* Total number of columns */
4ea3dbbf 307 G_TYPE_STRING, /* Diskname */
a4f37ccd 308 G_TYPE_INT64, /* Bytes read */
4ea3dbbf 309 G_TYPE_INT64, /* Bytes read/sec */
a4f37ccd 310 G_TYPE_INT,
4ea3dbbf 311 G_TYPE_INT64, /* bytes written */
312 G_TYPE_INT64, /* bytes written/sec */
a4f37ccd 313 G_TYPE_INT
314 );
315
316 disk_data->tree_v = gtk_tree_view_new_with_model (GTK_TREE_MODEL (disk_data->store_m));
4ea3dbbf 317
a4f37ccd 318 g_object_unref (G_OBJECT (disk_data->store_m));
319
320 renderer = gtk_cell_renderer_text_new ();
4ea3dbbf 321
a4f37ccd 322 column = gtk_tree_view_column_new_with_attributes ("DiskName",
323 renderer,
324 "text", DISKNAME_COLUMN,
325 NULL);
326 gtk_tree_view_column_set_alignment (column, 0.0);
327 gtk_tree_view_column_set_fixed_width (column, 45);
328 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
329
330 renderer = gtk_cell_renderer_text_new ();
331 column = gtk_tree_view_column_new_with_attributes ("BytesRead",
332 renderer,
333 "text", BYTES_RD_COLUMN,
334 NULL);
335 gtk_tree_view_column_set_alignment (column, 0.0);
336 gtk_tree_view_column_set_fixed_width (column, 220);
337 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
338
339 renderer = gtk_cell_renderer_text_new ();
340 column = gtk_tree_view_column_new_with_attributes ("BytesRead/sec",
341 renderer,
342 "text", BYTES_RD_SEC_COLUMN,
343 NULL);
344 gtk_tree_view_column_set_alignment (column, 1.0);
345 gtk_tree_view_column_set_fixed_width (column, 220);
346 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
347
348 renderer = gtk_cell_renderer_text_new ();
349 column = gtk_tree_view_column_new_with_attributes ("NumReadOperations",
350 renderer,
351 "text",NUM_RD_COLUMN,
352 NULL);
353 gtk_tree_view_column_set_alignment (column, 1.0);
354 gtk_tree_view_column_set_fixed_width (column, 220);
355 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
356
357 renderer = gtk_cell_renderer_text_new ();
358 column = gtk_tree_view_column_new_with_attributes ("BytesWritten",
359 renderer,
360 "text", BYTES_WR_COLUMN,
361 NULL);
362 gtk_tree_view_column_set_alignment (column, 0.0);
363 gtk_tree_view_column_set_fixed_width (column, 145);
364 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
365
366 renderer = gtk_cell_renderer_text_new ();
367 column = gtk_tree_view_column_new_with_attributes ("BytesWritten/sec",
368 renderer,
369 "text", BYTES_WR_SEC_COLUMN,
370 NULL);
371 gtk_tree_view_column_set_alignment (column, 1.0);
372 gtk_tree_view_column_set_fixed_width (column, 220);
373 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
374
375 renderer = gtk_cell_renderer_text_new ();
376 column = gtk_tree_view_column_new_with_attributes ("NumWriteOperations",
377 renderer,
378 "text",NUM_WR_COLUMN,
379 NULL);
380 gtk_tree_view_column_set_alignment (column, 0.0);
381 gtk_tree_view_column_set_fixed_width (column, 145);
382 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
383
384 disk_data->select_c = gtk_tree_view_get_selection (GTK_TREE_VIEW (disk_data->tree_v));
385 gtk_tree_selection_set_mode (disk_data->select_c, GTK_SELECTION_SINGLE);
4ea3dbbf 386
a4f37ccd 387 gtk_container_add (GTK_CONTAINER (disk_data->scroll_win), disk_data->tree_v);
388
389 disk_data->hbox_v = gtk_hbox_new(0, 0);
390 gtk_box_pack_start(GTK_BOX(disk_data->hbox_v), disk_data->scroll_win, TRUE, TRUE, 0);
391
392 gtk_widget_show(disk_data->hbox_v);
393 gtk_widget_show(disk_data->tree_v);
394
395
396 g_disk_data_list = g_slist_append(g_disk_data_list, disk_data);
397 g_object_set_data_full(G_OBJECT(disk_data->hbox_v),
398 "disk_data",
399 disk_data,
400 (GDestroyNotify)gui_disperformance_free);
401
402 request_event(disk_data);
403 return disk_data;
404}
a4f37ccd 405
4ea3dbbf 406/**
407 *
408 * For each trace in the traceset, this function:
409 * - calls lttv_trace_find_hook() & registers a hook function to event_by_id_hooks
410 * - registers a callback function to each hook
411 * - calls lttvwindow_events_request() to request data in a specific
412 * time interval to the main window
413 *
414 */
415static void request_event(DiskPerformanceData *disk_performance)
416{
417 guint i, k, l, nb_trace;
a4f37ccd 418
4ea3dbbf 419 GArray *hooks;
a4f37ccd 420
4ea3dbbf 421 guint ret;
422
423 LttvTraceHook *hook;
424
425 LttvTraceState *ts;
a4f37ccd 426
4ea3dbbf 427 LttvTraceHookByFacility *thf;
428
429 LttvTracesetContext *tsc = lttvwindow_get_traceset_context(disk_performance->tab);
430 /* Get the traceset */
431 LttvTraceset *traceset = tsc->ts;
432
433 nb_trace = lttv_traceset_number(traceset);
a4f37ccd 434
4ea3dbbf 435 for(i = 0; i<MIN(TRACE_NUMBER+1, nb_trace);i++)
436 {
437 EventsRequest *events_request = g_new(EventsRequest, 1);
438
439 hooks = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
440
441 hooks = g_array_set_size(hooks, 2);
442
443 /* Get a trace state */
444 ts = (LttvTraceState *)tsc->traces[i];
445
446 disk_performance->event_by_id_hooks = lttv_hooks_by_id_new();
447 /* Register event_by_id_hooks with a callback function */
448 ret = lttv_trace_find_hook(ts->parent.t,
449 LTT_FACILITY_BLOCK, LTT_EVENT_BLOCK_READ,
450 0, 0, 0,
451 block_read_callback,
452 disk_performance,
453 &g_array_index(hooks, LttvTraceHook, 0));
454
455 ret = lttv_trace_find_hook(ts->parent.t,
456 LTT_FACILITY_BLOCK, LTT_EVENT_BLOCK_WRITE,
457 0, 0, 0,
458 block_write_callback,
459 disk_performance,
460 &g_array_index(hooks, LttvTraceHook, 1));
461
462 g_assert(!ret);
463
464 /*iterate through the facility list*/
465 for(k = 0 ; k < hooks->len; k++)
466 {
467 hook = &g_array_index(hooks, LttvTraceHook, k);
468 for(l=0; l<hook->fac_list->len; l++)
469 {
470 thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l);
471 lttv_hooks_add(lttv_hooks_by_id_find(disk_performance->event_by_id_hooks, thf->id),
472 thf->h,
473 disk_performance,
474 LTTV_PRIO_DEFAULT);
475
476 }
477 }
478
479 disk_performance->hooks_trace_after = lttv_hooks_new();
480 /* Registers a hook function */
481 lttv_hooks_add(disk_performance->hooks_trace_after, disk_show, disk_performance, LTTV_PRIO_DEFAULT);
482
483 disk_performance->hooks_trace_before = lttv_hooks_new();
484 /* Registers a hook function */
485 lttv_hooks_add(disk_performance->hooks_trace_before, trace_header, disk_performance, LTTV_PRIO_DEFAULT);
486
487 /* Initalize the EventsRequest structure */
488 events_request->owner = disk_performance;
489 events_request->viewer_data = disk_performance;
490 events_request->servicing = FALSE;
491 events_request->start_time = disk_performance->time_window.start_time;
492 events_request->start_position = NULL;
493 events_request->stop_flag = FALSE;
494 events_request->end_time = disk_performance->time_window.end_time;
495 events_request->num_events = G_MAXUINT;
496 events_request->end_position = NULL;
497 events_request->trace = i;
498 events_request->hooks = hooks;
499 events_request->before_chunk_traceset = NULL;
500 events_request->before_chunk_trace = disk_performance->hooks_trace_before;
501 events_request->before_chunk_tracefile= NULL;
502 events_request->event = NULL;
503 events_request->event_by_id = disk_performance->event_by_id_hooks;
504 events_request->after_chunk_tracefile = NULL;
505 events_request->after_chunk_trace = NULL;
506 events_request->after_chunk_traceset = NULL;
507 events_request->before_request = NULL;
508 events_request->after_request = disk_performance->hooks_trace_after;
509
510 lttvwindow_events_request(disk_performance->tab, events_request);
a4f37ccd 511 }
a4f37ccd 512
a4f37ccd 513}
514
4ea3dbbf 515/**
516 * This function is called whenever a read event occurs.
517 *
518 */
519static gboolean block_read_callback(void *hook_data, void *call_data)
520{
521 LttEvent *e;
522 LttTime event_time;
523 unsigned cpu_id;
524 lttv_block block_read;
525 char *diskname;
526
527 LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
528 LttvTracefileState *tfs = (LttvTracefileState *)call_data;
529 DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
530 GArray *disk_array = disk_performance->disk_array;
531 e = ltt_tracefile_get_event(tfc->tf);
532 event_time = ltt_event_time(e);
533 cpu_id = ltt_event_cpu_id(e);
4ea3dbbf 534
e62ca91e 535 get_event_detail(e, &block_read);
536 diskname = major_minor_to_diskname(&block_read);
537 sum_data(diskname, block_read.size,LTTV_READ_OPERATION, disk_array);
538
539 return FALSE;
a4f37ccd 540}
541
4ea3dbbf 542/**
543 * This function is called whenever a write event occurs.
544 *
545 */
546static gboolean block_write_callback(void *hook_data, void *call_data)
547{
548 LttEvent *e;
549 LttTime event_time;
550 unsigned cpu_id;
551 lttv_block block_write;
552 char *diskname;
553 LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
554 LttvTracefileState *tfs = (LttvTracefileState *)call_data;
555 DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
556 GArray *disk_array = disk_performance->disk_array;
557 e = ltt_tracefile_get_event(tfc->tf);
558 event_time = ltt_event_time(e);
559 cpu_id = ltt_event_cpu_id(e);
e62ca91e 560
561 get_event_detail(e, &block_write);
562 diskname = major_minor_to_diskname(&block_write);
563 sum_data(diskname, block_write.size,LTTV_WRITE_OPERATION, disk_array);
564
4ea3dbbf 565 return FALSE;
a4f37ccd 566}
a4f37ccd 567
4ea3dbbf 568/**
569 * This function extracts the major, minor and size
570 *
571 */
572static void get_event_detail(LttEvent *e, lttv_block* disk_data)
573{
574 guint i, num_fields;
575 LttEventType *event_type;
576 LttField *element;
577 LttField *field;
578 event_type = ltt_event_eventtype(e);
579 num_fields = ltt_eventtype_num_fields(event_type);
580
581 for(i = 0 ; i < num_fields ; i++)
a4f37ccd 582 {
4ea3dbbf 583 element = ltt_eventtype_field(event_type,i);
e62ca91e 584 switch(i)
585 {
586 case 0:
587 disk_data->major_number = ltt_event_get_long_unsigned(e, element);
588 break;
589
590 case 1:
591 disk_data->minor_number = ltt_event_get_long_unsigned(e, element);
592 break;
593 case 2:
594 disk_data->size = ltt_event_get_long_unsigned(e, element);
595 break;
596 }
597
a4f37ccd 598 }
4ea3dbbf 599
a4f37ccd 600}
a4f37ccd 601
e62ca91e 602
a4f37ccd 603
4ea3dbbf 604/**
605 * This function calculates: the number of operations, the total bytes read or written,
606 * the average number of bytes read or written by sec.
607 */
608static void sum_data(char* diskname, guint size, enum operation_t operation, GArray *disk_array)
609{
a4f37ccd 610
611 lttv_total_block data;
612 lttv_total_block *element;
613 guint i;
614 gboolean notFound = FALSE;
615
616 memset ((void*)&data, 0,sizeof(lttv_total_block));
617
618 if(disk_array->len == NO_ITEMS){
619 strcpy(data.diskname, diskname);
620 if(operation == LTTV_READ_OPERATION){
621 data.total_bytes_read = size;
622 data.num_read_operations++;
623 }
624 else{
625 data.total_bytes_written = size;
626 data.num_write_operations ++;
627 }
628 g_array_append_val (disk_array, data);
629 }
630 else{
631 for(i = 0; i < disk_array->len; i++){
632 element = &g_array_index(disk_array,lttv_total_block,i);
633 if(strcmp(element->diskname,diskname) == 0){
634 if(operation == LTTV_READ_OPERATION){
635 element->num_read_operations++;
636 element->total_bytes_read += size;
637 }
638 else{
639 element->num_write_operations ++;
640 element->total_bytes_written += size;
641 }
642 notFound = TRUE;
643 }
644 }
645 if(!notFound){
646 strcpy(data.diskname, diskname);
647 if(operation == LTTV_READ_OPERATION){
648 data.total_bytes_read = size;
649 data.num_read_operations ++;
650 }
651 else{
652 data.total_bytes_written = size;
653 data.num_write_operations ++;
654 }
655 g_array_append_val (disk_array, data);
656 }
657 }
658}
659
a4f37ccd 660
a4f37ccd 661static void destroy()
662{
663 g_info("Destroy diskPerformance");
664 g_slist_foreach(g_disk_data_list, disk_destroy_walk, NULL );
665 g_slist_free(g_disk_data_list);
666
667 lttvwindow_unregister_constructor(disk_performance);
668
669}
670
e62ca91e 671/**
672 * This function convert the major and minor number to the corresponding disk.
673 * Data taken from Documentation/devices.txt of the kernel tree.
674 */
675static char * major_minor_to_diskname( lttv_block* disk_data)
676{
677 switch(disk_data->major_number)
678 {
679 /* IDE Disks */
680 case 3: /* First MFM, RLL and IDE hard disk/CD-ROM interface */
681 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
682 return "/dev/hda";
683 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
684 return "/dev/hdb";
685 break;
686
687 case 22: /*Second IDE hard disk/CD-ROM interface */
688 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
689 return "/dev/hdc";
690 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
691 return "/dev/hdd";
692 break;
693
694 case 33: /* Third IDE hard disk/CD-ROM interface */
695 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
696 return "/dev/hde";
697 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
698 return "/dev/hdf";
699 break;
700
701 case 34: /* Fourth IDE hard disk/CD-ROM interface */
702 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
703 return "/dev/hdg";
704 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
705 return "/dev/hdh";
706 break;
707
708 case 56: /* Fifth IDE hard disk/CD-ROM interface */
709 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
710 return "/dev/hdi";
711 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
712 return "/dev/hdj";
713 break;
714
715 case 57: /* Sixth IDE hard disk/CD-ROM interface */
716 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
717 return "/dev/hdk";
718 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
719 return "/dev/hdl";
720 break;
721
722 case 88: /* Seventh IDE hard disk/CD-ROM interface */
723 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
724 return "/dev/hdm";
725 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
726 return "/dev/hdn";
727 break;
728
729 case 89: /* Eighth IDE hard disk/CD-ROM interface */
730 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
731 return "/dev/hdo";
732 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
733 return "/dev/hdp";
734 break;
735
736 case 90: /* Ninth IDE hard disk/CD-ROM interface */
737 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
738 return "/dev/hdq";
739 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
740 return "/dev/hdr";
741 break;
742
743 case 91: /* Tenth IDE hard disk/CD-ROM interface */
744 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
745 return "/dev/hds";
746 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
747 return "/dev/hdt";
748 break;
749
750 /* SCSI Disks */
751 case 8: /* SCSI disk devices */
752 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
753 return "/dev/sda"; // First SCSI disk whole disk
754
755 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
756 return "/dev/sdb";// Second SCSI disk whole disk
757
758 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
759 return "/dev/sdc";// Third SCSI disk whole disk
760
761 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
762 return "/dev/sdd";// Fourth SCSI disk whole disk
763
764 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
765 return "/dev/sde";// Fifth SCSI disk whole disk
766
767 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
768 return "/dev/sdf";// Sixth SCSI disk whole disk
769
770 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
771 return "/dev/sdg";// seventh SCSI disk whole disk
772
773 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
774 return "/dev/sdh";// eighth SCSI disk whole disk
775
776 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
777 return "/dev/sdi";// 9th SCSI disk whole disk
778
779 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
780 return "/dev/sdj";// 10th SCSI disk whole disk
781
782 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
783 return "/dev/sdk";// 11th SCSI disk whole disk
784
785 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
786 return "/dev/sdl";// 12th SCSI disk whole disk
787
788 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
789 return "/dev/sdm";// 13th SCSI disk whole disk
790
791 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
792 return "/dev/sdn";// 14th SCSI disk whole disk
793
794 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
795 return "/dev/sdo";// 15th SCSI disk whole disk
796
797 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
798 return "/dev/sdp";// 16th SCSI disk whole disk
799 break;
800
801 case 65: /* SCSI disk devices */
802 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
803 return "/dev/sdq";
804
805 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
806 return "/dev/sdr";
807
808 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
809 return "/dev/sds";
810
811 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
812 return "/dev/sdt";
813
814 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
815 return "/dev/sdu";
816
817 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
818 return "/dev/sdv";
819
820 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
821 return "/dev/sdw";
822
823 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
824 return "/dev/sdy";
825
826 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
827 return "/dev/sdx";
828
829 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
830 return "/dev/sdz";
831
832 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
833 return "/dev/sdaa";
834
835 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
836 return "/dev/sdab";
837
838 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
839 return "/dev/sdac";
840
841 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
842 return "/dev/sdad";
843
844 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
845 return "/dev/sdae";
846
847 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
848 return "/dev/sdaf";
849 break;
850
851 case 66: /* SCSI disk devices */
852 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
853 return "/dev/sdag";
854
855 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
856 return "/dev/sdah";
857
858 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
859 return "/dev/sdai";
860
861 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
862 return "/dev/sdaj";
863
864 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
865 return "/dev/sdak";
866
867 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
868 return "/dev/sdal";
869
870 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
871 return "/dev/sdam";
872
873 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
874 return "/dev/sdan";
875
876 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
877 return "/dev/sdao";
878
879 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
880 return "/dev/sdap";
881
882 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
883 return "/dev/sdaq";
884
885 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
886 return "/dev/sdar";
887
888 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
889 return "/dev/sdas";
890
891 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
892 return "/dev/sdat";
893
894 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
895 return "/dev/sdau";
896
897 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
898 return "/dev/sdav";
899 break;
900
901
902 case 67: /* SCSI disk devices */
903 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
904 return "/dev/sdaw";
905
906 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
907 return "/dev/sdax";
908
909 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
910 return "/dev/sday";
911
912 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
913 return "/dev/sdaz";
914
915 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
916 return "/dev/sdba";
917
918 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
919 return "/dev/sdbb";
920
921 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
922 return "/dev/sdbc";
923
924 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
925 return "/dev/sdbd";
926
927 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
928 return "/dev/sdbe";
929
930 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
931 return "/dev/sdbf";
932
933 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
934 return "/dev/sdbg";
935
936 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
937 return "/dev/sdbh";
938
939 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
940 return "/dev/sdbi";
941
942 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
943 return "/dev/sdbj";
944
945 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
946 return "/dev/sdbk";
947
948 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
949 return "/dev/sdbl";
950 break;
951
952 case 68 : /* SCSI disk devices */
953 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
954 return "/dev/sdbm";
955
956 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
957 return "/dev/sdbm";
958
959 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
960 return "/dev/sdbo";
961
962 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
963 return "/dev/sdbp";
964
965 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
966 return "/dev/sdbq";
967
968 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
969 return "/dev/sdbr";
970
971 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
972 return "/dev/sdbs";
973
974 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
975 return "/dev/sdbt";
976
977 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
978 return "/dev/sdbu";
979
980 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
981 return "/dev/sdbv";
982
983 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
984 return "/dev/sdbw";
985
986 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
987 return "/dev/sdbx";
988
989 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
990 return "/dev/sdby";
991
992 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
993 return "/dev/sdbz";
994
995 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
996 return "/dev/sdca";
997
998 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
999 return "/dev/sdcb";
1000 break;
1001 case 69 : /* SCSI disk devices */
1002 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1003 return "/dev/sdcc";
1004
1005 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1006 return "/dev/sdcd";
1007
1008 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1009 return "/dev/sdce";
1010
1011 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1012 return "/dev/sdcf";
1013
1014 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1015 return "/dev/sdcg";
1016
1017 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1018 return "/dev/sdch";
1019
1020 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1021 return "/dev/sdci";
1022
1023 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1024 return "/dev/sdcj";
1025
1026 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1027 return "/dev/sdck";
1028
1029 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1030 return "/dev/sdcl";
1031
1032 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1033 return "/dev/sdcm";
1034
1035 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1036 return "/dev/sdcn";
1037
1038 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1039 return "/dev/sdco";
1040
1041 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1042 return "/dev/sdcp";
1043
1044 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1045 return "/dev/sdcq";
1046
1047 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1048 return "/dev/sdcr";
1049 break;
1050
1051
1052 case 70 : /* SCSI disk devices */
1053 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1054 return "/dev/sdcs";
1055
1056 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1057 return "/dev/sdct";
1058
1059 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1060 return "/dev/sdcu";
1061
1062 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1063 return "/dev/sdcv";
1064
1065 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1066 return "/dev/sdcw";
1067
1068 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1069 return "/dev/sdcx";
1070
1071 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1072 return "/dev/sdcy";
1073
1074 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1075 return "/dev/sdcz";
1076
1077 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1078 return "/dev/sdda";
1079
1080 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1081 return "/dev/sddb";
1082
1083 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1084 return "/dev/sddc";
1085
1086 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1087 return "/dev/sddd";
1088
1089 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1090 return "/dev/sdde";
a4f37ccd 1091
e62ca91e 1092 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1093 return "/dev/sddf";
1094
1095 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1096 return "/dev/sddg";
1097
1098 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1099 return "/dev/sddh";
1100 break;
1101
1102 case 71: /* SCSI disk devices */
1103 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1104 return "/dev/sddi";
1105
1106 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1107 return "/dev/sddj";
1108
1109 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1110 return "/dev/sddk";
1111
1112 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1113 return "/dev/sddl";
1114
1115 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1116 return "/dev/sddm";
1117
1118 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1119 return "/dev/sddn";
1120
1121 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1122 return "/dev/sddo";
1123
1124 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1125 return "/dev/sddp";
1126
1127 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1128 return "/dev/sddq";
1129
1130 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1131 return "/dev/sddr";
1132
1133 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1134 return "/dev/sdds";
1135
1136 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1137 return "/dev/sddt";
1138
1139 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1140 return "/dev/sddu";
1141
1142 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1143 return "/dev/sddv";
1144
1145 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1146 return "/dev/sddw";
1147
1148 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1149 return "/dev/sddx";
1150 break;
1151
1152 case 128: /* SCSI disk devices */
1153 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1154 return "/dev/sddy";
1155
1156 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1157 return "/dev/sddz";
1158
1159 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1160 return "/dev/sdea";
1161
1162 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1163 return "/dev/sdeb";
1164
1165 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1166 return "/dev/sdec";
1167
1168 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1169 return "/dev/sded";
1170
1171 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1172 return "/dev/sdee";
1173
1174 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1175 return "/dev/sdef";
1176
1177 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1178 return "/dev/sdeg";
1179
1180 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1181 return "/dev/sdeh";
1182
1183 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1184 return "/dev/sdei";
1185
1186 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1187 return "/dev/sdej";
1188
1189 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1190 return "/dev/sdek";
1191
1192 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1193 return "/dev/sdel";
1194
1195 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1196 return "/dev/sdem";
1197
1198 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1199 return "/dev/sden";
1200 break;
1201
1202 case 129: /* SCSI disk devices */
1203 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1204 return "/dev/sdeo";
1205
1206 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1207 return "/dev/sdep";
1208
1209 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1210 return "/dev/sdeq";
1211
1212 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1213 return "/dev/sder";
1214
1215 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1216 return "/dev/sdes";
1217
1218 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1219 return "/dev/sdet";
1220
1221 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1222 return "/dev/sdeu";
1223
1224 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1225 return "/dev/sdev";
1226
1227 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1228 return "/dev/sdew";
1229
1230 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1231 return "/dev/sdez";
1232
1233 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1234 return "/dev/sdey";
1235
1236 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1237 return "/dev/sdez";
1238
1239 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1240 return "/dev/sdfa";
1241
1242 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1243 return "/dev/sdfb";
1244
1245 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1246 return "/dev/sdfc";
1247
1248 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1249 return "/dev/sdfd";
1250 break;
1251 /*USB block devices*/
1252 case 180:
1253 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 8))
1254 return "/dev/uba";
1255 if( (disk_data->minor_number >= 8) && (disk_data->minor_number < 16))
1256 return "/dev/ubb";
1257 if( (disk_data->minor_number >= 16) && (disk_data->minor_number < 24))
1258 return "/dev/ubc";
1259 break;
1260
1261 }
1262
1263
1264}
a4f37ccd 1265LTTV_MODULE("diskperformance", "disk info view", \
1266 "Produce disk I/O performance", \
1267 init, destroy, "lttvwindow")
1268
This page took 0.078321 seconds and 4 git commands to generate.