|
@@ -57,13 +57,24 @@ static void pm_calc_rlib_size(struct packet_manager *pm,
|
|
|
{
|
|
|
unsigned int process_count, queue_count;
|
|
|
unsigned int map_queue_size;
|
|
|
+ unsigned int max_proc_per_quantum = 1;
|
|
|
+ struct kfd_dev *dev = pm->dqm->dev;
|
|
|
|
|
|
process_count = pm->dqm->processes_count;
|
|
|
queue_count = pm->dqm->queue_count;
|
|
|
|
|
|
- /* check if there is over subscription*/
|
|
|
+ /* check if there is over subscription
|
|
|
+ * Note: the arbitration between the number of VMIDs and
|
|
|
+ * hws_max_conc_proc has been done in
|
|
|
+ * kgd2kfd_device_init().
|
|
|
+ */
|
|
|
*over_subscription = false;
|
|
|
- if ((process_count > 1) || queue_count > get_queues_num(pm->dqm)) {
|
|
|
+
|
|
|
+ if (dev->max_proc_per_quantum > 1)
|
|
|
+ max_proc_per_quantum = dev->max_proc_per_quantum;
|
|
|
+
|
|
|
+ if ((process_count > max_proc_per_quantum) ||
|
|
|
+ queue_count > get_queues_num(pm->dqm)) {
|
|
|
*over_subscription = true;
|
|
|
pr_debug("Over subscribed runlist\n");
|
|
|
}
|
|
@@ -116,10 +127,24 @@ static int pm_create_runlist(struct packet_manager *pm, uint32_t *buffer,
|
|
|
uint64_t ib, size_t ib_size_in_dwords, bool chain)
|
|
|
{
|
|
|
struct pm4_mes_runlist *packet;
|
|
|
+ int concurrent_proc_cnt = 0;
|
|
|
+ struct kfd_dev *kfd = pm->dqm->dev;
|
|
|
|
|
|
if (WARN_ON(!ib))
|
|
|
return -EFAULT;
|
|
|
|
|
|
+ /* Determine the number of processes to map together to HW:
|
|
|
+ * it can not exceed the number of VMIDs available to the
|
|
|
+ * scheduler, and it is determined by the smaller of the number
|
|
|
+ * of processes in the runlist and kfd module parameter
|
|
|
+ * hws_max_conc_proc.
|
|
|
+ * Note: the arbitration between the number of VMIDs and
|
|
|
+ * hws_max_conc_proc has been done in
|
|
|
+ * kgd2kfd_device_init().
|
|
|
+ */
|
|
|
+ concurrent_proc_cnt = min(pm->dqm->processes_count,
|
|
|
+ kfd->max_proc_per_quantum);
|
|
|
+
|
|
|
packet = (struct pm4_mes_runlist *)buffer;
|
|
|
|
|
|
memset(buffer, 0, sizeof(struct pm4_mes_runlist));
|
|
@@ -130,6 +155,7 @@ static int pm_create_runlist(struct packet_manager *pm, uint32_t *buffer,
|
|
|
packet->bitfields4.chain = chain ? 1 : 0;
|
|
|
packet->bitfields4.offload_polling = 0;
|
|
|
packet->bitfields4.valid = 1;
|
|
|
+ packet->bitfields4.process_cnt = concurrent_proc_cnt;
|
|
|
packet->ordinal2 = lower_32_bits(ib);
|
|
|
packet->bitfields3.ib_base_hi = upper_32_bits(ib);
|
|
|
|