82 SEGMF_MAP_EMPTY = 0,
83 SEGMF_MAP_MFN,
84 SEGMF_MAP_GREF
85 } segmf_map_type_t;
86
87 typedef struct segmf_map_s {
88 segmf_map_type_t t_type;
89 segmf_mu_t u;
90 } segmf_map_t;
91
92 struct segmf_data {
93 kmutex_t lock;
94 struct vnode *vp;
95 uchar_t prot;
96 uchar_t maxprot;
97 size_t softlockcnt;
98 domid_t domid;
99 segmf_map_t *map;
100 };
101
102 static struct seg_ops segmf_ops;
103
104 static int segmf_fault_gref_range(struct seg *seg, caddr_t addr, size_t len);
105
106 static struct segmf_data *
107 segmf_data_zalloc(struct seg *seg)
108 {
109 struct segmf_data *data = kmem_zalloc(sizeof (*data), KM_SLEEP);
110
111 mutex_init(&data->lock, "segmf.lock", MUTEX_DEFAULT, NULL);
112 seg->s_ops = &segmf_ops;
113 seg->s_data = data;
114 return (data);
115 }
116
117 int
118 segmf_create(struct seg *seg, void *args)
119 {
120 struct segmf_crargs *a = args;
121 struct segmf_data *data;
122 struct as *as = seg->s_as;
714 GNTMAP_contains_pte;
715 if (!(map[i].u.g.g_flags & SEGMF_GFLAGS_WR)) {
716 mapop[i].flags |= GNTMAP_readonly;
717 }
718 }
719 e = xen_map_gref(GNTTABOP_map_grant_ref, mapop, cnt, B_TRUE);
720 if ((e != 0) || (mapop[0].status != GNTST_okay)) {
721 return (FC_MAKE_ERR(EFAULT));
722 }
723
724 /* save handle for segmf_release_grefs() and mark it as mapped */
725 for (i = 0; i < cnt; i++) {
726 ASSERT(mapop[i].status == GNTST_okay);
727 map[i].u.g.g_handle = mapop[i].handle;
728 map[i].u.g.g_flags |= SEGMF_GFLAGS_MAPPED;
729 }
730
731 return (0);
732 }
733
734 static struct seg_ops segmf_ops = {
735 .dup = segmf_dup,
736 .unmap = segmf_unmap,
737 .free = segmf_free,
738 .fault = segmf_fault,
739 .faulta = segmf_faulta,
740 .setprot = segmf_setprot,
741 .checkprot = segmf_checkprot,
742 .kluster = segmf_kluster,
743 .sync = segmf_sync,
744 .incore = segmf_incore,
745 .lockop = segmf_lockop,
746 .getprot = segmf_getprot,
747 .getoffset = segmf_getoffset,
748 .gettype = segmf_gettype,
749 .getvp = segmf_getvp,
750 .advise = segmf_advise,
751 .pagelock = segmf_pagelock,
752 .getmemid = segmf_getmemid,
753 };
|
82 SEGMF_MAP_EMPTY = 0,
83 SEGMF_MAP_MFN,
84 SEGMF_MAP_GREF
85 } segmf_map_type_t;
86
87 typedef struct segmf_map_s {
88 segmf_map_type_t t_type;
89 segmf_mu_t u;
90 } segmf_map_t;
91
92 struct segmf_data {
93 kmutex_t lock;
94 struct vnode *vp;
95 uchar_t prot;
96 uchar_t maxprot;
97 size_t softlockcnt;
98 domid_t domid;
99 segmf_map_t *map;
100 };
101
102 static const struct seg_ops segmf_ops;
103
104 static int segmf_fault_gref_range(struct seg *seg, caddr_t addr, size_t len);
105
106 static struct segmf_data *
107 segmf_data_zalloc(struct seg *seg)
108 {
109 struct segmf_data *data = kmem_zalloc(sizeof (*data), KM_SLEEP);
110
111 mutex_init(&data->lock, "segmf.lock", MUTEX_DEFAULT, NULL);
112 seg->s_ops = &segmf_ops;
113 seg->s_data = data;
114 return (data);
115 }
116
117 int
118 segmf_create(struct seg *seg, void *args)
119 {
120 struct segmf_crargs *a = args;
121 struct segmf_data *data;
122 struct as *as = seg->s_as;
714 GNTMAP_contains_pte;
715 if (!(map[i].u.g.g_flags & SEGMF_GFLAGS_WR)) {
716 mapop[i].flags |= GNTMAP_readonly;
717 }
718 }
719 e = xen_map_gref(GNTTABOP_map_grant_ref, mapop, cnt, B_TRUE);
720 if ((e != 0) || (mapop[0].status != GNTST_okay)) {
721 return (FC_MAKE_ERR(EFAULT));
722 }
723
724 /* save handle for segmf_release_grefs() and mark it as mapped */
725 for (i = 0; i < cnt; i++) {
726 ASSERT(mapop[i].status == GNTST_okay);
727 map[i].u.g.g_handle = mapop[i].handle;
728 map[i].u.g.g_flags |= SEGMF_GFLAGS_MAPPED;
729 }
730
731 return (0);
732 }
733
734 static const struct seg_ops segmf_ops = {
735 .dup = segmf_dup,
736 .unmap = segmf_unmap,
737 .free = segmf_free,
738 .fault = segmf_fault,
739 .faulta = segmf_faulta,
740 .setprot = segmf_setprot,
741 .checkprot = segmf_checkprot,
742 .kluster = segmf_kluster,
743 .sync = segmf_sync,
744 .incore = segmf_incore,
745 .lockop = segmf_lockop,
746 .getprot = segmf_getprot,
747 .getoffset = segmf_getoffset,
748 .gettype = segmf_gettype,
749 .getvp = segmf_getvp,
750 .advise = segmf_advise,
751 .pagelock = segmf_pagelock,
752 .getmemid = segmf_getmemid,
753 };
|