Skip to content

Commit 5442036

Browse files
authored
Fix portable pybindings COW ABI dependency (#21019)
Summary: Avoid at::Tensor::data_ptr() in portable pybindings input conversion by using storage-level no-COW pointer access with the tensor storage offset. This prevents _portable_lib from depending on removed or renamed COW ABI symbols in newer Torch builds. Test Plan: cmake --build pip-out/temp.linux-x86_64-cpython-311/cmake-out --target portable_lib --config=Release -j8 nm -D pip-out/temp.linux-x86_64-cpython-311/cmake-out/_portable_lib.cpython-311-x86_64-linux-gnu.so | c++filt | rg "c10::impl::cow|materialize_cow|is_cow_data_ptr" -n || true Direct-loaded rebuilt _portable_lib in Python and verified ExecuTorchModule is present.
1 parent 667c91b commit 5442036

1 file changed

Lines changed: 24 additions & 6 deletions

File tree

extension/pybindings/pybindings.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,22 @@ namespace pybindings {
112112

113113
namespace {
114114

115+
void* mutable_tensor_data_ptr_no_cow(at::Tensor& tensor) {
116+
if (tensor.numel() == 0) {
117+
return nullptr;
118+
}
119+
120+
auto* storage_data = static_cast<char*>(tensor.unsafeGetTensorImpl()
121+
->unsafe_storage()
122+
.unsafeGetStorageImpl()
123+
->_mutable_data_ptr_no_checks()
124+
.mutable_get());
125+
ET_CHECK_MSG(
126+
storage_data != nullptr,
127+
"Tensor has a non-zero number of elements, but its data is not allocated");
128+
return storage_data + tensor.storage_offset() * tensor.itemsize();
129+
}
130+
115131
void write_data_to_file(const std::string& path, void* buf, size_t size) {
116132
FILE* f = fopen(path.c_str(), "w+");
117133
if (!f) {
@@ -1117,12 +1133,14 @@ struct PyMethod final {
11171133
" should be contiguous or channels-last.";
11181134
throw std::runtime_error(error_msg);
11191135
}
1120-
TensorPtr tensor =
1121-
for_blob(at_tensor.data_ptr(), std::move(sizes), type)
1122-
.strides(std::move(strides))
1123-
.dim_order(std::move(dim_order))
1124-
.dynamism(aten::TensorShapeDynamism::STATIC)
1125-
.make_tensor_ptr();
1136+
TensorPtr tensor = for_blob(
1137+
mutable_tensor_data_ptr_no_cow(at_tensor),
1138+
std::move(sizes),
1139+
type)
1140+
.strides(std::move(strides))
1141+
.dim_order(std::move(dim_order))
1142+
.dynamism(aten::TensorShapeDynamism::STATIC)
1143+
.make_tensor_ptr();
11261144
input_tensors.push_back(tensor);
11271145
EValue evalue(input_tensors.back());
11281146
#endif

0 commit comments

Comments
 (0)