mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-11 11:51:46 +00:00
hw: do inter-processor interrupt only when needed
The processor scheduler can determine without much overhead wether the currently scheduled client becomes out-dated due to the insertion of another client. This can be used to safe inter-processor interrupts when a remote insertion doesn't imply an update of the currently scheduled client. fix #1088
This commit is contained in:
parent
18cee192e2
commit
8ce197d7fa
@ -61,13 +61,17 @@ void Kernel::Processor_client::_schedule() { __processor->schedule(this); }
|
|||||||
|
|
||||||
void Kernel::Processor::schedule(Processor_client * const client)
|
void Kernel::Processor::schedule(Processor_client * const client)
|
||||||
{
|
{
|
||||||
/* schedule processor client */
|
if (_id != executing_id()) {
|
||||||
_scheduler.insert(client);
|
|
||||||
|
|
||||||
/* let the processor notice the change immediately */
|
/* remote add client and let target processor notice it if necessary */
|
||||||
if (_id != executing_id() && !_ip_interrupt_pending) {
|
if (_scheduler.insert_and_check(client) && !_ip_interrupt_pending) {
|
||||||
pic()->trigger_ip_interrupt(_id);
|
pic()->trigger_ip_interrupt(_id);
|
||||||
_ip_interrupt_pending = true;
|
_ip_interrupt_pending = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* add client locally */
|
||||||
|
_scheduler.insert(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,6 +279,20 @@ class Kernel::Scheduler
|
|||||||
_items[i->priority()].insert_tail(i);
|
_items[i->priority()].insert_tail(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Include item in scheduling and check wether an update is needed
|
||||||
|
*
|
||||||
|
* \param item targeted item
|
||||||
|
*
|
||||||
|
* \return wether the current occupant is out-dated after insertion
|
||||||
|
*/
|
||||||
|
bool insert_and_check(T * const item)
|
||||||
|
{
|
||||||
|
insert(item);
|
||||||
|
if (!_occupant) { return true; }
|
||||||
|
return item->priority() > _occupant->priority();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exclude 'i' from scheduling
|
* Exclude 'i' from scheduling
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user