* Special rules to skip reporting.
  */
 static bool
-skip_report(int access_type, bool value_change, unsigned long top_frame)
+skip_report(bool value_change, unsigned long top_frame)
 {
-       const bool is_write = (access_type & KCSAN_ACCESS_WRITE) != 0;
-
-       if (IS_ENABLED(CONFIG_KCSAN_REPORT_VALUE_CHANGE_ONLY) && is_write &&
-           !value_change) {
+       /*
+        * The first call to skip_report always has value_change==true, since we
+        * cannot know the value written of an instrumented access. For the 2nd
+        * call there are 6 cases with CONFIG_KCSAN_REPORT_VALUE_CHANGE_ONLY:
+        *
+        * 1. read watchpoint, conflicting write (value_change==true): report;
+        * 2. read watchpoint, conflicting write (value_change==false): skip;
+        * 3. write watchpoint, conflicting write (value_change==true): report;
+        * 4. write watchpoint, conflicting write (value_change==false): skip;
+        * 5. write watchpoint, conflicting read (value_change==false): skip;
+        * 6. write watchpoint, conflicting read (value_change==true): impossible;
+        *
+        * Cases 1-4 are intuitive and expected; case 5 ensures we do not report
+        * data races where the write may have rewritten the same value; and
+        * case 6 is simply impossible.
+        */
+       if (IS_ENABLED(CONFIG_KCSAN_REPORT_VALUE_CHANGE_ONLY) && !value_change) {
                /*
                 * The access is a write, but the data value did not change.
                 *
        /*
         * Must check report filter rules before starting to print.
         */
-       if (skip_report(access_type, true, stack_entries[skipnr]))
+       if (skip_report(true, stack_entries[skipnr]))
                return false;
 
        if (type == KCSAN_REPORT_RACE_SIGNAL) {
                other_frame = other_info.stack_entries[other_skipnr];
 
                /* @value_change is only known for the other thread */
-               if (skip_report(other_info.access_type, value_change, other_frame))
+               if (skip_report(value_change, other_frame))
                        return false;
        }