[RAMEN9610-10029][COMMON] media: mfc: handle MFC QoS atomically
authorAyoung Sim <a.sim@samsung.com>
Tue, 20 Nov 2018 06:04:31 +0000 (15:04 +0900)
committerhskang <hs1218.kang@samsung.com>
Fri, 28 Dec 2018 09:54:22 +0000 (18:54 +0900)
MFC QoS should be controled atomically
because various thread can request qos_on.
Overlapped QoS calls(pm_qos_xxx_request())
cause of countless warning log messages.

Change-Id: Ifd74cf009fd263cd6732646ae92d4d46fb1d4ca0
Signed-off-by: Ayoung Sim <a.sim@samsung.com>
drivers/media/platform/exynos/mfc/mfc.c
drivers/media/platform/exynos/mfc/mfc_data_struct.h
drivers/media/platform/exynos/mfc/mfc_qos.c

index 1ee52a53be3d72d2188a7f8913f1e06c0a3c1d4f..e01124b3d0f7d3ec69e2385c6ea0863fa4ffd3c6 100644 (file)
@@ -1414,6 +1414,7 @@ static int mfc_probe(struct platform_device *pdev)
 
 #ifdef CONFIG_MFC_USE_BUS_DEVFREQ
        atomic_set(&dev->qos_req_cur, 0);
+       mutex_init(&dev->qos_mutex);
 
        mfc_info_dev("[QoS] control: mfc_freq(%d), mo(%d), bw(%d)\n",
                        dev->pdata->mfc_freq_control, dev->pdata->mo_control, dev->pdata->bw_control);
index 18141c210401d6e7b95ee47396dbd7185b655a2c..10abb6589b7392836b2d6ddf04c10ef6e326ce13 100644 (file)
@@ -810,6 +810,7 @@ struct mfc_dev {
        struct pm_qos_request qos_req_mif;
        struct pm_qos_request qos_req_cluster[MAX_NUM_CLUSTER];
        int qos_has_enc_ctx;
+       struct mutex qos_mutex;
 #endif
        int id;
        atomic_t clk_ref;
index f19ea64da43ae7fbad62d4d2abdd4f8e6c233a86..8b5460a531855cdfe60f89b39ce1b814004e7270 100644 (file)
@@ -239,10 +239,12 @@ static void __mfc_qos_set(struct mfc_ctx *ctx, int i)
        }
 #endif
 
+       mutex_lock(&dev->qos_mutex);
        if (atomic_read(&dev->qos_req_cur) == 0)
                __mfc_qos_operate(ctx, MFC_QOS_ADD, i);
        else if (atomic_read(&dev->qos_req_cur) != (i + 1))
                __mfc_qos_operate(ctx, MFC_QOS_UPDATE, i);
+       mutex_unlock(&dev->qos_mutex);
 }
 
 static inline unsigned long __mfc_qos_get_weighted_mb(struct mfc_ctx *ctx,
@@ -596,10 +598,12 @@ void mfc_qos_off(struct mfc_ctx *ctx)
        }
 
        if (list_empty(&dev->qos_queue)) {
+               mutex_lock(&dev->qos_mutex);
                if (atomic_read(&dev->qos_req_cur) != 0) {
                        mfc_err_ctx("[QoS] MFC request count is wrong!\n");
                        __mfc_qos_operate(ctx, MFC_QOS_REMOVE, 0);
                }
+               mutex_unlock(&dev->qos_mutex);
                return;
        }
 
@@ -655,14 +659,17 @@ void mfc_qos_off(struct mfc_ctx *ctx)
        if (found)
                list_del(&ctx->qos_list);
 
-       if (list_empty(&dev->qos_queue) || total_mb == 0)
+       if (list_empty(&dev->qos_queue) || total_mb == 0) {
+               mutex_lock(&dev->qos_mutex);
                __mfc_qos_operate(ctx, MFC_QOS_REMOVE, 0);
-       else
+               mutex_unlock(&dev->qos_mutex);
+       } else {
 #ifdef CONFIG_EXYNOS_BTS
                __mfc_qos_set(ctx, &mfc_bw, i);
 #else
                __mfc_qos_set(ctx, i);
 #endif
+       }
 }
 #endif