[Intel-gfx] [bug report] drm/i915/migrate: Evict and restore the flatccs capable lmem obj
Dan Carpenter
dan.carpenter at oracle.com
Thu May 5 10:31:30 UTC 2022
Hello Ramalingam C,
The patch da0595ae91da: "drm/i915/migrate: Evict and restore the
flatccs capable lmem obj" from Apr 5, 2022, leads to the following
Smatch static checker warning:
drivers/gpu/drm/i915/gt/intel_migrate.c:832 intel_context_migrate_copy() error: uninitialized symbol 'ccs_cache_level'.
drivers/gpu/drm/i915/gt/intel_migrate.c:833 intel_context_migrate_copy() error: uninitialized symbol 'ccs_is_src'.
drivers/gpu/drm/i915/gt/intel_migrate.c
695 int
696 intel_context_migrate_copy(struct intel_context *ce,
697 const struct i915_deps *deps,
698 struct scatterlist *src,
699 enum i915_cache_level src_cache_level,
700 bool src_is_lmem,
701 struct scatterlist *dst,
702 enum i915_cache_level dst_cache_level,
703 bool dst_is_lmem,
704 struct i915_request **out)
705 {
706 struct sgt_dma it_src = sg_sgt(src), it_dst = sg_sgt(dst), it_ccs;
707 struct drm_i915_private *i915 = ce->engine->i915;
708 u32 ccs_bytes_to_cpy = 0, bytes_to_cpy;
709 enum i915_cache_level ccs_cache_level;
710 int src_sz, dst_sz, ccs_sz;
711 u32 src_offset, dst_offset;
712 u8 src_access, dst_access;
713 struct i915_request *rq;
714 bool ccs_is_src;
715 int err;
716
717 GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
718 GEM_BUG_ON(IS_DGFX(ce->engine->i915) && (!src_is_lmem && !dst_is_lmem));
719 *out = NULL;
720
721 GEM_BUG_ON(ce->ring->size < SZ_64K);
722
723 src_sz = scatter_list_length(src);
724 bytes_to_cpy = src_sz;
725
726 if (HAS_FLAT_CCS(i915) && src_is_lmem ^ dst_is_lmem) {
727 src_access = !src_is_lmem && dst_is_lmem;
728 dst_access = !src_access;
729
730 dst_sz = scatter_list_length(dst);
731 if (src_is_lmem) {
732 it_ccs = it_dst;
733 ccs_cache_level = dst_cache_level;
734 ccs_is_src = false;
735 } else if (dst_is_lmem) {
736 bytes_to_cpy = dst_sz;
737 it_ccs = it_src;
738 ccs_cache_level = src_cache_level;
^^^^^^^^^^^^^^^
739 ccs_is_src = true;
740 }
There is no else statement. Presumably either src_is_lmem or dst_is_lmem
is always going to be true but apparently Smatch can't figure that out.
741
742 /*
743 * When there is a eviction of ccs needed smem will have the
744 * extra pages for the ccs data
745 *
746 * TO-DO: Want to move the size mismatch check to a WARN_ON,
747 * but still we have some requests of smem->lmem with same size.
748 * Need to fix it.
749 */
750 ccs_bytes_to_cpy = src_sz != dst_sz ? GET_CCS_BYTES(i915, bytes_to_cpy) : 0;
751 if (ccs_bytes_to_cpy)
752 get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
753 }
754
755 src_offset = 0;
756 dst_offset = CHUNK_SZ;
757 if (HAS_64K_PAGES(ce->engine->i915)) {
758 src_offset = 0;
759 dst_offset = 0;
760 if (src_is_lmem)
761 src_offset = CHUNK_SZ;
762 if (dst_is_lmem)
763 dst_offset = 2 * CHUNK_SZ;
764 }
765
766 do {
767 int len;
768
769 rq = i915_request_create(ce);
770 if (IS_ERR(rq)) {
771 err = PTR_ERR(rq);
772 goto out_ce;
773 }
774
775 if (deps) {
776 err = i915_request_await_deps(rq, deps);
777 if (err)
778 goto out_rq;
779
780 if (rq->engine->emit_init_breadcrumb) {
781 err = rq->engine->emit_init_breadcrumb(rq);
782 if (err)
783 goto out_rq;
784 }
785
786 deps = NULL;
787 }
788
789 /* The PTE updates + copy must not be interrupted. */
790 err = emit_no_arbitration(rq);
791 if (err)
792 goto out_rq;
793
794 calculate_chunk_sz(i915, src_is_lmem, &src_sz, &ccs_sz,
795 bytes_to_cpy, ccs_bytes_to_cpy);
796
797 len = emit_pte(rq, &it_src, src_cache_level, src_is_lmem,
798 src_offset, src_sz);
799 if (!len) {
800 err = -EINVAL;
801 goto out_rq;
802 }
803 if (len < 0) {
804 err = len;
805 goto out_rq;
806 }
807
808 err = emit_pte(rq, &it_dst, dst_cache_level, dst_is_lmem,
809 dst_offset, len);
810 if (err < 0)
811 goto out_rq;
812 if (err < len) {
813 err = -EINVAL;
814 goto out_rq;
815 }
816
817 err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
818 if (err)
819 goto out_rq;
820
821 err = emit_copy(rq, dst_offset, src_offset, len);
822 if (err)
823 goto out_rq;
824
825 bytes_to_cpy -= len;
826
827 if (ccs_bytes_to_cpy) {
828 err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
829 if (err)
830 goto out_rq;
831
--> 832 err = emit_pte(rq, &it_ccs, ccs_cache_level, false,
^^^^^^^^^^^^^^^
833 ccs_is_src ? src_offset : dst_offset,
834 ccs_sz);
835
836 err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
837 if (err)
838 goto out_rq;
839
840 /*
841 * Using max of src_sz and dst_sz, as we need to
842 * pass the lmem size corresponding to the ccs
843 * blocks we need to handle.
844 */
845 ccs_sz = max_t(int, ccs_is_src ? ccs_sz : src_sz,
846 ccs_is_src ? dst_sz : ccs_sz);
847
848 err = emit_copy_ccs(rq, dst_offset, dst_access,
849 src_offset, src_access, ccs_sz);
850 if (err)
851 goto out_rq;
852
853 err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
854 if (err)
855 goto out_rq;
856
857 /* Converting back to ccs bytes */
858 ccs_sz = GET_CCS_BYTES(rq->engine->i915, ccs_sz);
859 ccs_bytes_to_cpy -= ccs_sz;
860 }
861
862 /* Arbitration is re-enabled between requests. */
863 out_rq:
864 if (*out)
865 i915_request_put(*out);
866 *out = i915_request_get(rq);
867 i915_request_add(rq);
868
869 if (err)
870 break;
871
872 if (!bytes_to_cpy && !ccs_bytes_to_cpy) {
873 if (src_is_lmem)
874 WARN_ON(it_src.sg && sg_dma_len(it_src.sg));
875 else
876 WARN_ON(it_dst.sg && sg_dma_len(it_dst.sg));
877 break;
878 }
879
880 if (WARN_ON(!it_src.sg || !sg_dma_len(it_src.sg) ||
881 !it_dst.sg || !sg_dma_len(it_dst.sg) ||
882 (ccs_bytes_to_cpy && (!it_ccs.sg ||
883 !sg_dma_len(it_ccs.sg))))) {
884 err = -EINVAL;
885 break;
886 }
887
888 cond_resched();
889 } while (1);
890
891 out_ce:
892 return err;
893 }
regards,
dan carpenter
More information about the Intel-gfx
mailing list