From: Yury Norov <yury.norov@gmail.com> To: linux-kernel@vger.kernel.org, Will Deacon <will@kernel.org>, Mark Rutland <mark.rutland@arm.com>, linux-arm-kernel@lists.infradead.org Cc: Yury Norov <yury.norov@gmail.com>, Jan Kara <jack@suse.cz>, Mirsad Todorovac <mirsad.todorovac@alu.unizg.hr>, Matthew Wilcox <willy@infradead.org>, Rasmus Villemoes <linux@rasmusvillemoes.dk>, Andy Shevchenko <andriy.shevchenko@linux.intel.com>, Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org>, Alexey Klimov <klimov.linux@gmail.com>, Bart Van Assche <bvanassche@acm.org>, Sergey Shtylyov <s.shtylyov@omp.ru> Subject: [PATCH v2 08/35] perf/arm: optimize opencoded atomic find_bit() API Date: Sun, 3 Dec 2023 11:32:40 -0800 [thread overview] Message-ID: <20231203193307.542794-7-yury.norov@gmail.com> (raw) In-Reply-To: <20231203193307.542794-1-yury.norov@gmail.com> Switch subsystem to use atomic find_bit() or atomic iterators as appropriate. CC: Will Deacon <will@kernel.org> Signed-off-by: Yury Norov <yury.norov@gmail.com> --- drivers/perf/arm-cci.c | 24 ++++++------------------ drivers/perf/arm-ccn.c | 10 ++-------- drivers/perf/arm_dmc620_pmu.c | 9 ++------- drivers/perf/arm_pmuv3.c | 8 ++------ 4 files changed, 12 insertions(+), 39 deletions(-) diff --git a/drivers/perf/arm-cci.c b/drivers/perf/arm-cci.c index 61de861eaf91..cb15b4cee5f7 100644 --- a/drivers/perf/arm-cci.c +++ b/drivers/perf/arm-cci.c @@ -320,12 +320,9 @@ static int cci400_get_event_idx(struct cci_pmu *cci_pmu, return CCI400_PMU_CYCLE_CNTR_IDX; } - for (idx = CCI400_PMU_CNTR0_IDX; idx <= CCI_PMU_CNTR_LAST(cci_pmu); ++idx) - if (!test_and_set_bit(idx, hw->used_mask)) - return idx; - - /* No counters available */ - return -EAGAIN; + idx = find_and_set_next_bit(hw->used_mask, CCI_PMU_CNTR_LAST(cci_pmu) + 1, + CCI400_PMU_CNTR0_IDX); + return idx < CCI_PMU_CNTR_LAST(cci_pmu) + 1 ? idx : -EAGAIN; } static int cci400_validate_hw_event(struct cci_pmu *cci_pmu, unsigned long hw_event) @@ -802,13 +799,8 @@ static int pmu_get_event_idx(struct cci_pmu_hw_events *hw, struct perf_event *ev if (cci_pmu->model->get_event_idx) return cci_pmu->model->get_event_idx(cci_pmu, hw, cci_event); - /* Generic code to find an unused idx from the mask */ - for (idx = 0; idx <= CCI_PMU_CNTR_LAST(cci_pmu); idx++) - if (!test_and_set_bit(idx, hw->used_mask)) - return idx; - - /* No counters available */ - return -EAGAIN; + idx = find_and_set_bit(hw->used_mask, CCI_PMU_CNTR_LAST(cci_pmu) + 1); + return idx < CCI_PMU_CNTR_LAST(cci_pmu) + 1 ? idx : -EAGAIN; } static int pmu_map_event(struct perf_event *event) @@ -861,12 +853,8 @@ static void pmu_free_irq(struct cci_pmu *cci_pmu) { int i; - for (i = 0; i < cci_pmu->nr_irqs; i++) { - if (!test_and_clear_bit(i, &cci_pmu->active_irqs)) - continue; - + for_each_test_and_clear_bit(i, &cci_pmu->active_irqs, cci_pmu->nr_irqs) free_irq(cci_pmu->irqs[i], cci_pmu); - } } static u32 pmu_read_counter(struct perf_event *event) diff --git a/drivers/perf/arm-ccn.c b/drivers/perf/arm-ccn.c index 728d13d8e98a..d657701b1f23 100644 --- a/drivers/perf/arm-ccn.c +++ b/drivers/perf/arm-ccn.c @@ -589,15 +589,9 @@ static const struct attribute_group *arm_ccn_pmu_attr_groups[] = { static int arm_ccn_pmu_alloc_bit(unsigned long *bitmap, unsigned long size) { - int bit; - - do { - bit = find_first_zero_bit(bitmap, size); - if (bit >= size) - return -EAGAIN; - } while (test_and_set_bit(bit, bitmap)); + int bit = find_and_set_bit(bitmap, size); - return bit; + return bit < size ? bit : -EAGAIN; } /* All RN-I and RN-D nodes have identical PMUs */ diff --git a/drivers/perf/arm_dmc620_pmu.c b/drivers/perf/arm_dmc620_pmu.c index 30cea6859574..e41c84dabc3e 100644 --- a/drivers/perf/arm_dmc620_pmu.c +++ b/drivers/perf/arm_dmc620_pmu.c @@ -303,13 +303,8 @@ static int dmc620_get_event_idx(struct perf_event *event) end_idx = DMC620_PMU_MAX_COUNTERS; } - for (idx = start_idx; idx < end_idx; ++idx) { - if (!test_and_set_bit(idx, dmc620_pmu->used_mask)) - return idx; - } - - /* The counters are all in use. */ - return -EAGAIN; + idx = find_and_set_next_bit(dmc620_pmu->used_mask, end_idx, start_idx); + return idx < end_idx ? idx : -EAGAIN; } static inline diff --git a/drivers/perf/arm_pmuv3.c b/drivers/perf/arm_pmuv3.c index 6ca7be05229c..f046ad9e71f1 100644 --- a/drivers/perf/arm_pmuv3.c +++ b/drivers/perf/arm_pmuv3.c @@ -825,13 +825,9 @@ static irqreturn_t armv8pmu_handle_irq(struct arm_pmu *cpu_pmu) static int armv8pmu_get_single_idx(struct pmu_hw_events *cpuc, struct arm_pmu *cpu_pmu) { - int idx; + int idx = find_and_set_next_bit(cpuc->used_mask, cpu_pmu->num_events, ARMV8_IDX_COUNTER0); - for (idx = ARMV8_IDX_COUNTER0; idx < cpu_pmu->num_events; idx++) { - if (!test_and_set_bit(idx, cpuc->used_mask)) - return idx; - } - return -EAGAIN; + return idx < cpu_pmu->num_events ? idx : -EAGAIN; } static int armv8pmu_get_chain_idx(struct pmu_hw_events *cpuc, -- 2.40.1
WARNING: multiple messages have this Message-ID (diff)
From: Yury Norov <yury.norov@gmail.com> To: linux-kernel@vger.kernel.org, Will Deacon <will@kernel.org>, Mark Rutland <mark.rutland@arm.com>, linux-arm-kernel@lists.infradead.org Cc: Yury Norov <yury.norov@gmail.com>, Jan Kara <jack@suse.cz>, Mirsad Todorovac <mirsad.todorovac@alu.unizg.hr>, Matthew Wilcox <willy@infradead.org>, Rasmus Villemoes <linux@rasmusvillemoes.dk>, Andy Shevchenko <andriy.shevchenko@linux.intel.com>, Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org>, Alexey Klimov <klimov.linux@gmail.com>, Bart Van Assche <bvanassche@acm.org>, Sergey Shtylyov <s.shtylyov@omp.ru> Subject: [PATCH v2 08/35] perf/arm: optimize opencoded atomic find_bit() API Date: Sun, 3 Dec 2023 11:32:40 -0800 [thread overview] Message-ID: <20231203193307.542794-7-yury.norov@gmail.com> (raw) In-Reply-To: <20231203193307.542794-1-yury.norov@gmail.com> Switch subsystem to use atomic find_bit() or atomic iterators as appropriate. CC: Will Deacon <will@kernel.org> Signed-off-by: Yury Norov <yury.norov@gmail.com> --- drivers/perf/arm-cci.c | 24 ++++++------------------ drivers/perf/arm-ccn.c | 10 ++-------- drivers/perf/arm_dmc620_pmu.c | 9 ++------- drivers/perf/arm_pmuv3.c | 8 ++------ 4 files changed, 12 insertions(+), 39 deletions(-) diff --git a/drivers/perf/arm-cci.c b/drivers/perf/arm-cci.c index 61de861eaf91..cb15b4cee5f7 100644 --- a/drivers/perf/arm-cci.c +++ b/drivers/perf/arm-cci.c @@ -320,12 +320,9 @@ static int cci400_get_event_idx(struct cci_pmu *cci_pmu, return CCI400_PMU_CYCLE_CNTR_IDX; } - for (idx = CCI400_PMU_CNTR0_IDX; idx <= CCI_PMU_CNTR_LAST(cci_pmu); ++idx) - if (!test_and_set_bit(idx, hw->used_mask)) - return idx; - - /* No counters available */ - return -EAGAIN; + idx = find_and_set_next_bit(hw->used_mask, CCI_PMU_CNTR_LAST(cci_pmu) + 1, + CCI400_PMU_CNTR0_IDX); + return idx < CCI_PMU_CNTR_LAST(cci_pmu) + 1 ? idx : -EAGAIN; } static int cci400_validate_hw_event(struct cci_pmu *cci_pmu, unsigned long hw_event) @@ -802,13 +799,8 @@ static int pmu_get_event_idx(struct cci_pmu_hw_events *hw, struct perf_event *ev if (cci_pmu->model->get_event_idx) return cci_pmu->model->get_event_idx(cci_pmu, hw, cci_event); - /* Generic code to find an unused idx from the mask */ - for (idx = 0; idx <= CCI_PMU_CNTR_LAST(cci_pmu); idx++) - if (!test_and_set_bit(idx, hw->used_mask)) - return idx; - - /* No counters available */ - return -EAGAIN; + idx = find_and_set_bit(hw->used_mask, CCI_PMU_CNTR_LAST(cci_pmu) + 1); + return idx < CCI_PMU_CNTR_LAST(cci_pmu) + 1 ? idx : -EAGAIN; } static int pmu_map_event(struct perf_event *event) @@ -861,12 +853,8 @@ static void pmu_free_irq(struct cci_pmu *cci_pmu) { int i; - for (i = 0; i < cci_pmu->nr_irqs; i++) { - if (!test_and_clear_bit(i, &cci_pmu->active_irqs)) - continue; - + for_each_test_and_clear_bit(i, &cci_pmu->active_irqs, cci_pmu->nr_irqs) free_irq(cci_pmu->irqs[i], cci_pmu); - } } static u32 pmu_read_counter(struct perf_event *event) diff --git a/drivers/perf/arm-ccn.c b/drivers/perf/arm-ccn.c index 728d13d8e98a..d657701b1f23 100644 --- a/drivers/perf/arm-ccn.c +++ b/drivers/perf/arm-ccn.c @@ -589,15 +589,9 @@ static const struct attribute_group *arm_ccn_pmu_attr_groups[] = { static int arm_ccn_pmu_alloc_bit(unsigned long *bitmap, unsigned long size) { - int bit; - - do { - bit = find_first_zero_bit(bitmap, size); - if (bit >= size) - return -EAGAIN; - } while (test_and_set_bit(bit, bitmap)); + int bit = find_and_set_bit(bitmap, size); - return bit; + return bit < size ? bit : -EAGAIN; } /* All RN-I and RN-D nodes have identical PMUs */ diff --git a/drivers/perf/arm_dmc620_pmu.c b/drivers/perf/arm_dmc620_pmu.c index 30cea6859574..e41c84dabc3e 100644 --- a/drivers/perf/arm_dmc620_pmu.c +++ b/drivers/perf/arm_dmc620_pmu.c @@ -303,13 +303,8 @@ static int dmc620_get_event_idx(struct perf_event *event) end_idx = DMC620_PMU_MAX_COUNTERS; } - for (idx = start_idx; idx < end_idx; ++idx) { - if (!test_and_set_bit(idx, dmc620_pmu->used_mask)) - return idx; - } - - /* The counters are all in use. */ - return -EAGAIN; + idx = find_and_set_next_bit(dmc620_pmu->used_mask, end_idx, start_idx); + return idx < end_idx ? idx : -EAGAIN; } static inline diff --git a/drivers/perf/arm_pmuv3.c b/drivers/perf/arm_pmuv3.c index 6ca7be05229c..f046ad9e71f1 100644 --- a/drivers/perf/arm_pmuv3.c +++ b/drivers/perf/arm_pmuv3.c @@ -825,13 +825,9 @@ static irqreturn_t armv8pmu_handle_irq(struct arm_pmu *cpu_pmu) static int armv8pmu_get_single_idx(struct pmu_hw_events *cpuc, struct arm_pmu *cpu_pmu) { - int idx; + int idx = find_and_set_next_bit(cpuc->used_mask, cpu_pmu->num_events, ARMV8_IDX_COUNTER0); - for (idx = ARMV8_IDX_COUNTER0; idx < cpu_pmu->num_events; idx++) { - if (!test_and_set_bit(idx, cpuc->used_mask)) - return idx; - } - return -EAGAIN; + return idx < cpu_pmu->num_events ? idx : -EAGAIN; } static int armv8pmu_get_chain_idx(struct pmu_hw_events *cpuc, -- 2.40.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-12-03 19:33 UTC|newest] Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-12-03 19:23 [PATCH v2 00/35] bitops: add atomic find_bit() operations Yury Norov 2023-12-03 19:23 ` Yury Norov 2023-12-03 19:23 ` [PATCH v2 01/35] lib/find: add atomic find_bit() primitives Yury Norov 2023-12-03 19:23 ` Yury Norov 2023-12-03 19:56 ` bitops: add atomic find_bit() operations bluez.test.bot 2023-12-03 19:32 ` [PATCH v2 02/35] lib/find: add test for atomic find_bit() ops Yury Norov 2023-12-03 19:32 ` Yury Norov 2023-12-03 19:32 ` [PATCH v2 03/35] lib/sbitmap; make __sbitmap_get_word() using find_and_set_bit() Yury Norov 2023-12-04 18:22 ` Jan Kara 2023-12-04 18:40 ` Jens Axboe 2023-12-03 19:32 ` [PATCH v2 04/35] watch_queue: use atomic find_bit() in post_one_notification() Yury Norov 2023-12-03 19:32 ` [PATCH v2 05/35] sched: add cpumask_find_and_set() and use it in __mm_cid_get() Yury Norov 2023-12-03 19:32 ` [PATCH v2 06/35] mips: sgi-ip30: rework heart_alloc_int() Yury Norov 2023-12-03 19:32 ` [PATCH v2 07/35] sparc: fix opencoded find_and_set_bit() in alloc_msi() Yury Norov 2023-12-03 19:32 ` Yury Norov [this message] 2023-12-03 19:32 ` [PATCH v2 08/35] perf/arm: optimize opencoded atomic find_bit() API Yury Norov 2023-12-03 19:32 ` [PATCH v2 09/35] drivers/perf: optimize ali_drw_get_counter_idx() by using find_bit() Yury Norov 2023-12-03 19:32 ` Yury Norov 2023-12-03 19:32 ` [PATCH v2 10/35] dmaengine: idxd: optimize perfmon_assign_event() Yury Norov 2023-12-03 19:32 ` [PATCH v2 11/35] ath10k: optimize ath10k_snoc_napi_poll() by using find_bit() Yury Norov 2023-12-03 19:32 ` [PATCH v2 12/35] wifi: rtw88: optimize rtw_pci_tx_kick_off() " Yury Norov 2023-12-03 19:32 ` [PATCH v2 13/35] KVM: x86: hyper-v: optimize and cleanup kvm_hv_process_stimers() Yury Norov 2023-12-04 9:53 ` Vitaly Kuznetsov 2023-12-04 16:00 ` Sean Christopherson 2023-12-03 19:32 ` [PATCH v2 14/35] PCI: hv: switch hv_get_dom_num() to use atomic find_bit() Yury Norov 2023-12-04 5:58 ` Wei Liu 2023-12-04 19:14 ` Bjorn Helgaas 2023-12-08 18:34 ` Yury Norov 2023-12-03 19:32 ` [PATCH v2 15/35] scsi: core: use atomic find_bit() API where appropriate Yury Norov 2023-12-03 19:32 ` [PATCH v2 16/35] scsi: mpi3mr: switch to using atomic find_and_set_bit() Yury Norov 2023-12-03 19:32 ` [PATCH v2 17/35] scsi: qedi: rework qedi_get_task_idx() Yury Norov 2023-12-03 19:32 ` [PATCH v2 18/35] powerpc: use atomic find_bit() API where appropriate Yury Norov 2023-12-03 19:32 ` Yury Norov 2023-12-03 19:32 ` [PATCH v2 19/35] iommu: " Yury Norov 2023-12-03 19:32 ` Yury Norov 2023-12-03 19:32 ` [PATCH v2 20/35] media: radio-shark: " Yury Norov 2023-12-04 8:43 ` Hans Verkuil 2023-12-03 19:32 ` [PATCH v2 21/35] sfc: switch to using " Yury Norov 2023-12-03 19:32 ` [PATCH v2 22/35] tty: nozomi: optimize interrupt_handler() Yury Norov 2023-12-03 19:32 ` [PATCH v2 23/35] usb: cdc-acm: optimize acm_softint() Yury Norov 2023-12-03 19:32 ` [PATCH v2 24/35] block: null_blk: fix opencoded find_and_set_bit() in get_tag() Yury Norov 2023-12-04 18:26 ` Jan Kara 2023-12-05 2:39 ` Chengming Zhou 2023-12-03 19:32 ` [PATCH v2 25/35] RDMA/rtrs: fix opencoded find_and_set_bit_lock() in __rtrs_get_permit() Yury Norov 2023-12-03 19:32 ` [PATCH v2 26/35] mISDN: optimize get_free_devid() Yury Norov 2023-12-03 19:32 ` [PATCH v2 27/35] media: em28xx: cx231xx: fix opencoded find_and_set_bit() Yury Norov 2023-12-04 8:39 ` Hans Verkuil 2023-12-04 13:05 ` Andy Shevchenko 2023-12-04 13:09 ` Hans Verkuil 2023-12-03 19:33 ` [PATCH v2 28/35] ethernet: rocker: optimize ofdpa_port_internal_vlan_id_get() Yury Norov 2023-12-03 19:33 ` [PATCH v2 29/35] serial: sc12is7xx: optimize sc16is7xx_alloc_line() Yury Norov 2023-12-03 19:33 ` [PATCH v2 30/35] bluetooth: optimize cmtp_alloc_block_id() Yury Norov 2023-12-03 19:33 ` [PATCH v2 31/35] net: smc: use find_and_set_bit() in smc_wr_tx_get_free_slot_index() Yury Norov 2023-12-04 9:40 ` Alexandra Winter 2023-12-11 22:34 ` Yury Norov 2023-12-03 19:33 ` [PATCH v2 32/35] ALSA: use atomic find_bit() functions where applicable Yury Norov 2023-12-03 19:33 ` [PATCH v2 33/35] m68k: rework get_mmu_context() Yury Norov 2023-12-03 19:33 ` [PATCH v2 34/35] microblaze: " Yury Norov 2023-12-03 19:33 ` [PATCH v2 35/35] sh: mach-x3proto: rework ilsel_enable() Yury Norov 2024-01-19 8:48 ` Geert Uytterhoeven 2023-12-04 13:07 ` [PATCH v2 00/35] bitops: add atomic find_bit() operations Andy Shevchenko 2023-12-04 13:07 ` Andy Shevchenko 2023-12-04 18:51 ` Jan Kara 2023-12-04 18:51 ` Jan Kara 2023-12-06 5:22 ` Yury Norov 2023-12-06 5:22 ` Yury Norov 2023-12-07 9:10 ` Jan Kara 2023-12-07 9:10 ` Jan Kara
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20231203193307.542794-7-yury.norov@gmail.com \ --to=yury.norov@gmail.com \ --cc=andriy.shevchenko@linux.intel.com \ --cc=bvanassche@acm.org \ --cc=jack@suse.cz \ --cc=klimov.linux@gmail.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@rasmusvillemoes.dk \ --cc=mark.rutland@arm.com \ --cc=maxim.kuvyrkov@linaro.org \ --cc=mirsad.todorovac@alu.unizg.hr \ --cc=s.shtylyov@omp.ru \ --cc=will@kernel.org \ --cc=willy@infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.