diff options
author | Drew Richardson <drew.richardson@arm.com> | 2012-07-31 12:00:00 -0700 |
---|---|---|
committer | Drew Richardson <drew.richardson@arm.com> | 2014-12-19 15:29:29 -0800 |
commit | 5f9955b9c65967a7a62f7860295d8ac187c9ec11 (patch) | |
tree | f5c3a2b6025bf9f3e436b8de9ae9f67131fe854d /driver/gator_events_net.c | |
parent | 3abe11d177c6c93fab66d04fd42d11452a0c508e (diff) |
gator: Version 5.115.11
Signed-off-by: Drew Richardson <drew.richardson@arm.com>
Diffstat (limited to 'driver/gator_events_net.c')
-rw-r--r-- | driver/gator_events_net.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/driver/gator_events_net.c b/driver/gator_events_net.c index 9298905..11282b5 100644 --- a/driver/gator_events_net.c +++ b/driver/gator_events_net.c @@ -23,6 +23,9 @@ static int rx_total, tx_total; static ulong netPrev[TOTALNET]; static int netGet[TOTALNET * 4]; +static struct timer_list net_wake_up_timer; + +// Must be run in process context as the kernel function dev_get_stats() can sleep static void get_network_stats(struct work_struct *wsptr) { int rx = 0, tx = 0; struct net_device *dev; @@ -42,6 +45,12 @@ static void get_network_stats(struct work_struct *wsptr) { } DECLARE_WORK(wq_get_stats, get_network_stats); +static void net_wake_up_handler(unsigned long unused_data) +{ + // had to delay scheduling work as attempting to schedule work during the context switch is illegal in kernel versions 3.5 and greater + schedule_work(&wq_get_stats); +} + static void calculate_delta(int *rx, int *tx) { int rx_calc, tx_calc; @@ -83,14 +92,16 @@ static int gator_events_net_create_files(struct super_block *sb, struct dentry * static int gator_events_net_start(void) { - get_network_stats(NULL); + get_network_stats(0); netPrev[NETRX] = rx_total; netPrev[NETTX] = tx_total; + setup_timer(&net_wake_up_timer, net_wake_up_handler, 0); return 0; } static void gator_events_net_stop(void) { + del_timer_sync(&net_wake_up_timer); netrx_enabled = 0; nettx_enabled = 0; } @@ -106,11 +117,7 @@ static int gator_events_net_read(int **buffer) if (!netrx_enabled && !nettx_enabled) return 0; - if (in_interrupt()){ - schedule_work(&wq_get_stats); - } else { - get_network_stats(NULL); - } + mod_timer(&net_wake_up_timer, jiffies + 1); calculate_delta(&rx_delta, &tx_delta); |