Lines Matching +full:current +full:- +full:limiter

1 // SPDX-License-Identifier: GPL-2.0-only
24 (((struct virtio_admin_cmd_dev_parts_metadata_result *)0)->parts_size.size)) - 1)
42 if (offset < buf->last_offset || !buf->last_offset_sg) { in virtiovf_get_migration_page()
43 buf->last_offset = 0; in virtiovf_get_migration_page()
44 buf->last_offset_sg = buf->table.sgt.sgl; in virtiovf_get_migration_page()
45 buf->sg_last_entry = 0; in virtiovf_get_migration_page()
48 cur_offset = buf->last_offset; in virtiovf_get_migration_page()
50 for_each_sg(buf->last_offset_sg, sg, in virtiovf_get_migration_page()
51 buf->table.sgt.orig_nents - buf->sg_last_entry, i) { in virtiovf_get_migration_page()
52 if (offset < sg->length + cur_offset) { in virtiovf_get_migration_page()
53 buf->last_offset_sg = sg; in virtiovf_get_migration_page()
54 buf->sg_last_entry += i; in virtiovf_get_migration_page()
55 buf->last_offset = cur_offset; in virtiovf_get_migration_page()
56 return sg_page(sg) + (offset - cur_offset) / PAGE_SIZE; in virtiovf_get_migration_page()
58 cur_offset += sg->length; in virtiovf_get_migration_page()
76 return -ENOMEM; in virtiovf_add_migration_pages()
82 ret = -ENOMEM; in virtiovf_add_migration_pages()
85 to_alloc -= filled; in virtiovf_add_migration_pages()
86 ret = sg_alloc_append_table_from_pages(&buf->table, page_list, in virtiovf_add_migration_pages()
92 buf->allocated_length += filled * PAGE_SIZE; in virtiovf_add_migration_pages()
103 for (i = filled - 1; i >= 0; i--) in virtiovf_add_migration_pages()
115 for_each_sgtable_page(&buf->table.sgt, &sg_iter, 0) in virtiovf_free_data_buffer()
117 sg_free_append_table(&buf->table); in virtiovf_free_data_buffer()
129 return ERR_PTR(-ENOMEM); in virtiovf_alloc_data_buffer()
136 buf->migf = migf; in virtiovf_alloc_data_buffer()
145 spin_lock_irq(&buf->migf->list_lock); in virtiovf_put_data_buffer()
146 list_add_tail(&buf->buf_elm, &buf->migf->avail_list); in virtiovf_put_data_buffer()
147 spin_unlock_irq(&buf->migf->list_lock); in virtiovf_put_data_buffer()
154 return virtio_pci_admin_obj_create(virtvdev->core_device.pdev, in virtiovf_pci_alloc_obj_id()
161 virtio_pci_admin_obj_destroy(virtvdev->core_device.pdev, in virtiovf_pci_free_obj_id()
173 spin_lock_irq(&migf->list_lock); in virtiovf_get_data_buffer()
174 list_for_each_entry_safe(buf, temp_buf, &migf->avail_list, buf_elm) { in virtiovf_get_data_buffer()
175 list_del_init(&buf->buf_elm); in virtiovf_get_data_buffer()
176 if (buf->allocated_length >= length) { in virtiovf_get_data_buffer()
177 spin_unlock_irq(&migf->list_lock); in virtiovf_get_data_buffer()
183 * (&migf->list_lock) to minimize its scope usage. in virtiovf_get_data_buffer()
185 list_add(&buf->buf_elm, &free_list); in virtiovf_get_data_buffer()
187 spin_unlock_irq(&migf->list_lock); in virtiovf_get_data_buffer()
193 list_del(&temp_buf->buf_elm); in virtiovf_get_data_buffer()
204 if (migf->buf) { in virtiovf_clean_migf_resources()
205 virtiovf_free_data_buffer(migf->buf); in virtiovf_clean_migf_resources()
206 migf->buf = NULL; in virtiovf_clean_migf_resources()
209 if (migf->buf_header) { in virtiovf_clean_migf_resources()
210 virtiovf_free_data_buffer(migf->buf_header); in virtiovf_clean_migf_resources()
211 migf->buf_header = NULL; in virtiovf_clean_migf_resources()
214 list_splice(&migf->avail_list, &migf->buf_list); in virtiovf_clean_migf_resources()
216 while ((entry = list_first_entry_or_null(&migf->buf_list, in virtiovf_clean_migf_resources()
218 list_del(&entry->buf_elm); in virtiovf_clean_migf_resources()
222 if (migf->has_obj_id) in virtiovf_clean_migf_resources()
223 virtiovf_pci_free_obj_id(migf->virtvdev, migf->obj_id); in virtiovf_clean_migf_resources()
228 mutex_lock(&migf->lock); in virtiovf_disable_fd()
229 migf->state = VIRTIOVF_MIGF_STATE_ERROR; in virtiovf_disable_fd()
230 migf->filp->f_pos = 0; in virtiovf_disable_fd()
231 mutex_unlock(&migf->lock); in virtiovf_disable_fd()
236 if (virtvdev->resuming_migf) { in virtiovf_disable_fds()
237 virtiovf_disable_fd(virtvdev->resuming_migf); in virtiovf_disable_fds()
238 virtiovf_clean_migf_resources(virtvdev->resuming_migf); in virtiovf_disable_fds()
239 fput(virtvdev->resuming_migf->filp); in virtiovf_disable_fds()
240 virtvdev->resuming_migf = NULL; in virtiovf_disable_fds()
242 if (virtvdev->saving_migf) { in virtiovf_disable_fds()
243 virtiovf_disable_fd(virtvdev->saving_migf); in virtiovf_disable_fds()
244 virtiovf_clean_migf_resources(virtvdev->saving_migf); in virtiovf_disable_fds()
245 fput(virtvdev->saving_migf->filp); in virtiovf_disable_fds()
246 virtvdev->saving_migf = NULL; in virtiovf_disable_fds()
257 spin_lock(&virtvdev->reset_lock); in virtiovf_state_mutex_unlock()
258 if (virtvdev->deferred_reset) { in virtiovf_state_mutex_unlock()
259 virtvdev->deferred_reset = false; in virtiovf_state_mutex_unlock()
260 spin_unlock(&virtvdev->reset_lock); in virtiovf_state_mutex_unlock()
261 virtvdev->mig_state = VFIO_DEVICE_STATE_RUNNING; in virtiovf_state_mutex_unlock()
265 mutex_unlock(&virtvdev->state_mutex); in virtiovf_state_mutex_unlock()
266 spin_unlock(&virtvdev->reset_lock); in virtiovf_state_mutex_unlock()
271 struct virtiovf_pci_core_device *virtvdev = dev_get_drvdata(&pdev->dev); in virtiovf_migration_reset_done()
273 if (!virtvdev->migrate_cap) in virtiovf_migration_reset_done()
283 spin_lock(&virtvdev->reset_lock); in virtiovf_migration_reset_done()
284 virtvdev->deferred_reset = true; in virtiovf_migration_reset_done()
285 if (!mutex_trylock(&virtvdev->state_mutex)) { in virtiovf_migration_reset_done()
286 spin_unlock(&virtvdev->reset_lock); in virtiovf_migration_reset_done()
289 spin_unlock(&virtvdev->reset_lock); in virtiovf_migration_reset_done()
295 struct virtiovf_migration_file *migf = filp->private_data; in virtiovf_release_file()
298 mutex_destroy(&migf->lock); in virtiovf_release_file()
311 spin_lock_irq(&migf->list_lock); in virtiovf_get_data_buff_from_pos()
312 if (list_empty(&migf->buf_list)) { in virtiovf_get_data_buff_from_pos()
317 buf = list_first_entry(&migf->buf_list, struct virtiovf_data_buffer, in virtiovf_get_data_buff_from_pos()
319 if (pos >= buf->start_pos && in virtiovf_get_data_buff_from_pos()
320 pos < buf->start_pos + buf->length) { in virtiovf_get_data_buff_from_pos()
329 migf->state = VIRTIOVF_MIGF_STATE_ERROR; in virtiovf_get_data_buff_from_pos()
332 spin_unlock_irq(&migf->list_lock); in virtiovf_get_data_buff_from_pos()
344 vhca_buf->start_pos + vhca_buf->length - *pos, *len); in virtiovf_buf_read()
352 offset = *pos - vhca_buf->start_pos; in virtiovf_buf_read()
354 offset -= page_offset; in virtiovf_buf_read()
357 return -EINVAL; in virtiovf_buf_read()
358 page_len = min_t(size_t, copy_len, PAGE_SIZE - page_offset); in virtiovf_buf_read()
363 return -EFAULT; in virtiovf_buf_read()
365 *len -= page_len; in virtiovf_buf_read()
368 copy_len -= page_len; in virtiovf_buf_read()
371 if (*pos >= vhca_buf->start_pos + vhca_buf->length) { in virtiovf_buf_read()
372 spin_lock_irq(&vhca_buf->migf->list_lock); in virtiovf_buf_read()
373 list_del_init(&vhca_buf->buf_elm); in virtiovf_buf_read()
374 list_add_tail(&vhca_buf->buf_elm, &vhca_buf->migf->avail_list); in virtiovf_buf_read()
375 spin_unlock_irq(&vhca_buf->migf->list_lock); in virtiovf_buf_read()
384 struct virtiovf_migration_file *migf = filp->private_data; in virtiovf_save_read()
391 return -ESPIPE; in virtiovf_save_read()
392 pos = &filp->f_pos; in virtiovf_save_read()
394 mutex_lock(&migf->lock); in virtiovf_save_read()
395 if (migf->state == VIRTIOVF_MIGF_STATE_ERROR) { in virtiovf_save_read()
396 done = -ENODEV; in virtiovf_save_read()
407 if (end_of_data && migf->state == VIRTIOVF_MIGF_STATE_PRECOPY) { in virtiovf_save_read()
408 done = -ENOMSG; in virtiovf_save_read()
411 if (end_of_data && migf->state != VIRTIOVF_MIGF_STATE_COMPLETE) { in virtiovf_save_read()
412 done = -EINVAL; in virtiovf_save_read()
421 done = -EINVAL; in virtiovf_save_read()
434 mutex_unlock(&migf->lock); in virtiovf_save_read()
441 struct virtiovf_migration_file *migf = filp->private_data; in virtiovf_precopy_ioctl()
442 struct virtiovf_pci_core_device *virtvdev = migf->virtvdev; in virtiovf_precopy_ioctl()
444 loff_t *pos = &filp->f_pos; in virtiovf_precopy_ioctl()
451 return -ENOTTY; in virtiovf_precopy_ioctl()
455 return -EFAULT; in virtiovf_precopy_ioctl()
458 return -EINVAL; in virtiovf_precopy_ioctl()
460 mutex_lock(&virtvdev->state_mutex); in virtiovf_precopy_ioctl()
461 if (virtvdev->mig_state != VFIO_DEVICE_STATE_PRE_COPY && in virtiovf_precopy_ioctl()
462 virtvdev->mig_state != VFIO_DEVICE_STATE_PRE_COPY_P2P) { in virtiovf_precopy_ioctl()
463 ret = -EINVAL; in virtiovf_precopy_ioctl()
470 * we use a rate limiter mechanism before making a call to the device. in virtiovf_precopy_ioctl()
472 if (__ratelimit(&migf->pre_copy_rl_state)) { in virtiovf_precopy_ioctl()
474 ret = virtio_pci_admin_dev_parts_metadata_get(virtvdev->core_device.pdev, in virtiovf_precopy_ioctl()
475 VIRTIO_RESOURCE_OBJ_DEV_PARTS, migf->obj_id, in virtiovf_precopy_ioctl()
482 mutex_lock(&migf->lock); in virtiovf_precopy_ioctl()
483 if (migf->state == VIRTIOVF_MIGF_STATE_ERROR) { in virtiovf_precopy_ioctl()
484 ret = -ENODEV; in virtiovf_precopy_ioctl()
488 if (migf->pre_copy_initial_bytes > *pos) { in virtiovf_precopy_ioctl()
489 info.initial_bytes = migf->pre_copy_initial_bytes - *pos; in virtiovf_precopy_ioctl()
491 info.dirty_bytes = migf->max_pos - *pos; in virtiovf_precopy_ioctl()
498 mutex_unlock(&migf->lock); in virtiovf_precopy_ioctl()
502 mutex_unlock(&migf->lock); in virtiovf_precopy_ioctl()
504 * We finished transferring the current state and the device has a in virtiovf_precopy_ioctl()
518 return -EFAULT; in virtiovf_precopy_ioctl()
522 mutex_unlock(&migf->lock); in virtiovf_precopy_ioctl()
540 struct virtiovf_migration_file *migf = header_buf->migf; in virtiovf_add_buf_header()
550 return -EINVAL; in virtiovf_add_buf_header()
554 header_buf->length = sizeof(header); in virtiovf_add_buf_header()
555 header_buf->start_pos = header_buf->migf->max_pos; in virtiovf_add_buf_header()
556 migf->max_pos += header_buf->length; in virtiovf_add_buf_header()
557 spin_lock_irq(&migf->list_lock); in virtiovf_add_buf_header()
558 list_add_tail(&header_buf->buf_elm, &migf->buf_list); in virtiovf_add_buf_header()
559 spin_unlock_irq(&migf->list_lock); in virtiovf_add_buf_header()
581 nent = sg_nents_for_len(buf->table.sgt.sgl, ctx_size); in virtiovf_read_device_context_chunk()
583 ret = -EINVAL; in virtiovf_read_device_context_chunk()
591 for_each_sg(buf->table.sgt.sgl, sg, nent - 1, i) in virtiovf_read_device_context_chunk()
599 ret = virtio_pci_admin_dev_parts_get(migf->virtvdev->core_device.pdev, in virtiovf_read_device_context_chunk()
601 migf->obj_id, in virtiovf_read_device_context_chunk()
603 buf->table.sgt.sgl, &res_size); in virtiovf_read_device_context_chunk()
610 buf->length = res_size; in virtiovf_read_device_context_chunk()
622 buf->start_pos = buf->migf->max_pos; in virtiovf_read_device_context_chunk()
623 migf->max_pos += buf->length; in virtiovf_read_device_context_chunk()
624 spin_lock(&migf->list_lock); in virtiovf_read_device_context_chunk()
625 list_add_tail(&buf->buf_elm, &migf->buf_list); in virtiovf_read_device_context_chunk()
626 spin_unlock_irq(&migf->list_lock); in virtiovf_read_device_context_chunk()
639 struct virtiovf_migration_file *migf = virtvdev->saving_migf; in virtiovf_pci_save_device_final_data()
643 if (migf->state == VIRTIOVF_MIGF_STATE_ERROR) in virtiovf_pci_save_device_final_data()
644 return -ENODEV; in virtiovf_pci_save_device_final_data()
646 ret = virtio_pci_admin_dev_parts_metadata_get(virtvdev->core_device.pdev, in virtiovf_pci_save_device_final_data()
647 VIRTIO_RESOURCE_OBJ_DEV_PARTS, migf->obj_id, in virtiovf_pci_save_device_final_data()
654 ret = -EINVAL; in virtiovf_pci_save_device_final_data()
662 migf->state = VIRTIOVF_MIGF_STATE_COMPLETE; in virtiovf_pci_save_device_final_data()
666 migf->state = VIRTIOVF_MIGF_STATE_ERROR; in virtiovf_pci_save_device_final_data()
681 return ERR_PTR(-ENOMEM); in virtiovf_pci_save_device_data()
683 migf->filp = anon_inode_getfile("virtiovf_mig", &virtiovf_save_fops, migf, in virtiovf_pci_save_device_data()
685 if (IS_ERR(migf->filp)) { in virtiovf_pci_save_device_data()
686 ret = PTR_ERR(migf->filp); in virtiovf_pci_save_device_data()
691 stream_open(migf->filp->f_inode, migf->filp); in virtiovf_pci_save_device_data()
692 mutex_init(&migf->lock); in virtiovf_pci_save_device_data()
693 INIT_LIST_HEAD(&migf->buf_list); in virtiovf_pci_save_device_data()
694 INIT_LIST_HEAD(&migf->avail_list); in virtiovf_pci_save_device_data()
695 spin_lock_init(&migf->list_lock); in virtiovf_pci_save_device_data()
696 migf->virtvdev = virtvdev; in virtiovf_pci_save_device_data()
698 lockdep_assert_held(&virtvdev->state_mutex); in virtiovf_pci_save_device_data()
704 migf->obj_id = obj_id; in virtiovf_pci_save_device_data()
706 migf->has_obj_id = true; in virtiovf_pci_save_device_data()
707 ret = virtio_pci_admin_dev_parts_metadata_get(virtvdev->core_device.pdev, in virtiovf_pci_save_device_data()
715 ret = -EINVAL; in virtiovf_pci_save_device_data()
724 migf->pre_copy_initial_bytes = migf->max_pos; in virtiovf_pci_save_device_data()
725 /* Arbitrarily set the pre-copy rate limit to 1-second intervals */ in virtiovf_pci_save_device_data()
726 ratelimit_state_init(&migf->pre_copy_rl_state, 1 * HZ, 1); in virtiovf_pci_save_device_data()
728 ratelimit_set_flags(&migf->pre_copy_rl_state, in virtiovf_pci_save_device_data()
730 migf->state = VIRTIOVF_MIGF_STATE_PRECOPY; in virtiovf_pci_save_device_data()
732 migf->state = VIRTIOVF_MIGF_STATE_COMPLETE; in virtiovf_pci_save_device_data()
740 fput(migf->filp); in virtiovf_pci_save_device_data()
755 obj_hdr.id = cpu_to_le32(vhca_buf->migf->obj_id); in virtiovf_set_obj_cmd_header()
758 return -EINVAL; in virtiovf_set_obj_cmd_header()
764 vhca_buf->include_header_object = 1; in virtiovf_set_obj_cmd_header()
780 offset = *pos - vhca_buf->start_pos; in virtiovf_append_page_to_mig_buf()
782 if (vhca_buf->include_header_object) in virtiovf_append_page_to_mig_buf()
788 page = virtiovf_get_migration_page(vhca_buf, offset - page_offset); in virtiovf_append_page_to_mig_buf()
790 return -EINVAL; in virtiovf_append_page_to_mig_buf()
792 page_len = min_t(size_t, *len, PAGE_SIZE - page_offset); in virtiovf_append_page_to_mig_buf()
797 return -EFAULT; in virtiovf_append_page_to_mig_buf()
802 *len -= page_len; in virtiovf_append_page_to_mig_buf()
803 vhca_buf->length += page_len; in virtiovf_append_page_to_mig_buf()
817 to_copy = min_t(size_t, *len, chunk_size - vhca_buf->length); in virtiovf_resume_read_chunk()
826 *len -= copy_len; in virtiovf_resume_read_chunk()
827 if (vhca_buf->length == chunk_size) { in virtiovf_resume_read_chunk()
828 migf->load_state = VIRTIOVF_LOAD_STATE_LOAD_CHUNK; in virtiovf_resume_read_chunk()
829 migf->max_pos += chunk_size; in virtiovf_resume_read_chunk()
846 required_data = migf->record_size - vhca_buf->length; in virtiovf_resume_read_header_data()
856 *len -= copy_len; in virtiovf_resume_read_header_data()
857 if (vhca_buf->length == migf->record_size) { in virtiovf_resume_read_header_data()
858 switch (migf->record_tag) { in virtiovf_resume_read_header_data()
864 migf->load_state = VIRTIOVF_LOAD_STATE_READ_HEADER; in virtiovf_resume_read_header_data()
865 migf->max_pos += migf->record_size; in virtiovf_resume_read_header_data()
866 vhca_buf->length = 0; in virtiovf_resume_read_header_data()
885 sizeof(struct virtiovf_migration_header) - vhca_buf->length); in virtiovf_resume_read_header()
888 return -EINVAL; in virtiovf_resume_read_header()
890 ret = copy_from_user(to_buff + vhca_buf->length, *buf, copy_len); in virtiovf_resume_read_header()
892 ret = -EFAULT; in virtiovf_resume_read_header()
899 *len -= copy_len; in virtiovf_resume_read_header()
900 vhca_buf->length += copy_len; in virtiovf_resume_read_header()
901 if (vhca_buf->length == sizeof(struct virtiovf_migration_header)) { in virtiovf_resume_read_header()
907 ret = -ENOMEM; in virtiovf_resume_read_header()
911 migf->record_size = record_size; in virtiovf_resume_read_header()
914 migf->record_tag = le32_to_cpup((__le32 *)(to_buff + in virtiovf_resume_read_header()
916 switch (migf->record_tag) { in virtiovf_resume_read_header()
918 migf->load_state = VIRTIOVF_LOAD_STATE_PREP_CHUNK; in virtiovf_resume_read_header()
922 ret = -EOPNOTSUPP; in virtiovf_resume_read_header()
926 migf->load_state = VIRTIOVF_LOAD_STATE_PREP_HEADER_DATA; in virtiovf_resume_read_header()
929 migf->max_pos += vhca_buf->length; in virtiovf_resume_read_header()
930 vhca_buf->length = 0; in virtiovf_resume_read_header()
941 struct virtiovf_migration_file *migf = filp->private_data; in virtiovf_resume_write()
942 struct virtiovf_data_buffer *vhca_buf = migf->buf; in virtiovf_resume_write()
943 struct virtiovf_data_buffer *vhca_buf_header = migf->buf_header; in virtiovf_resume_write()
950 return -ESPIPE; in virtiovf_resume_write()
952 pos = &filp->f_pos; in virtiovf_resume_write()
953 if (*pos < vhca_buf->start_pos) in virtiovf_resume_write()
954 return -EINVAL; in virtiovf_resume_write()
956 mutex_lock(&migf->virtvdev->state_mutex); in virtiovf_resume_write()
957 mutex_lock(&migf->lock); in virtiovf_resume_write()
958 if (migf->state == VIRTIOVF_MIGF_STATE_ERROR) { in virtiovf_resume_write()
959 done = -ENODEV; in virtiovf_resume_write()
965 switch (migf->load_state) { in virtiovf_resume_write()
973 if (vhca_buf_header->allocated_length < migf->record_size) { in virtiovf_resume_write()
976 migf->buf_header = virtiovf_alloc_data_buffer(migf, in virtiovf_resume_write()
977 migf->record_size); in virtiovf_resume_write()
978 if (IS_ERR(migf->buf_header)) { in virtiovf_resume_write()
979 ret = PTR_ERR(migf->buf_header); in virtiovf_resume_write()
980 migf->buf_header = NULL; in virtiovf_resume_write()
984 vhca_buf_header = migf->buf_header; in virtiovf_resume_write()
987 vhca_buf_header->start_pos = migf->max_pos; in virtiovf_resume_write()
988 migf->load_state = VIRTIOVF_LOAD_STATE_READ_HEADER_DATA; in virtiovf_resume_write()
998 u32 cmd_size = migf->record_size + in virtiovf_resume_write()
1005 if (vhca_buf->allocated_length < cmd_size) { in virtiovf_resume_write()
1007 DIV_ROUND_UP_ULL(cmd_size - vhca_buf->allocated_length, in virtiovf_resume_write()
1013 vhca_buf->start_pos = migf->max_pos; in virtiovf_resume_write()
1014 migf->load_state = VIRTIOVF_LOAD_STATE_READ_CHUNK; in virtiovf_resume_write()
1018 ret = virtiovf_resume_read_chunk(migf, vhca_buf, migf->record_size, in virtiovf_resume_write()
1025 sg_mark_end(vhca_buf->last_offset_sg); in virtiovf_resume_write()
1026 orig_length = vhca_buf->last_offset_sg->length; in virtiovf_resume_write()
1028 vhca_buf->last_offset_sg->length = vhca_buf->length + in virtiovf_resume_write()
1029 sizeof(struct virtio_admin_cmd_resource_obj_cmd_hdr) - in virtiovf_resume_write()
1030 vhca_buf->last_offset; in virtiovf_resume_write()
1031 ret = virtio_pci_admin_dev_parts_set(migf->virtvdev->core_device.pdev, in virtiovf_resume_write()
1032 vhca_buf->table.sgt.sgl); in virtiovf_resume_write()
1034 vhca_buf->last_offset_sg->length = orig_length; in virtiovf_resume_write()
1035 sg_unmark_end(vhca_buf->last_offset_sg); in virtiovf_resume_write()
1038 migf->load_state = VIRTIOVF_LOAD_STATE_READ_HEADER; in virtiovf_resume_write()
1040 vhca_buf->length = 0; in virtiovf_resume_write()
1049 migf->state = VIRTIOVF_MIGF_STATE_ERROR; in virtiovf_resume_write()
1050 mutex_unlock(&migf->lock); in virtiovf_resume_write()
1051 virtiovf_state_mutex_unlock(migf->virtvdev); in virtiovf_resume_write()
1071 return ERR_PTR(-ENOMEM); in virtiovf_pci_resume_device_data()
1073 migf->filp = anon_inode_getfile("virtiovf_mig", &virtiovf_resume_fops, migf, in virtiovf_pci_resume_device_data()
1075 if (IS_ERR(migf->filp)) { in virtiovf_pci_resume_device_data()
1076 ret = PTR_ERR(migf->filp); in virtiovf_pci_resume_device_data()
1081 stream_open(migf->filp->f_inode, migf->filp); in virtiovf_pci_resume_device_data()
1082 mutex_init(&migf->lock); in virtiovf_pci_resume_device_data()
1083 INIT_LIST_HEAD(&migf->buf_list); in virtiovf_pci_resume_device_data()
1084 INIT_LIST_HEAD(&migf->avail_list); in virtiovf_pci_resume_device_data()
1085 spin_lock_init(&migf->list_lock); in virtiovf_pci_resume_device_data()
1093 migf->buf = buf; in virtiovf_pci_resume_device_data()
1102 migf->buf_header = buf; in virtiovf_pci_resume_device_data()
1103 migf->load_state = VIRTIOVF_LOAD_STATE_READ_HEADER; in virtiovf_pci_resume_device_data()
1105 migf->virtvdev = virtvdev; in virtiovf_pci_resume_device_data()
1111 migf->obj_id = obj_id; in virtiovf_pci_resume_device_data()
1113 migf->has_obj_id = true; in virtiovf_pci_resume_device_data()
1114 ret = virtiovf_set_obj_cmd_header(migf->buf); in virtiovf_pci_resume_device_data()
1123 fput(migf->filp); in virtiovf_pci_resume_device_data()
1131 u32 cur = virtvdev->mig_state; in virtiovf_pci_step_device_state_locked()
1146 ret = virtio_pci_admin_mode_set(virtvdev->core_device.pdev, in virtiovf_pci_step_device_state_locked()
1155 ret = virtio_pci_admin_mode_set(virtvdev->core_device.pdev, 0); in virtiovf_pci_step_device_state_locked()
1167 get_file(migf->filp); in virtiovf_pci_step_device_state_locked()
1168 virtvdev->saving_migf = migf; in virtiovf_pci_step_device_state_locked()
1169 return migf->filp; in virtiovf_pci_step_device_state_locked()
1185 get_file(migf->filp); in virtiovf_pci_step_device_state_locked()
1186 virtvdev->resuming_migf = migf; in virtiovf_pci_step_device_state_locked()
1187 return migf->filp; in virtiovf_pci_step_device_state_locked()
1203 get_file(migf->filp); in virtiovf_pci_step_device_state_locked()
1204 virtvdev->saving_migf = migf; in virtiovf_pci_step_device_state_locked()
1205 return migf->filp; in virtiovf_pci_step_device_state_locked()
1217 return ERR_PTR(-EINVAL); in virtiovf_pci_step_device_state_locked()
1230 mutex_lock(&virtvdev->state_mutex); in virtiovf_pci_set_device_state()
1231 while (new_state != virtvdev->mig_state) { in virtiovf_pci_set_device_state()
1232 ret = vfio_mig_get_next_state(vdev, virtvdev->mig_state, in virtiovf_pci_set_device_state()
1241 virtvdev->mig_state = next_state; in virtiovf_pci_set_device_state()
1242 if (WARN_ON(res && new_state != virtvdev->mig_state)) { in virtiovf_pci_set_device_state()
1244 res = ERR_PTR(-EINVAL); in virtiovf_pci_set_device_state()
1258 mutex_lock(&virtvdev->state_mutex); in virtiovf_pci_get_device_state()
1259 *curr_state = virtvdev->mig_state; in virtiovf_pci_get_device_state()
1274 mutex_lock(&virtvdev->state_mutex); in virtiovf_pci_get_data_size()
1275 obj_id_exists = virtvdev->saving_migf && virtvdev->saving_migf->has_obj_id; in virtiovf_pci_get_data_size()
1283 obj_id = virtvdev->saving_migf->obj_id; in virtiovf_pci_get_data_size()
1286 ret = virtio_pci_admin_dev_parts_metadata_get(virtvdev->core_device.pdev, in virtiovf_pci_get_data_size()
1312 virtvdev->migrate_cap = 1; in virtiovf_set_migratable()
1313 mutex_init(&virtvdev->state_mutex); in virtiovf_set_migratable()
1314 spin_lock_init(&virtvdev->reset_lock); in virtiovf_set_migratable()
1315 virtvdev->core_device.vdev.migration_flags = in virtiovf_set_migratable()
1319 virtvdev->core_device.vdev.mig_ops = &virtvdev_pci_mig_ops; in virtiovf_set_migratable()
1324 if (!virtvdev->migrate_cap) in virtiovf_open_migration()
1327 virtvdev->mig_state = VFIO_DEVICE_STATE_RUNNING; in virtiovf_open_migration()
1332 if (!virtvdev->migrate_cap) in virtiovf_close_migration()