17
17
#include <linux/hyperv.h>
18
18
#include <linux/uio.h>
19
19
#include <linux/interrupt.h>
20
+ #include <linux/set_memory.h>
20
21
#include <asm/page.h>
21
22
#include <asm/mshyperv.h>
22
23
@@ -456,7 +457,7 @@ static int create_gpadl_header(enum hv_gpadl_type type, void *kbuffer,
456
457
static int __vmbus_establish_gpadl (struct vmbus_channel * channel ,
457
458
enum hv_gpadl_type type , void * kbuffer ,
458
459
u32 size , u32 send_offset ,
459
- u32 * gpadl_handle )
460
+ struct vmbus_gpadl * gpadl )
460
461
{
461
462
struct vmbus_channel_gpadl_header * gpadlmsg ;
462
463
struct vmbus_channel_gpadl_body * gpadl_body ;
@@ -474,6 +475,15 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
474
475
if (ret )
475
476
return ret ;
476
477
478
+ ret = set_memory_decrypted ((unsigned long )kbuffer ,
479
+ PFN_UP (size ));
480
+ if (ret ) {
481
+ dev_warn (& channel -> device_obj -> device ,
482
+ "Failed to set host visibility for new GPADL %d.\n" ,
483
+ ret );
484
+ return ret ;
485
+ }
486
+
477
487
init_completion (& msginfo -> waitevent );
478
488
msginfo -> waiting_channel = channel ;
479
489
@@ -537,7 +547,10 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
537
547
}
538
548
539
549
/* At this point, we received the gpadl created msg */
540
- * gpadl_handle = gpadlmsg -> gpadl ;
550
+ gpadl -> gpadl_handle = gpadlmsg -> gpadl ;
551
+ gpadl -> buffer = kbuffer ;
552
+ gpadl -> size = size ;
553
+
541
554
542
555
cleanup :
543
556
spin_lock_irqsave (& vmbus_connection .channelmsg_lock , flags );
@@ -549,6 +562,11 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
549
562
}
550
563
551
564
kfree (msginfo );
565
+
566
+ if (ret )
567
+ set_memory_encrypted ((unsigned long )kbuffer ,
568
+ PFN_UP (size ));
569
+
552
570
return ret ;
553
571
}
554
572
@@ -561,10 +579,10 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
561
579
* @gpadl_handle: some funky thing
562
580
*/
563
581
int vmbus_establish_gpadl (struct vmbus_channel * channel , void * kbuffer ,
564
- u32 size , u32 * gpadl_handle )
582
+ u32 size , struct vmbus_gpadl * gpadl )
565
583
{
566
584
return __vmbus_establish_gpadl (channel , HV_GPADL_BUFFER , kbuffer , size ,
567
- 0U , gpadl_handle );
585
+ 0U , gpadl );
568
586
}
569
587
EXPORT_SYMBOL_GPL (vmbus_establish_gpadl );
570
588
@@ -675,7 +693,7 @@ static int __vmbus_open(struct vmbus_channel *newchannel,
675
693
goto error_clean_ring ;
676
694
677
695
/* Establish the gpadl for the ring buffer */
678
- newchannel -> ringbuffer_gpadlhandle = 0 ;
696
+ newchannel -> ringbuffer_gpadlhandle . gpadl_handle = 0 ;
679
697
680
698
err = __vmbus_establish_gpadl (newchannel , HV_GPADL_RING ,
681
699
page_address (newchannel -> ringbuffer_page ),
@@ -701,7 +719,8 @@ static int __vmbus_open(struct vmbus_channel *newchannel,
701
719
open_msg -> header .msgtype = CHANNELMSG_OPENCHANNEL ;
702
720
open_msg -> openid = newchannel -> offermsg .child_relid ;
703
721
open_msg -> child_relid = newchannel -> offermsg .child_relid ;
704
- open_msg -> ringbuffer_gpadlhandle = newchannel -> ringbuffer_gpadlhandle ;
722
+ open_msg -> ringbuffer_gpadlhandle
723
+ = newchannel -> ringbuffer_gpadlhandle .gpadl_handle ;
705
724
/*
706
725
* The unit of ->downstream_ringbuffer_pageoffset is HV_HYP_PAGE and
707
726
* the unit of ->ringbuffer_send_offset (i.e. send_pages) is PAGE, so
@@ -759,8 +778,7 @@ static int __vmbus_open(struct vmbus_channel *newchannel,
759
778
error_free_info :
760
779
kfree (open_info );
761
780
error_free_gpadl :
762
- vmbus_teardown_gpadl (newchannel , newchannel -> ringbuffer_gpadlhandle );
763
- newchannel -> ringbuffer_gpadlhandle = 0 ;
781
+ vmbus_teardown_gpadl (newchannel , & newchannel -> ringbuffer_gpadlhandle );
764
782
error_clean_ring :
765
783
hv_ringbuffer_cleanup (& newchannel -> outbound );
766
784
hv_ringbuffer_cleanup (& newchannel -> inbound );
@@ -806,7 +824,7 @@ EXPORT_SYMBOL_GPL(vmbus_open);
806
824
/*
807
825
* vmbus_teardown_gpadl -Teardown the specified GPADL handle
808
826
*/
809
- int vmbus_teardown_gpadl (struct vmbus_channel * channel , u32 gpadl_handle )
827
+ int vmbus_teardown_gpadl (struct vmbus_channel * channel , struct vmbus_gpadl * gpadl )
810
828
{
811
829
struct vmbus_channel_gpadl_teardown * msg ;
812
830
struct vmbus_channel_msginfo * info ;
@@ -825,7 +843,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
825
843
826
844
msg -> header .msgtype = CHANNELMSG_GPADL_TEARDOWN ;
827
845
msg -> child_relid = channel -> offermsg .child_relid ;
828
- msg -> gpadl = gpadl_handle ;
846
+ msg -> gpadl = gpadl -> gpadl_handle ;
829
847
830
848
spin_lock_irqsave (& vmbus_connection .channelmsg_lock , flags );
831
849
list_add_tail (& info -> msglistentry ,
@@ -845,6 +863,8 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
845
863
846
864
wait_for_completion (& info -> waitevent );
847
865
866
+ gpadl -> gpadl_handle = 0 ;
867
+
848
868
post_msg_err :
849
869
/*
850
870
* If the channel has been rescinded;
@@ -859,6 +879,12 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
859
879
spin_unlock_irqrestore (& vmbus_connection .channelmsg_lock , flags );
860
880
861
881
kfree (info );
882
+
883
+ ret = set_memory_encrypted ((unsigned long )gpadl -> buffer ,
884
+ PFN_UP (gpadl -> size ));
885
+ if (ret )
886
+ pr_warn ("Fail to set mem host visibility in GPADL teardown %d.\n" , ret );
887
+
862
888
return ret ;
863
889
}
864
890
EXPORT_SYMBOL_GPL (vmbus_teardown_gpadl );
@@ -933,18 +959,15 @@ static int vmbus_close_internal(struct vmbus_channel *channel)
933
959
}
934
960
935
961
/* Tear down the gpadl for the channel's ring buffer */
936
- else if (channel -> ringbuffer_gpadlhandle ) {
937
- ret = vmbus_teardown_gpadl (channel ,
938
- channel -> ringbuffer_gpadlhandle );
962
+ else if (channel -> ringbuffer_gpadlhandle .gpadl_handle ) {
963
+ ret = vmbus_teardown_gpadl (channel , & channel -> ringbuffer_gpadlhandle );
939
964
if (ret ) {
940
965
pr_err ("Close failed: teardown gpadl return %d\n" , ret );
941
966
/*
942
967
* If we failed to teardown gpadl,
943
968
* it is perhaps better to leak memory.
944
969
*/
945
970
}
946
-
947
- channel -> ringbuffer_gpadlhandle = 0 ;
948
971
}
949
972
950
973
if (!ret )
0 commit comments