diff options
Diffstat (limited to 'native/src/blocking/dpcp.cpp')
| -rw-r--r-- | native/src/blocking/dpcp.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/native/src/blocking/dpcp.cpp b/native/src/blocking/dpcp.cpp index 6e194aa..a9b1288 100644 --- a/native/src/blocking/dpcp.cpp +++ b/native/src/blocking/dpcp.cpp | |||
| @@ -65,6 +65,7 @@ static unsigned int count_requests_to_cpu( | |||
| 65 | static Interference bound_blocking_dpcp( | 65 | static Interference bound_blocking_dpcp( |
| 66 | const TaskInfo* tsk, | 66 | const TaskInfo* tsk, |
| 67 | const ContentionSet& cont, | 67 | const ContentionSet& cont, |
| 68 | const PriorityCeilings& prio_ceiling, | ||
| 68 | unsigned int max_lower_prio) | 69 | unsigned int max_lower_prio) |
| 69 | { | 70 | { |
| 70 | Interference inter; | 71 | Interference inter; |
| @@ -86,7 +87,8 @@ static Interference bound_blocking_dpcp( | |||
| 86 | inter.count += num; | 87 | inter.count += num; |
| 87 | inter.total_length += num * req->get_request_length(); | 88 | inter.total_length += num * req->get_request_length(); |
| 88 | } | 89 | } |
| 89 | else if (max_lower_prio) | 90 | else if (max_lower_prio && |
| 91 | prio_ceiling[req->get_resource_id()] <= tsk->get_priority()) | ||
| 90 | { | 92 | { |
| 91 | // lower prio => only remaining | 93 | // lower prio => only remaining |
| 92 | num = std::min(req->get_max_num_requests(interval), max_lower_prio); | 94 | num = std::min(req->get_max_num_requests(interval), max_lower_prio); |
| @@ -103,6 +105,7 @@ static Interference bound_blocking_dpcp( | |||
| 103 | static Interference dpcp_remote_bound( | 105 | static Interference dpcp_remote_bound( |
| 104 | const TaskInfo& tsk, | 106 | const TaskInfo& tsk, |
| 105 | const ResourceLocality& locality, | 107 | const ResourceLocality& locality, |
| 108 | const PriorityCeilings& prio_ceilings, | ||
| 106 | const AllPerCluster& per_cpu) | 109 | const AllPerCluster& per_cpu) |
| 107 | { | 110 | { |
| 108 | Interference blocking; | 111 | Interference blocking; |
| @@ -118,7 +121,7 @@ static Interference dpcp_remote_bound( | |||
| 118 | reqs = count_requests_to_cpu(tsk, locality, cpu); | 121 | reqs = count_requests_to_cpu(tsk, locality, cpu); |
| 119 | 122 | ||
| 120 | if (reqs > 0) | 123 | if (reqs > 0) |
| 121 | blocking += bound_blocking_dpcp(&tsk, cs, reqs); | 124 | blocking += bound_blocking_dpcp(&tsk, cs, prio_ceilings, reqs); |
| 122 | } | 125 | } |
| 123 | cpu++; | 126 | cpu++; |
| 124 | } | 127 | } |
| @@ -150,6 +153,17 @@ static Interference dpcp_local_bound( | |||
| 150 | } | 153 | } |
| 151 | 154 | ||
| 152 | 155 | ||
| 156 | static PriorityCeilings get_priority_ceilings(const ResourceSharingInfo& info) | ||
| 157 | { | ||
| 158 | Resources resources; | ||
| 159 | PriorityCeilings ceilings; | ||
| 160 | |||
| 161 | split_by_resource(info, resources); | ||
| 162 | determine_priority_ceilings(resources, ceilings); | ||
| 163 | |||
| 164 | return ceilings; | ||
| 165 | } | ||
| 166 | |||
| 153 | BlockingBounds* dpcp_bounds(const ResourceSharingInfo& info, | 167 | BlockingBounds* dpcp_bounds(const ResourceSharingInfo& info, |
| 154 | const ResourceLocality& locality) | 168 | const ResourceLocality& locality) |
| 155 | { | 169 | { |
| @@ -158,6 +172,8 @@ BlockingBounds* dpcp_bounds(const ResourceSharingInfo& info, | |||
| 158 | split_by_locality(info, locality, per_cpu); | 172 | split_by_locality(info, locality, per_cpu); |
| 159 | sort_by_request_length(per_cpu); | 173 | sort_by_request_length(per_cpu); |
| 160 | 174 | ||
| 175 | PriorityCeilings prio_ceilings = get_priority_ceilings(info); | ||
| 176 | |||
| 161 | BlockingBounds* _results = new BlockingBounds(info); | 177 | BlockingBounds* _results = new BlockingBounds(info); |
| 162 | BlockingBounds& results = *_results; | 178 | BlockingBounds& results = *_results; |
| 163 | 179 | ||
| @@ -166,7 +182,7 @@ BlockingBounds* dpcp_bounds(const ResourceSharingInfo& info, | |||
| 166 | const TaskInfo& tsk = info.get_tasks()[i]; | 182 | const TaskInfo& tsk = info.get_tasks()[i]; |
| 167 | Interference remote, local; | 183 | Interference remote, local; |
| 168 | 184 | ||
| 169 | remote = dpcp_remote_bound(tsk, locality, per_cpu); | 185 | remote = dpcp_remote_bound(tsk, locality, prio_ceilings, per_cpu); |
| 170 | local = dpcp_local_bound(&tsk, per_cpu[tsk.get_cluster()]); | 186 | local = dpcp_local_bound(&tsk, per_cpu[tsk.get_cluster()]); |
| 171 | 187 | ||
| 172 | results[i] = remote + local; | 188 | results[i] = remote + local; |
