319 Matching Annotations
  1. Last 7 days
    1. Using the RPE-specific monoclonal antibody RPE9, raised against human RPE cells, we have identified a novel 65 kD protein, conserved in mammals, birds, and frogs.

      Selection A - Gene is expressed in tissues relevant to disease:

      ExperimentName: RPE65 expression is highly specific to the retinal pigment epithelium

      TissueExpression: pigmented layer of retina (also known as retinal pigment epithelium, UBERON:0001782)

      ExpressionEvidence: RPE65 protein was first detected using an RPE-specific monocolonal antibody raised against human retinal pigment epithelium (RPE) cells. Retina-specific gene expression data from a separate publication (PMID: 30239781, https://eyeintegration.nei.nih.gov/) confirm that RPE65 expression is highly specific to the retina relative to other tissues within the eye or the human body in general. Note where the evidence is found in the article.

    1. Like other membrane guanylyl cyclases, the 1101 aa retGC is predicted to have a hydrophobic amino-terminal signal sequence followed by a large extracelluiar domain, a single membrane spanning domain, a kinase homology domain, and a guanylyl cyclase catalytic domain. In contrast to other membrane guanylyl cylases, such as natriuretic peptide receptors, retGC has a relatively high basal level of activity when expressed in human 293 cells. cGMP production by retGC is unaffected by any of the known natriuretic peptides. In situ hybridization analysis of a variety of rhesus monkey tissues showed retGC transcripts to be localized exclusively along the retinal outer nuclear layer, corresponding to the nuclei of the rod and cone photoreceptor cells. Our results suggest that retGC may synthesize cGMP required for recovery of the dark state after phototransduction.

      Selection B - Gene function is consistent with phenotype.

      GOterm: GO:0007168 (receptor guanylyl cyclase signaling pathway)

      FunctionalEvidence: Exogenous expression of the gene product in 293 cells exhibits a high level of cGMP production activity. When combined with the in situ hybridization evidence showing its expression along the retinal outer nuclear layer (coinciding with the rod and cone photoreceptor cell nuclei), this biochemical evidence indicates a function in synthesizing cGMP to promote recovery of the dark state following phototransduction.

      FunctionalHPO: HP:0000662 (Nyctalopia), HP:0007663 (Reduced visual acuity), HP:0007688 (Undetectable light- and dark-adapted electroretinogram), HP:0007703 (Abnormality of retinal pigmentation)

      PhenotypeEvidence: The ability of the exogenously expressed enzyme to efficiently catalyze cGMP production (Figure) is consistent with the loss of photoreceptor function that is characteristic of the disease, as abnormalities in cGMP levels have long been associated with photoreceptor degeneration (PMID: 4369896).

    1. Hprp3p and Hprp4p have been shown to interact with each other and the first 100 amino acids of Hprp3p are not essential for this interaction. These experiments suggest that both Hprp3p and Hprp4p are components of human spliceosomes.

      ExperimentName: PRPF4 physically interacts with PRPF3.

      InteractingGene: PRPF3 (HGNC:17348)

      InteractionType: Physical

      InteractionMethod: Co-immunoprecipitation

      InteractionEvidence: Immunoprecipitation of endogenous PRPF3 from HeLa cell nuclear extracts pulled down PRPF4 (Figures 5 and 6).

    1. AAV-mediated expression of human L-opsin promoted cone outer segment regeneration and rescued cone-mediated function when mice were injected subretinally at 2 months of age or younger. Cone-mediated function and visually guided behavior were maintained for at least 8 months post-treatment. However, when mice were treated at 5 and 7 months of age, the chance and effectiveness of rescue was significantly reduced, although cones were still present in the retina. Crossing Opn1mw−/−/Opn1sw−/− mice with proteasomal activity reporter mice (UbG76V–GFP) did not reveal GFP accumulation in Opn1mw−/−/Opn1sw−/− cones eliminating impaired degradation of ubiquitinated proteins as stress factor contributing to cone loss. Our results demonstrate that AAV-mediated gene augmentation therapy can rescue cone structure and function in a mouse model with a congenital opsin deletion

      Selection B- Gene function is consistent with phenotype.

      ExperimentName: OPN1LW encodes a long-wave-sensitive opsin and can rescue cone-mediated function when subretinally injected in Opn1mw−/−/Opn1sw−/− mice.

      GOterm: GO:0007602 (phototransduction)

      FunctionalEvidence: Subretinal injection of AAV carrying the OPN1LW gene encoding human L-opsin into mice at age 2 months or younger promoted cone outer segment regeneration () and rescued cone functions such as the b-wave amplitude of the long wavelength-mediated electroretinogram response (Figures 2A, 2B, 4D) and visually guided behavior (Figure 4E).

      FunctionalHPO: Protanopia HP:0011522

    1. Here we identify a complex composed of seven highly conserved BBS proteins. This complex, the BBSome, localizes to nonmembranous centriolar satellites in the cytoplasm but also to the membrane of the cilium. Interestingly, the BBSome is required for ciliogenesis but is dispensable for centriolar satellite function. This ciliogenic function is mediated in part by the Rab8 GDP/GTP exchange factor, which localizes to the basal body and contacts the BBSome. Strikingly, Rab8(GTP) enters the primary cilium and promotes extension of the ciliary membrane. Conversely, preventing Rab8(GTP) production blocks ciliation in cells and yields characteristic BBS phenotypes in zebrafish. Our data reveal that BBS may be caused by defects in vesicular transport to the cilium.

      ExperimentName: BBS7 interacts with other components of the BBSome.

      InteractingGene: BBS4 (HGNC:969)

      InteractionType: Physical

      InteractionMethod: co-immunoprecipitation

      InteractionEvidence: Antibody-based isolation of BBS4 results in co-purification of BBS7, as well as BBS1, BBS2, BBS5, BBS8, and BBS9 in stoichiometric quantities. The co-purifying proteins are shown separated by gel electrophoresis in Figure 1F and were identified and quantified by mass spectrometry in Table S1. All 8 proteins are encoded by genes linked to Bardet-Biedl syndrome.

    1. The developmental appearance of the rds protein coincides with outer segment disc formation. We propose that the rds protein functions as an adhesion molecule for stabilization of the outer segment discs.

      Selection A- Gene is expressed in tissues relevant to disease:

      ExperimentName: Wild-type Prph2 expression in the developing mouse retina begins on day postnatal day 6.

      TissueExpression: photoreceptor outer segment layer (UBERON:0003926)

      ExpressionEvidence: Immunohistochemistry indicates that wild-type Prph2 expression in the developing mouse retina begins on day postnatal day 6 (Figure 3C). This time point coincides with the timing of the formation of the photoreceptor outer segment discs, and is consistent with a proposed function of PRPH2 as an adhesion molecule that acts to stabilize the outer segment discs.

    1. To determine if LRP-5 has any effect on the canonical Wnt signaling pathway in mammalian cells, we coexpressed LRP-5 with Wnt-1 in NIH 3T3 cells. In these cells, Wnt-1 has been shown to elevate the levels of cytosolic β-catenin and activate LEF-1-dependent transcriptional activity (Li et al. 1999aLi L Yuan H Weaver C Mao J Farr III, G.H Sussman D.J Jonkers J Kimelman D Wu D Axin and Frat-1 interact with Dvl and GSK, bridging Dvl to GSK in Wnt-mediated regulation of LEF-1.EMBO J. 1999; 18 (a): 4233-4240Crossref PubMed Scopus (358) Google Scholar, Li et al. 1999bLi L Yuan H Xie W Mao J McMahon E Sussman D Wu D Dishevelled proteins lead to two different signaling pathways; regulation of the JNK and b-catenin pathways.J. Biol. Chem. 1999; 274 (b): 129-134Crossref PubMed Scopus (255) Google Scholar). Expression of LRP-5 alone had no effect on LEF-1 activity (Figure 1A), as determined using a LEF-1-dependent luciferase reporter gene assay (Hsu et al. 1998Hsu S.C Galceran J Grosschedl R Modulation of Transcriptional Regulation By Lef-1 in Response to Wnt-1 Signaling and Association With Beta-Catenin.Mol. Cell. Biol. 1998; 18: 4807-4818Crossref PubMed Scopus (338) Google Scholar), but enhanced the effect of Wnt-1 (Figure 1A) or Wnt-3a (data not shown). To confirm that LRP-5 acted with secreted Wnt-1 protein, a paracrine coculture approach was used (Li et al. 1999aLi L Yuan H Weaver C Mao J Farr III, G.H Sussman D.J Jonkers J Kimelman D Wu D Axin and Frat-1 interact with Dvl and GSK, bridging Dvl to GSK in Wnt-mediated regulation of LEF-1.EMBO J. 1999; 18 (a): 4233-4240Crossref PubMed Scopus (358) Google Scholar), in which LRP-5 and the reporter luciferase were transfected into one group of cells and Wnt-1 was transfected into a separate group of cells. These two groups were combined after transfection, and luciferase activities were determined after the cells were cocultured for 24 hr. Since Wnt-1 and the reporter gene were produced in different cells, any effect of Wnt-1 could be attributed only to the interaction of secreted Wnt-1 protein with cells expressing LRP-5 and containing the reporter gene. As shown in Figure 1B, LRP-5 and Wnt-1 acted synergistically in the activation of LEF-1-dependent transcription in the paracrine assay, demonstrating that LRP-5 potentiates the signaling of secreted Wnt-1. The same results were also observed for Wnt-3a in similar coculture assays (data not shown).

      Selection B - Gene function is consistent with phenotype.

      Title: LRP5 is a canonical Wnt signaling pathway co-receptor.

      GOterm: GO:0060070 (canonical Wnt signaling pathway)

      FunctionalEvidence: Exogenous LRP5 expression in NIH3T3 cells increases the activity of the canonical Wnt signaling transcription factor LEF1 only when combined with exogenous expression of the Wnt-1 ligand in a separate population of cells grown in co-culture (Figure 1). This function is related to the phenotype in that canonical Wnt signaling is known to mediate bone formation.

      FunctionalHPO: HP:0004349 (reduced bone mineral density), osteoporosis (HP:0000939), HP:0020110 (bone fracture)

    1. (https://eyeintegration.nei.nih.gov/)

      Selection A - Gene is expressed in tissues relevant to disease:

      ExperimentName: High GUCY2D mRNA expression in human retina relative to other tissue types

      TissueExpression: Retina (UBERON:0000966)

      ExpressionEvidence: Evidence can be accessed on the publication-associated website (https://eyeintegration.nei.nih.gov/) through the Pan-Tissue Plots feature.

    1. We demonstrate that the 60 and 90kD tri-snRNP proteins specifically associate with the U4/U6 snRNP at salt concentrations where the tri-snRNP complex has dissociated. The primary structures of the 60kD and 90kD proteins were determined by cloning and sequencing their respective cDNAs. The U4/U6-60kD protein possesses a C-terminal WD domain that contains seven WD repeats and thus belongs to the WD-protein family, whose best-characterized members include the Gbeta subunits of heterotrimeric G proteins. A database homology search revealed a significant degree of overall homology (57.8% similarity, 33.9% identity) between the human 60kD protein and the Saccharomyces cerevisiae U4/U6 snRNP protein Prp4p. Two additional, previously undetected WD repeats (with seven in total) were also identified in Prp4p, consistent with the possibility that 60kD/Prp4p, like beta-transducin, may adopt a propeller-like structure. The U4/U6-90kD protein was shown to exhibit significant homology, particularly in its C-terminal half, with the S. cerevisiae splicing factor Prp3p, which also associates with the yeast U4/U6 snRNP. Interestingly, U4/U6-90kD shares short regions of homology with E. coli RNase III, including a region encompassing its double-stranded RNA binding domain. Based on their structural similarity with essential splicing factors in yeast, the human U4/U6-60kD and 90kD proteins are likely also to play important roles in the mammalian splicing process.

      Selection A- Gene with same function implicated in disease

      ExperimentName: PRPF4 is a U4/U6 small nuclear ribonucleoprotein component that functions in mRNA splicing.

      GOterm: GO:0000398 (mRNA splicing, via spliceosome)

      FunctionalEvidence: PRPF4, PRPF3, PRPF31, and PRPF8 are all splicing factors involved in mRNA processing and are encoded by genes that harbor variants associated with retinitis pigmentosa.

      HGNC: HGNC:17348 (PRPF3, retinitis pigmentosa 18), HGNC:15446 (PRPF31, retinitis pigmentosa 11), HGNC:17340 (PRPF8, retinitis pigmentosa 13)

      GeneEvidence: PRPF3 harbors variants that cause retinitis pigmentosa 18 (PMID: 11773002), PRPF31 harbors variants that cause retinitis pigmentosa 11 (PMID: 12444105), and PRPF8 harbors variants that cause retinitis pigmentosa 13 (PMID: 7951236).

      SharedGeneImplication: PRPF4, PRPF3, PRPF31, and PRPF8 are encode splicing factors involved in mRNA processing.

    1. Our results revealed that the PRPF31 deficiency causes mis-splicing of genes involved in RNA processing (PRPF3, PRPF8, PRPF4, and PRPF19) and phototransduction (RHO, ROM1, FSCN2, GNAT2, and GNAT1) in the retina in the PRPF31 reduced samples. Mis-splicing of genes implicated in phototransduction was associated with photoreceptor degeneration observed in RP patients.

      PRPF4, PRPF3, PRPF31, and PRPF8 are all splicing factors involved in mRNA processing and are encoded by genes that harbor variants associated with retinitis pigmentosa.

    1. The antibody produced strong immunolabeling of Bruch's membrane and drusen and weak labeling of retina blood vessels in unfixed human and baboon eyes. Unfixed chicken, cow, pig, and rat tissues showed no reactivity. After antigen retrieval, all fixed human eyes showed specific labeling of Bruch's membrane and drusen, which was strongest in eyes from elderly donors. The results indicate that TIMP-3 is an extracellular matrix component of Bruch's membrane.

      Selection A- Gene is expressed in tissues relevant to disease:

      ExperimentName: Immunohistochemical localization of TIMP3 expression to Bruch's membrane and drusen deposits

      TissueExpression: Strong expression was observed in Bruch's membrane (UBERON:0003957) and associated drusen, while weak expression was observed in retinal blood vessels (UBERON:0003501).

      ExpressionEvidence: TIMP3 was detected in human eye sections (from patients aged 24 to 85 years) using a monoclonal antibody and a TIMP-3 synthetic peptide for specificity. Bruch's membrane was specifically labeled by the antibody (Figure 2B), with strong labeling observed from the RPE to the elastin sublayer. Drusen associated with Bruch's membrane (particularly smaller deposits) also stained strongly for TIMP3 (Figure 2D), while retinal blood vessels showed weak staining as well. Overall, staining was particularly intense in sections from older patients.

    1. Impg2

      ExperimentName: Morpholino-based disruption of Impg2 in medaka fish

      NonHumanModel: Oryzias latipes

      GeneAlteration: Model animals were subjected to targeted disruption of Impg2 by morpholino-based silencing.

      ModelPhenotype: HP:0030610 (Photoreceptor outer segment loss on macular OCT).

      HumanPhenotype: HP:0000529 (Progressive visual loss), HP:0000662 (Nyctalopia), HP:0000551 (Color vision defect), HP:0008002 (Abnormality of macular pigmentation), HP:0000543 (Optic disc pallor), HP:0007843 (Attenuation of retinal blood vessels), HP:0000533 (Chorioretinal atrophy), HP:0000518 (Cataract), HP:0008323 (Abnormal light- and dark-adapted electroretinogram), HP:0007737 (Bone spicule pigmentation of the retina), HP:0007994 (Peripheral visual field loss), HP:0000603 (Central scotoma)

      ModelEvidence: Morpholino-injected animals exhibit decreased photoreceptor outer segment length, especially for cones (Figures 4I, 4J).

      ModelVariant: The model does not introduce a variant previously observed in human patients, but rather disrupts the expression of the Impg2 ortholog using a morpholino.

    2. Using morpholino-mediated ablation of Impg1 and its paralog Impg2 in medaka fish, we confirmed a phenotype consistent with that observed in the families, including a decreased length of rod and cone photoreceptor outer segments.

      ExperimentName: Morpholino-based disruption of Impg1 in medaka fish

      NonHumanModel: Oryzias latipes

      GeneAlteration: Model animals were subjected to targeted disruption of Impg1 by morpholino-based silencing.

      ModelPhenotype: HP:0030610 (Photoreceptor outer segment loss on macular OCT).

      HumanPhenotype: HP:0007754 (Macular dystrophy), HP:0007769 (Peripheral retinal degeneration), HP:0032037 (Mildly reduced visual acuity, progressive), HP:0008179 (Decreased Arden ratio of electrooculogram)

      ModelEvidence: Morpholino-injected animals exhibit decreased photoreceptor outer segment length, especially for cones (Figures 4I, 4J).

      ModelVariant: The model does not introduce a variant previously observed in human patients, but rather disrupts the expression of the Impg1 ortholog using a morpholino.

    1. phosphodiesterase

      ExperimentName: PDE6A forms a complex with PDE6B and PDE6G

      InteractingGene: HGNC:8786 (PDE6B, implicated in retinitis pigmentosa 40) and HGNC:8789 (PDE6G, implicated in retinitis pigmentosa 57)

      InteractionType: physical

      InteractionMethod: size exclusion chromatography

      InteractionEvidence: Purification of the cGMP phosphodiesterase complex from bovine rod outer segments yields a subunit of 88 kDa (PDE6A), a subunit of 84 kDa (PDE6B), and a subunit of 13 kDa (PDE6G), (Figure 2). This article shows that PDE6A interacts with and co-purifies with PDE6B and PDE6G in a single complex isolated from bovine retina. A subsequent article by Pittler et al. later established the position of PDE6A on chromosome 5 (PMID: 2155175).

    1. Reciprocal co-IPs confirm that RDS/ROM-1 interactions were maintained in retinal extracts from animals carrying the Y141C-RDS mutation (C).

      ExperimentName: Prph2 interacts with Rom1

      InteractingGene: ROM1 (HGNC:10254)

      InteractionType: Physical

      InteractionMethod: Co-immunoprecipitation

      InteractionEvidence: Immunoprecipitation of endogenous Prph2 from mouse retinal extracts pulled down Rom1, and vice versa (Fig. 6C).

    1. we expressed chimeric homodimeric enzymes, enhanced GFP (EGFP)-PDE6C-A and EGFP-PDE6C-B, containing the PDE6A and PDE6B catalytic domains, respectively, in transgenic Xenopus laevis. Similar to EGFP-PDE6C, EGFP-PDE6C-A and EGFP-PDE6C-B were targeted to the rod outer segments and concentrated at the disc rims. PDE6C, PDE6C-A, and PDE6C-B were isolated following selective immunoprecipitation of the EGFP fusion proteins. All three enzymes, PDE6C, PDE6C-A, and PDE6C-B, hydrolyzed cGMP with similar Km (20–23 μm) and kcat (4200–5100 s−1) values. Likewise, the Ki values for PDE6C, PDE6C-A, and PDE6C-B inhibition by the cone- and rod-specific PDE6 γ-subunits (Pγ) were comparable. Recombinant cone transducin-α (Gαt2) and native rod Gαt1 fully and potently activated PDE6C, PDE6C-A, and PDE6C-B. In contrast, the half-maximal activation of bovine rod PDE6 required markedly higher concentrations of Gαt2 or Gαt1. Our results suggest that PDE6A and PDE6B are enzymatically equivalent.

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0047555 (3',5'-cyclic-GMP phosphodiesterase activity)

      FunctionalEvidence: Purified PDE6A fusion protein tagged with EGFP and fused with sequences from PDE6C catalyzes cGMP hydrolysis comparably to the known phosphodiesterase enzymes PDE6B and PDE6C (Fig. 4), confirming that PDE6a is a rod-associated phosphodiesterase that hydrolyzes cGMP.

      FunctionalHPO: HP:0000662 (Nyctalopia), HP:0007994 (Peripheral visual field loss), HP:0000543 (Optic disc pallor), HP:0007843 (Attenuation of retinal blood vessels), HP:0007737 (Bone spicule pigmentation of the retina), HP:0000654 (Decreased light- and dark-adapted electroretinogram amplitude)

    1. Rp1L1 interacts with Rp1 in transfected cells and in retina pull-down experiments.

      ExperimentName: RP1L1 physical interaction with RP1

      InteractingGene: HGNC:10263 (RP1)

      InteractionType: Physical interaction

      InteractionMethod: Co-immunoprecipitation

      InteractionEvidence: Immunoprecipitation of Rp1 or Rp1l1 from transfected 293T cells successfully led to co-immunoprecipitation of the other, indicating their presence in a complex (Figure 7).

    2. To determine the subcellular localization of Rp1L1 in rods, we double stained Rp1L1 and rhodopsin, Rp1, or γ-tubulin in dissociated OS preparations (Fig. 2B). Rhodopsin localizes to OS discs, Rp1 localizes to the axoneme of the basal OS (Zhao et al., 2003; Liu et al., 2004), and γ-tubulin localizes to the basal bodies of the CCs (Hong et al., 2001). We found that Rp1L1 localized to the axoneme of both the OS and CCs but not to the axoneme of the IS or on the basal bodies (Figs. 1E, 2B). Recent photoreceptor sensory cilium complex proteome revealed Rp1L1 expression in the OS but not in the IS, consistent with our observations (Liu et al., 2007). Furthermore, Rp1L1 coexisted with Rp1 only in the OS axoneme but not in the CCs; Rp1L1 and Rp1 appeared localized along the entire length of OS axoneme but were more concentrated at the basal third OS, consistent with previous findings (Fig. 2B, bottom) (Zhao et al., 2003; Liu et al., 2004). To determine whether Rp1L1 was colocalized with microtubules in the axoneme, we stained Rp1L1 in retinal sections with α-acetylated tubulin, which is a marker of polymerized microtubules, including those of the axoneme (Fig. 2C). All Rp1L1 signals were colocalized with axoneme-positive signals. Only a small amount of α-acetylated tubulin-positive axoneme did not appear to include Rp1L1. These were probably the axonemes of cones, which lack Rp1L1 (Fig. 2C, long arrowhead). These findings suggest that both Rp1L1 and Rp1 are expressed in the rod photoreceptor axoneme.

      Selection B- Gene function is consistent with phenotype.

      ExperimentName: RP1L1 protein localizes to the axoneme of the outer segment of rod photoreceptor cells, but not to the connecting cilium, inner segment, or basal bodies (and from cone cells altogether).

      GOterm: GO:0120200 (rod photoreceptor outer segment)

      FunctionalEvidence: Immunofluorescent staining of Rp1l1 was performed in retinal sections, with staining of rhodopsin, Rp1, and gamma-tubulin for comparison (Figures 1E, 2A, 2B, 2C).

      FunctionalHPO: Macular dystrophy HP:0007754, Reduced visual acuity HP:0007663

    1. Results

      NonPatientCell: E-Coli (DH5α)

      GeneFunction: GO:0006559

      GeneAlteration: PAH cDNA was cloned into a pMAL-c2E expression vector encoding an N-terminal MBP tag and an enterokinase cleavage site. PAH mutants were constructed using site-directed mutagenesis and confirmed using DNA sequencing. Both the wild-type and the 10 mutant vectors were transformed into E. coli DH5α via overexpresion of fusion proteins at midexponential phase. The proteins were purified and concentration was determined.

      FunctionalEvidence: Expression of the 10 mutant proteins compared to the wild-type demonstrated that several of these mutants induce protein destabilization and subsequent loss of function. Upon deconvolution analysis, five variants showed significanly distrubed oligomerization and a preponderance to misfold and form high-molecular-weight protein aggregates. Enzyme kinetic parameter analysis demonstrated moderate reduction in PAH activity and severely affected allostery in all but one mutation, indicating the strong possibility of global confirmational changes. Protein confirmation was tested by limited proteolysis with proteinase K with six out of eight tested mutants decreasing the half-life of the protein by >50% and decreased stability in five out of eight. Thermal protein denaturation was analyzed by fluorescence and demonstrated that all of the mutations led to substantial distortion of the protein's confirmation and/or loss of structural integrity compared to the wild-type, especially those in the regulatory domain. Finally, amino acid replacements were shown to disrupt local networks of amino acid interactions and alter the normal oligomeric state and therfore the function of the protein.

      FAVariant1: NM_000277.3(PAH):c.1222C>T (p.Arg408Trp)

      ClinVar: 577 https://www.ncbi.nlm.nih.gov/clinvar/variation/577/

      FAVariant2: NM_000277.3(PAH):c.898G>T (p.Ala300Ser)

      ClinVar: 92751 https://www.ncbi.nlm.nih.gov/clinvar/variation/92751/

      FAVariant3: NM_000277.3(PAH):c.165T>G (p.Phe55Leu)

      ClinVar: 92734 https://www.ncbi.nlm.nih.gov/clinvar/variation/92734/

      FAVariant4: NM_000277.3(PAH):c.1249T>C (p.Tyr417His)

      ClinVar: 102579 https://www.ncbi.nlm.nih.gov/clinvar/variation/102579/

      FAVariant5: NM_000277.3(PAH):c.940C>T (p.Pro314Ser)

      ClinVar: 102905 https://www.ncbi.nlm.nih.gov/clinvar/variation/102905/

    1. Fig. 3

      NonPatientCell Sarcoplasmic reticulum of cardiac muscle cell, FMA:62390

      GeneAlteration The D307H mutant was generated using Quick Change (Life Sciences). Substitution of the CAC codon with GAC resulted in a BamH1 restriction site that was used along with complete sequencing of the DNA inserts to verify sequence.

      FunctionalEvidence (fig. 3) Diminished sensitivity to Ca2+ leading to more intercellular Ca2+

      FAVariant NM_001232.3(CASQ2):c.919G>C (p.Asp307His), 17610

      CaseAddInfo Fig 4&5 show evidence for the conformation change responsible for the sensitivity difference.

      gnomAD 0.00003249 link

    1. PDE6C hydrolyzed cGMP with a Km of 65 ± 6 μm and kcat of 4400 ± 300 s−1 (Fig. 7A).

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0047555 (3',5'-cyclic-GMP phosphodiesterase activity)

      FunctionalEvidence: Purified PDE6C hydrolyzed cGMP with a Km and kcat slightly lower than trypsin-activated bovine rod PDE6 (Figure 7A).

      FunctionalHPO: HP:0000551 (Color vision defect), HP:0030465 (Undetectable light-adapted electroretinogram)

    1. Generation of Bbs1M390R/M390R Knockin Mice. We targeted the Bbs1 gene in mice by constructing a vector containing regions of the mouse Bbs1 gene that replaced the normal methionine codon at position 390 in exon 12 with an arginine codon on homologous recombination (Fig. 1A). RT-PCR of cDNA amplified from the knockin mice confirmed that the M390R allele was spliced correctly without inclusion of the intronic neomycin cassette. Sequencing of the Bbs1M390R/M390R cDNA confirmed that the Bbs1 gene was modified with the incorporation of the homozygous methionine to arginine (ATG to AGG) change in the knockin line (Fig. 1B).

      ExperimentName: Knock-in of the p.M390R variant into the mouse Bbs1 gene.

      NonHumanModel: Mus musculus

      GeneAlteration: The model animals have been subjected to homologous recombination-based knock-in of the p.M390R variant into exon 12 of the endogenous mouse Bbs1 gene. The variant has been studied in the homozygous state.

      ModelPhenotype: HP:0032558 (Absent sperm flagella), HP:0010633 (Partial anosmia), HP:0012433 (Abnormal social behavior), HP:0030469 (Abnormal dark-adapted electroretinogram), HP:0030610 (Photoreceptor outer segment loss on macular OCT), HP:0030609 (Photoreceptor layer loss on macular OCT), HP:0001513 (Obesity), HP:0002119 (Ventriculomegaly),

      HumanPhenotype: HP:0000639 (Nystagmus), HP:0000510 (Rod-cone dystrophy), HP:0007663 (Reduced visual acuity), HP:0000662 (Nyctalopia), HP:0000518 (Cataract), HP:0008323 (Abnormal light- and dark-adapted electroretinogram), HP:0000107 (Renal cyst), HP:0001513 (Obesity), HP:0010442 (Polydactyly), HP:0002463 (Language impairment), HP:0000026 (Male hypogonadism)

      ModelEvidence: Sperm flagella were absent (Figures 2A, 2B). Loss of the outer nuclear layer and degeneration of the photoreceptor inner and outer segments were observed in older mice (Figures 2C, 2D). Photoreceptor morphology in the outer segment was also disrupted in TEM images (Figure 2E). Scotopic responses showed a- and b-wave attenuation (Figure 2G), while photopic responses were not significantly different (Figure 2H). Homozygous mice showed obesity relative to wild-type and heterozygous mice (Figure 3). Brain sections showed neuroanatomical defects, especially ventriculomegaly (Figure 4). Brain cilia were morphologically abnormal (Figure 5). Renal cysts and polydactyly were investigated but not observed.

      ModelVariant: This model introduced a disease-associated variant known from affected human patients (NM_024649.5(BBS1):c.1169T>G (p.Met390Arg), ClinVar ID: 12143).

    1. Nyctalopin is expressed postsynaptically in both synaptic layers of the retina.

      Selection A - Gene is expressed in tissues relevant to disease:

      ExperimentName: Nyx localization to the post-synaptic side of both synaptic layers of the zebrafish retina

      TissueExpression: UBERON:0001790 (Outer plexiform layer of retina), UBERON:0001795 (Inner plexiform layer of retina

      ExpressionEvidence: Nyx was detected by antibody staining of zebrafish retinal sections and was found to localize strongly to both synaptic layers (the outer plexiform layer and inner plexiform layer) but not the outer nuclear layer or inner nuclear layer (Fig. 5A). Lack of co-localization between Nyx and either SV2 or PSD-95 (two presynaptic markers) confirmed that Nyx is specifically post-synaptically localized (Figs. 5C, 6A). This was further confirmed by the detection of Nyx-labeled second-order neuron dendrites invaginating into presynaptic cone pedicles (Figs. 6B and 6C). This data is highly compatible with the findings of a separate mouse experiment (PMID: 17881478) showing that Nyx transgene expression in the dendritic tips of retinal depolarizing bipolar cells rescues the phenotype of Nyx-deficient mice.

    1. It shares several biochemical properties with other metalloproteinase inhibitors, including evidence of intrachain disulfide bonds and resistance to cleavage by trypsin. An electrophoretic assay employing a metal ion-dependent gelatinase from conditioned cell culture medium demonstrates inhibitor activity for purified 21-kDa protein. The 21-kDa protein is the major inhibitor in the extracellular matrix and appears unique in solubility properties among inhibitors with a TIMP-like sequence.

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0008191 (metalloendoproteinase inhibitor activity)

      FunctionalEvidence: The functional evidence consists of an electrophoretic assay in which the 21-kDa chicken ortholog of human TIMP3 shows inhibitory activity towards a metalloproteinase.

      FunctionalHPO: Abnormal extracellular matrix turnover in the inner aspect of Bruch's membrane

      PhenotypeEvidence: This metalloproteinase inhibitor activity and ECM localization of the gene product indicate that it functions in ECM remodeling, balancing the activity of matrix metalloproteinases. This is consistent with the disease phenotype of abnormal thickening of the inner aspect of Bruch's membrane (PMID:11879143). The inhibitor evidence is shown in Figure 2B, where a 21-kDa band protects a gelatin substrate from enzymatic metalloproteinase activity. The purification of the gene product from the extracellular matrix is depicted in Figure 1. A later study showed that the human ortholog of this chicken gene is the TIMP3 gene, mapped to the region on chromosome 22 between q12.1-q13.2 (PMID:8188246).

    1. MLSN Is a Plasma Membrane Protein Mediating Ca2+ Entry. To obtain additional evidence that members of the TRPM subfamily promote cation influx, we expressed the founding member of the TRPM subfamily, MLSN, in HEK293 cells and performed Ca2+ imaging. Expression of MLSN in these cells led to a pronounced Ca2+ entry upon switching the cells from the Ca2+-free to the Ca2+-containing solution; however, alterations in osmolarity had no effect (Fig. ​(Fig.44A, n = 280). Nontransfected cells or cells cotransfected with pYFP and the empty pcDNA3 vector did not display changes in Ca2+ concentration upon switching from the Ca2+-free to the Ca2+-containing bath solutions (Fig. ​(Fig.33D). As was the case with TRPM4, Ca2+ entry mediated by MLSN was blocked by La3+. There was no Sr2+ permeation, and Ba2+ entry was considerably slower than Ca2+ entry (Fig. ​(Fig.44B, n = 32), indicating that MLSN channels have a divalent cation selectivity with Ca2+ > Ba2+ ≫ Sr2+. To determine the subcellular localization of MLSN, we performed immunofluorescent microscopy on transfected HEK293 cells. The confocal images indicated that the MLSN protein was localized at or in close proximity to the plasma membrane (Fig. ​(Fig.44 C and D).

      Selection B- Gene function is consistent with phenotype.

      Title: TRPM1 (MLSN) is a plasma membrane protein that mediates the cellular influx of calcium and other divalent cations, leading to depolarization, as part of the depolarizing photoresponse within ON-bipolar cells of the retina.

      GOterm: GO:0005261 (cation channel activity), GO:0005262 (calcium channel activity)

      FunctionalEvidence: Exogenous expression of TRPM1 (MLSN) in HEK293 cells conferred the ability to allow entry of calcium, barium, and strontium ions, unlike the pYFP or empty vector controls (Figures 4A, 4B, 3C). Confocal microscopy also showed localization to the plasma membrane (Figures 4C, 4D).

      FunctionalHPO: HP:0000662 (Nyctalopia), HP:0000545 (Myopia), HP:0000572 (Visual loss), HP:0007984 (Electronegative electroretinogram)

      PhenotypeEvidence: This evidence is consistent with the view of congenital stationary night blindness 1C as a channelopathy caused by a defect in divalent cation influx, signal transduction, and the polarization / depolarization of ON-bipolar cells.

    1. To identify and characterize the anti-angiogenic domain of TIMP-3, structure function analyses and synthetic peptide studies were performed using VEGF-mediated receptor binding, signaling, migration and proliferation. In addition, the ability of TIMP-3 peptides to inhibit CNV in a mouse model was evaluated.

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0016525 (negative regulation of angiogenesis)

      FunctionalEvidence: The previously known ability of TIMP3 protein to block the binding of VEGF to the VEGFR-2 receptor (PMID:12652295, PMID:19478078) is mapped to the C-terminal region of TIMP3 consisting of amino acids 160-211 (Figures 1c, 2b). This region is relevant to disease in that nonsense variants (PMID:10854443) and splice site disrupting variants (PMID:9760202) of TIMP3 are predicted to remove most or all of this domain. This region is not only necessary and sufficient to block VEGF binding to VEGFR-2 in ELISA assays (Figure 2b), but also can block VEGF-stimulated endothelial migration (Figure 4) and proliferation (Figure 6). In an animal model of choroidal neovascularization (CNV) with lesions induced by laser, the injection of C-terminal TIMP3 peptides can limit CNV-based lesion size (Figure 7). This introduces the possibility that some phenotypes of Sorsby fundus dystrophy such as CNV may be mediated by loss of normal TIMP3 function rather than gain of an abnormal TIMP3 function.

      FunctionalHPO: HP:0011506 (Choroidal neovascularization)

    1. The SFD eyes showed advanced pathology, including loss of virtually all retinal photoreceptors and gliosis of the remaining retinal layers. Bruch’s membrane was markedly thickened with extracellular PAS positive deposits that ranged in thickness from 15 to 60 μm (Fig 1D). The deposits, which were located between the RPE and elastin sublayer of Bruch’s membrane, were strongly TIMP-3 positive throughout their thickness where the RPE cells were retained (Fig 1E). No TIMP-3 reactivity was found in the cytoplasm of the melanin containing RPE cells, which were thinned but usually retained as a monolayer next to the deposits. In occasional areas where RPE cells had been lost, the adjacent Bruch’s membrane deposits remained PAS positive (Fig 2A) but had no TIMP-3 immunoreactivity (Fig 2B).

      Selection B Expression altered in patients

      ExperimentName: Immunohistochemical localization of TIMP3 expression in eye sections from SFD and unaffected human patients

      TissueExpression: In both unaffected and SFD patient tissues, strong TIMP3 expression was observed in Bruch's membrane (UBERON:0003957) and associated drusen (Figure 1).

      ExpressionEvidence: As previously published (PMID:9006347), strong TIMP3 expression was observed in Bruch's membrane and drusen in both normal and SFD samples (Figure 1). In SFD patient tissues, thickened Bruch's membrane stained positively for TIMP3 as well, but only in areas where the retinal pigment epithelial cells were still intact (not in areas exhibiting RPE loss). Numerous extracellular deposits that stained positively with Periodic acid-Schiff (presumably drusen) were also TIMP3-positive. In some areas, retinal blood vessels were occluded by TIMP3-positive deposits as well. These findings clearly localize TIMP3 to the sites closely associated with pathogenesis within the SFD retina. Interestingly, SFD-like deposits in retinitis pigmentosa tissues were similarly TIMP3-positive (Figure 2).

    1. These results suggest that expression of CASQ2R33Q enhances the propensity for spontaneous Ca2+ release from the SR, apparently by increasing the functional activity of the RyR2 channels.

      NonPatientCell myocardium, UBERON:0002349

      GeneAlteration isolated adult rat ventricular myocytes infected with adenoviruses for expression of either the wild-type (WT) or mutant forms of CASQ2. Cytosolic and intra-SR [Ca2+]

      FunctionalEvidence Causes leakage of Ca2+ transients from SR (fig. 5)

      FAVariants NM_001232.3(CASQ2):c.97C>T (p.Arg33Ter), 41043 link

    1. We therefore investigated potential GPR143 interaction partners, with a focus on the melanogenic enzyme tyrosinase. GPR143 co-immunoprecipitated with tyrosinase, while confocal microscopy demonstrated colocalization of the proteins. Furthermore, tyrosinase localized to the plasma membrane when co-expressed with a GPR143 trafficking mutant. The physical interaction between the proteins was confirmed using Fluorescence Resonance Energy Transfer.

      ExperimentName: GPR143 interacts with TYR by co-IP and FRET

      InteractingGene: TYR, which is implicated in oculocutaneous albinism types 1A and 1B

      InteractionType: Physical

      InteractionMethod: Co-immunoprecipitation and FRET were both performed with positive results.

      InteractionEvidence: Co-IP of the exogenously expressed GPR143 fusion protein or endogenous TYR found that IP of one protein pulls down the other as well (Figure 2). This was confirmed by fluorescent resonance energy transfer experiments (Figures 4 and 5). Use of a mislocalizing GPR143 mutant control showed that TYR localization appears to be GPR143-dependent (Figures 3 and 4).

    1. Monoclonal antibodies were used with Western blot analysis to localize the wild-type mouse peripherin/rds protein to isolated mouse rod outer segments and to show that it, like bovine peripherin, exists as two subunits linked by one or more disulfide bonds.

      Selection A- Gene is expressed in tissues relevant to disease:

      ExperimentName: Wild-type Prph2 localizes to mouse rod outer segments.

      TissueExpression: photoreceptor outer segment layer (UBERON:0003926)

      ExpressionEvidence: Western blotting with an anti-Prph2 antibody confirms that Prph2 is present in retinal outer segments and exists a a dimer (Fig. 2), although other control tissues are absent.

    1. To test the binding between SOST and LRP5 as well as LRP6, we produced CM containing a SOST-IgG fusion protein, which tags SOST with the constant region of immunoglobulin heavy chain, and the extracellular portion of LRP5 and LRP6 tagged with the Myc epitope (LRP5N-Myc and LRP6N-Myc). We found that SOST showed specific interactions with LRP5 and LRP6 but not with a similarly tagged low-density lipoprotein receptor (LDLRN-Myc) (Fig. 3A). Furthermore, when LDLRN-Myc was mixed in large excess together with LRP5N-Myc and LRP6N-Myc, SOST specifically bound to LRP5 and LRP6 (Fig. 3A). As an additional control for the binding specificity, we used Fz8CRD-IgG, which has a similar molecular mass to that of SOST-IgG. Despite much higher abundance in the CM, Fz8CRD-IgG was unable to precipitate any detectable amount of LRP5 or LRP6 protein (Fig. 3A).

      ExperimentName: LRP5 interacts with SOST

      InteractingGene: SOST (HGNC:13771)

      InteractionType: Physical

      InteractionMethod: Co-immunoprecipitation

      InteractionEvidence: Immunoprecipitation of an exogenously expressed IgG-SOST fusion protein from conditioned medium pulled down the Myc-tagged soluble portion of LRP5 (and LRP6, but not control targets) (Fig. 3A). Subsequent experiments identified SOST as an LRP5/6 antagonist that attenuates canonical Wnt signaling through these receptors (Figure 4).

    1. All four proteins, NR2E3, NR1D1, NRL and CRX, could be co-immunoprecipitated from the bovine retinal nuclear extract, suggesting their existence in a multi-protein transcriptional regulatory complex in vivo. Our results demonstrate that NR2E3 is involved in regulating the expression of rod photoreceptor-specific genes and support its proposed role in transcriptional regulatory network(s) during rod differentiation.

      ExperimentName: NR2E3 physical interaction with NRL and CRX

      InteractingGene: HGNC:8002 (NRL), HGNC:2383 (CRX)

      InteractionType: Physical interaction

      InteractionMethod: Co-immunoprecipitation

      InteractionEvidence: Immunoprecipitation of NR2E3, NRL or CRX from bovine retinal nuclear extract successfully led to co-immunoprecipitation of the others, indicating their presence in a transcriptional regulatory complex (Figure 6).

    1. Cultured skin fibroblasts from this patient were used to further assess the impact of mutations at the mRNA and protein level.

      Selection B- Expression altered in patients:

      ExperimentName: Detection of CLN5 mRNA and CLN5 protein in cultured skin fibroblasts from the patient and controls

      TissueExpression: Cultured skin fibroblasts (CL:0002620) or "zone of skin" (UBERON:0000014)

      ExpressionEvidence: Reduced CLN5 expression by 45% at the mRNA level (Figure 6) and by 50% at the protein level (Figure 7) indicates that one of the two alleles may be subject to nonsense mediated decay and likely absence of the corresponding protein product. This may confirm the prediction that the nonsense variant NM_006493.4(CLN5):c.418C>T (p.Gln140Ter) is likely subject to nonsense mediated decay.

    1. MM is an example in which the L-pigment gene has been replaced by a gene encoding an M pigment, both the first and second gene in his array encode M pigments.

      MM is a patient with replacement of the entire OPN1LW locus by an additional copy of OPN1MW. This proband cannot be scored due to the variant type, but might be used for Functional Alteration in Patient Cells?

    1. We identified the TULP3-associated proteins by tandem affinity purification followed by mass spectrometry. In both lines (A and B), we found all known components of the IFT-A complex to be associated with TULP3, but not in the control LAP line (Fig. 1A–C). The IFT-A complex proteins recovered were WDR19, IFT140, IFT122, THM1, and WDR35 (Fig. 1A,C, see ​seeDD and Supplemental Fig. S1B for homologs in other organisms and a comment on the nomenclature). Peptide coverage for all of the IFT-A complex proteins was at least 39%, supporting the high significance of the identifications. IFT43 (C14orf179), reported recently to be a part of the IFT-A complex (Cole and Snell 2009), was also recovered (peptide coverage 9%). The IFT-A complex was similarly associated with LAPTULP3 in murine NIH 3T3 fibroblasts and kidney inner medullary-collecting duct IMCD-3 cells (Supplemental Figs. S1A,B, S2A). Tandem affinity purification of the IFT-A complex using a clonal line expressing IFT140LAP in RPE cells likewise copurified with endogenous TULP3 (Fig. 1A–C).

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0030991 (intraciliary transport particle A)

      FunctionalEvidence: Mass spectrometry analysis of IFT-A complex components co-purifying with the TULP3 protein identified the IFT140 protein along with several other known components such as WDR19, IFT122, THM1, and WDR35 (Figure 1C). These other IFT-A components were also confirmed by mass spectrometry to co-purify with IFT140 itself (Figure 1C).

      FunctionalHPO: Absence of primary cilia in a high number of cells from the affected patients (shown using acetylated alpha-tubulin staining of cultured fibroblasts)

      PhenotypeEvidence: Primary cilia from the affected patients are known to be absent from a high proportion of cells in the affected individuals, while the gene product functions in a complex known to participate in retrograde ciliary transport (Figure 1A, 1C). This trafficking process is known to be mediated by the IFT-A complex and is critical to the assembly and maintenance of cilia.

    1. In situ hybridization analyses indicate that, in the eye, IPM 150 mRNA is expressed specifically by cone and rod photoreceptor cells.

      Selection A - Gene is expressed in tissues relevant to disease:

      ExperimentName: IMPG1 protein ("IPM150") expression within eye tissues is localized to cone and rod photoreceptor cells in the outer nuclear layer.

      TissueExpression: UBERON:0001789 (outer nuclear layer of retina)

      ExpressionEvidence: In situ hybridization within eye tissues detects IMPG1 expression in the cone and rod photoreceptor cells, specifically in the outer nuclear layer (Figure 8).

    2. The interphotoreceptor matrix (IPM) occupies the extracellular space between the apical surface of the retinal pigmented epithelium and the external limiting membrane of the neural retina. This space contains two chondroitin sulfate proteoglycans, designated IPM 150 and IPM 200

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0033165 (interphotoreceptor matrix)

      FunctionalEvidence: IMPG1 protein can be purified as a component of an insoluble extracellular layer that is located between apical side of the RPE and the external limiting membrane of the neural retina, known as the interphotoreceptor matrix (Figure 1). This layer is known to support the function and maintenance of photoreceptor cells (PMID: 7344830).

      FunctionalHPO: HP:0030612 (Abnormal retinal morphology on macular OCT, specifically photoreceptor outer segment elongation), HP:0007677 (Vitelliform-like macular lesions)

      PhenotypeEvidence: The article provides an example of the function of IMPG1 (here referred to as IPM150) as a component of the interphotoreceptor matrix, an insoluble extracellular layer that is located between apical side of the RPE and the external limiting membrane of the neural retina, and which supports the adhesion, function, and maintenance of photoreceptor cells.

    1. As shown in Figure 3A, we first detect skeletal expression of Lrp5 in the cells that are forming the lateral part of the clavicle. These cells express other markers of skeletal differentiation, such as alkaline phosphatase and Runx2 (data not shown), although they have not yet begun to make a detectable mineralized matrix. During embryonic day 16.5 when the diaphyseal bone collar is forming around the humerus, Lrp5 expression is noted in osteoblasts along the endosteal surface and not in growth plate chondrocytes (Figure 3B). In addition to the detection of osteoblastic expression in appendicular bones, expression was also noted in osteoblasts that line the developing calvaria (Figure 3C).

      Selection A- Gene is expressed in tissues relevant to disease:

      ExperimentName: Lrp5 expression in mouse embryonic osteoblasts coincides with bone formation / ossification.

      TissueExpression: UBERON:0003129 (skull)

      ExpressionEvidence: In situ hybridization first detects Lrp5 expression in the mouse clavicle at embryonic day 14, when membranous ossification is occurring (Fig. 3A) and when other markers of skeletal differentiation are present. Lrp5 is also seen at embryonic day 16.5 in osteoblasts along the endosteal surface of the developing humerus, but not in growth plates (Fig. 3B). Finally, osteoblasts in the developing calvaria (skull) exhibit Lrp5 expression as well (Fig. 3C). All three observations support a role for LRP5 in bone formation, which is consistent with the phenotype of osteoporosis in patients with biallelic loss-of-function.

    1. Although it is known that RPE65 is critical for regeneration of 11-cis retinol in the visual cycle, the function of RPE65 is elusive. Here we show that recombinant RPE65, when expressed in QBI-293A and COS-1 cells, has robust enzymatic activity of the previous unidentified isomerohydrolase, an enzyme converting all-trans retinyl ester to 11-cis retinol in the visual cycle.

      Selection B - Gene function is consistent with phenotype.

      GOterm: GO:0052885 (all-trans-retinyl-ester hydrolase, 11-cis retinol forming activity)

      FunctionalEvidence: Exogenous co-expression of RPE65 and the LRAT enzyme in QBI-293A or COS-1 cells provides these cells with the enzymatic ability to generate 11-cis retinol from all-trans retinyl ester, identifying RPE65 as the human isomerohydrolase enzyme (Figures 4B-4F).

      FunctionalHPO: HP:0007688 (Undetectable light- and dark-adapted electroretinogram), HP:0000529 (Progressive visual loss), HP:0000618 (Blindness)

      PhenotypeEvidence: Maintenance of vision is dependent upon the visual retinoid cycle to enzymatically regenerate 11-cis retinal following the light-induced isomerization of this pigment to all-trans retinal. Isomerohydrolase is an enzymatic activity known to be responsible for this conversion and known to localize to the retinal pigment epithelium, but not previously mapped to a human gene prior to this study. The present paper identifies the RPE65 protein as the human isomerohydrolase enzyme, linking its biallelic loss to congenital blindness (Figures 4B-4F).

    1. Thus, ectopic expression of CASQ2D307H suppressed the ability of SR to store Ca2+.

      NonPatientCell myocardium of ventricle, UBERON:0001083

      GeneAlteration The D307H mutation was introduced into the coding sequence of canine CASQ2 by site-directed mutagenesis. The canine CASQ2D307H coding sequence was inserted into an adenoviral vector to generate Ad-CASQ2D307H for subsequent gene transfer into adult rat ventricular myocytes.

      FunctionalEvidence (fig. 2) More intracellular Ca2+ due to reduced ability of SR to store Ca2+

      Add Fig. 4 Increased transients through Ca2+ sparks

      FAVariants NM_001232.3(CASQ2):c.919G>C (p.Asp307His), 17610 link

    1. (f) Presynaptic localization of mouse CaBP4 (red) demonstrated by covisualization with a presynaptic protein (PSD95; green). Arrows indicate rod spherules and cone pedicles. (g) Colocalization of synaptic vesicle proteins SV2 and synaptophysin (green) with mouse CaBP4 (red).

      Biochemical evidence showing mouse CaBP4 (red) localization to the presynaptic region based on co-localization with the PSD95 marker (green).

    1. We show that, in the retina, CEP290 associates with several microtubule-based transport proteins including RPGR, which is mutated in ~15% of patients with retinitis pigmentosa.

      ExperimentName: Co-IP showing interaction of RPGR with CEP290

      InteractingGene: CEP290, which is implicated in Leber congenital amaurosis 10 and multiple syndromic phenotypes (Joubert syndrome, Meckel syndrome, and Senior-Loken syndrome).

      InteractionType: Physical

      InteractionMethod: Co-immunoprecipitation was performed with a positive result, while yeast-2-hybrid (Y2H) was performed with a negative result.

      InteractionEvidence: Co-IP with an RPGR antibody (Figure 4A) or CEP290 antibody (Figure 4B) successfully immunoprecipitates both proteins from wild-type mouse retinal extracts. The two (endogenously expressed) proteins also co-localize in IMDC-3 cells (Figure 4C). However, yeast 2-hybrid experiments do not confirm this interaction as direct (data not shown).

    1. RPGR was found in the connecting cilia of rods and cones with no evidence for species-dependent variation. RPGR ORF15 was the predominant variant in photoreceptor connecting cilia whereas constitutive RPGR (default) was the sole variant in the transitional zone of motile cilia in airway epithelia. Removal of soluble materials in the interphotoreceptor matrix facilitated detection of RPGR in the connecting cilia in photoreceptors. conclusions. RPGR localizes in photoreceptor connecting cilia and in a homologous structure, the transitional zone of motile cilia. These data are important for understanding the multitude of clinical manifestations associated with mutations in RPGR.

      Selection B - Gene function is consistent with phenotype.

      GOterm: GO:0032391 (photoreceptor connecting cilium)

      FunctionalEvidence: This study uses a RPGR antibody to stain mouse retinal sections, showing localization of RPGR to the region between the outer segment and inner segment associated with the connecting cilia of rod and cone photoreceptors (Figure 2A). A similar experiment was performed in earlier studies with similar results (PMID: 11104772 Figure 4A, PMID: 10725384 Figure 2D upper). Within mouse airway epithelium tissue sections, RPGR antibody stained a narrow band across the apical domains of multi-ciliated cells (Figure 7A), corresponding with the basal parts of the motile cilia adjacent to the basal bodies (Figures 7B, 7C). This transitional zone of the motile cilia is the structural equivalent of the connecting cilia of photoreceptors, consistent with a biochemical role for RPGR in regulating ciliary organization and/or transport in both the retina and the respiratory tract.

      FunctionalHPO: HP:0007642 (Congenital stationary night blindness), HP:0007994 (Peripheral visual field loss), HP:0000529 (Progressive visual loss), HP:0000365 (Hearing impairment), HP:0002205 (Recurrent respiratory infections), HP:0011109 (Chronic sinusitis), HP:0000388 (Otitis media), HP:0002837 (Recurrent bronchitis), HP:0012263 (Immotile cilia), HP:0005938 (Abnormal respiratory motile cilium morphology)

      PhenotypeEvidence: This identification of RPGR as a potential regulator of ciliary organization and/or transport in multiple tissues is consistent with the diverse phenotypes associated with RPGR loss-of-function, ranging from visual defects associated with rod and cone dysfunction to respiratory defects associated with dysfunction of the respiratory motile cilia.

    1. In cell-based assays, the overexpression of ADAM9 enhanced the ectodomain shedding of EphB4, Tie-2, Flk-1, CD40, VCAM, and VE-cadherin, so the enhanced expression of ADAM9 could potentially affect pathological neovascularization by increasing the shedding of these and other membrane proteins from endothelial cells. Finally, we provide the first evidence for the upregulation of ADAM9-dependent shedding by reactive oxygen species, which in turn are known to play a critical role in OIR.

      Selection B- Gene function is consistent with phenotype.

      Title: ADAM9 enhances protelytic shedding of membrane protein ectodomains.

      GOterm: GO:0006509 (membrane protein ectodomain proteolysis), GO:0045765 (regulation of angiogenesis)

      FunctionalEvidence: ADAM9 over-expression in COS-7 cells enhances proteolytic shedding of membrane proteins involved in angiogenesis (Figure 5). This effect is further enhanced by reactive oxygen species (Figures 6, 7).

      FunctionalHPO: HP:0007843 (Attenuation of retinal blood vessels), HP:0000546 (Retinal degeneration)

      PhenotypeEvidence: This evidence is consistent with attenuation of retinal blood vessels observed in human patients as well as the finding from this same paper that Adam9 knockout mice exhibit reduced ocular neovascularization (Figures 1, 3).

    1. The disintegrin domain of MDC-9 lacks an RGD motif but has recently been reported to bind the alpha(6)beta(1) integrin; however, it is unclear whether MDC-9 can bind other integrins. In the present study myeloma cells, but not lymphoblastoid cells, were shown to bind to immobilised, recombinantly expressed MDC-9 disintegrin domain (A9dis). Binding was divalent cation-dependent, being supported by Mn(2+) and Ca(2+). Adhesion of myeloma cells to A9dis was completely inhibited by an antibody to the alpha(v)beta(5) integrin but not by antibodies to other subunits. RGD-containing peptides had no effect on binding, suggesting that MDC-9 interacts with alpha(v)beta(5) in an RGD-independent manner. Flow cytometric analyses demonstrated that myeloma cells, but not lymphoblastoid cells, expressed alpha(v)beta(5) on the cell membrane. These data indicated that the disintegrin domain of MDC-9 can function as an adhesion molecule by interacting with an alpha(v)beta(5) integrin.

      Selection B- Gene function is consistent with phenotype.

      Title: ADAM9 (MDC-9) functions as an adhesion molecule by interacting with integrins.

      GOterm: GO:0033630 (positive regulation of cell adhesion mediated by integrin)

      FunctionalEvidence: Melanoma cells bind to they the immobilized recombinant ADAM9 disintegrin domain in a manner that is dependent on divalent cations (Mn2+ or Ca2+). The interaction can also be disrupted by an antibody to the alpha(v)beta(5) integrin, indicating that the cell-cell adhesion function of ADAM9 is mediated by an interaction with this molecule.

      FunctionalHPO: HP:0000546 (Retinal degeneration), HP:0007703 (Abnormality of retinal pigmentation), HP:0030610 (Photoreceptor outer segment loss on macular OCT

      PhenotypeEvidence: This evidence is consistent with evidence that Adam9 knockout mice exhibit a gap between the photoreceptor outer nuclear segment and the retinal pigment epithelium, indicating that loss of this adhesion molecule may impair the integrity of retinal organization.

    1. We provide here structural evidence that the protein product of the ocular albinism type 1 gene (OA1), a pigment cell-specific integral membrane glycoprotein, represents a novel member of the GPCR superfamily and demonstrate that it binds heterotrimeric G proteins. Moreover, we show that OA1 is not found at the plasma membrane, being instead targeted to specialized intracellular organelles, the melanosomes. Our data suggest that OA1 represents the first example of an exclusively intracellular GPCR

      Selection B- Gene function is consistent with phenotype.

      Title: GPR143 binds heterotrimeric G proteins and shows subcellular localization to melanosomes.

      GOterm: GO:0032402 (melanosome transport)

      FunctionalEvidence: Exogenously expressed GPR143 in COS-7 cells forms protein-protein interactions with heterotrimeric G-proteins that can be co-immunoprecipitated (Figure 2). This was validated with endogenous GPR143 (Figure 3). GPR143 shows subcellular localization not to the plasma membrane but to melanosomes (Figures 4, 6).

      FunctionalHPO: HP:0005592 (Giant melanosomes in melanocytes), severely reduced microtubule-based motility in melanosomes

      HumanPhenotype: HP:0005592 (Giant melanosomes in melanocytes), HP:0007894 (Hypopigmentation of the fundus), severely reduced microtubule-based motility in melanosomes, Giant melanosomes in retinal pigment epithelial cells

      PhenotypeEvidence: This evidence is consistent with the melanocyte trafficking defects characteristic of human patients.

    1. Cell expression studies show that RD3 mediates the export of GC1 from the endoplasmic reticulum to endosomal vesicles, and that the C terminus of GC1 is required for RD3 binding.

      ExperimentName: GUCY2D protein-protein interaction with RD3

      InteractingGene: HGNC:19689 (implicated in LCA12)

      InteractionType: Physical (protein-protein) interaction

      InteractionMethod: Interaction was established by coimmunoprecipitation followed by mass spectrometry (Table S1), confirmed by western blotting (Figure 2A).

      InteractionEvidence: Mouse Rd3 was immunoprecipitated by monoclonal antibody and co-purifying proteins were identified by LC-MS/MS. The highest-scoring interacting partner was Gucy2e, the mouse ortholog of GUCY2D (Table S1). This was confirmed by western blotting (Figure 2A) and found to be dependent on the C-terminus of Gucy2e (Figure 5).

    1. To assess whether the CLN5 polypeptide would interact with other lysosomal CLN proteins, we examined all possible combinations of CLN1, CLN2, CLN3, and CLN5 by coimmunoprecipitation assay.

      ExperimentName: Interaction with TPP1 and CLN3

      InteractingGene: TPP1 (formerly known as CLN2) and CLN3

      InteractionType: Physical (protein-protein) interaction

      InteractionMethod: Co-immunoprecipitation

      InteractionEvidence: PPT1 (aka CLN1), CLN3, and CLN5 were exogenously expressed in COS-1 cells. Immunoprecipitation of endogenous TPP1 (Fig. 5A) or exogenously expressed CLN3 (Fig. 5B) successfully co-immunoprecipitated CLN5 (demonstrated by western blotting). Immunoprecipitation of GST-CLN5 successfully co-immunoprecipitated TPP1 and CLN3 (Fig. 5C). This evidence helps validate the link between CLN5 variants and neuronal ceroid lipofuscinosis, as both TPP1 and CLN3 have also been linked with this disease state.

    1. Protein extracts from wild-type and LAP-BBS4 transgenic testes were subjected to tandem affinity purification. In LAP-BBS4 transgenic testis, all BBSome subunits (Bbs1, Bbs2, Bbs5, Bbs7, Bbs8, and Bbs9) were co-purified with LAP-BBS4, while no BBS proteins were purified when wild-type testes were used (Figure 1A and Table S1).

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0034464 (BBSome)

      FunctionalEvidence: Affinity-purified human BBS4 expressed from a transgene in mouse testes resulted in co-purification of all BBSome subunits, including Bbs1, as identified by mass spectrometry (Figure 1A).

      FunctionalHPO: HP:0000026 (Male hypogonadism), HP:0000510 (Rod-cone dystrophy), HP:0001513 (Obesity)

    1. Subcellular localization of spam to the outer segment of mature porcine retina using antibody to spam (green) and antibody to rhodopsin (red). The overlay shows the localization of spam in the same region as rhodopsin (yellow) in the outer segment of the photoreceptor cell layer.

      Selection B- Gene function is consistent with phenotype.

      GOterm: GO:0001750 (cellular component of the photoreceptor outer segment)

      FunctionalEvidence: Immunofluorescent staining of mature porcine retina tissues with an antibody to the EYS protein shows subcellular localization to the outer segment specifically (Figure 2b). This region of the retina holds the light-absorbing, ciliated part of the photoreceptor cells, and localization / function in this region is consistent with the rod and cone photoreceptor dysfunction phenotypes found in the human patients.

      FunctionalHPO: Nyctalopia HP:0000662, Undetectable electroretinogram HP:0000550, Reduced visual acuity HP:0007663

    1. COH1 is differentially spliced in human brain

      TissueExpression/Uberon ID: UBERON:0002113, UBERON:0000955, UBERON:0001987, UBERON:0002108, UBERON:0002048

      ExpressionEvidence: Northern Blot analysis showed ubiquitous expression of COH1 transcripts in all tissues analyzed.

      Relative quantification and PCR-based fragment analysis revealed expression of the splicing variant (NM_152564.3 utilizing exon 28b) in most human tissues. Almost equal expression of both full-length transcript (NM_017890.3 utilizing exon 28) and splice variant was found for fetal and adult brain as well as adult retina.

      Where in paper: Results, under "COH1 is differentially spliced in human brain"

    2. COH1 is differentially spliced in human brain

      TissueExpression/Uberon ID: UBERON:0002113, UBERON:0000955, UBERON:0001987, UBERON:0002108, UBERON:0002048

      ExpressionEvidence: Northern Blot analysis showed ubiquitous expression of COH1 transcripts in all tissues analyzed.

      Relative quantification and PCR-based fragment analysis revealed expression of the splicing variant (NM_152564.3 utilizing exon 28b) in most human tissues. Almost equal expression of both full-length transcript (NM_017890.3 utilizing exon 28) and splice variant was found for fetal and adult brain as well as adult retina.

      Where in paper: Results, under "COH1 is differentially spliced in human brain"

    1. human mononuclear myoblasts

      CellLine: Human Mononuclear Myoblast

      CellEFO: CL:0000056

      GeneFunction: GO:0007015 (Actin Filament Organization)

      GeneAlteration: A wild-type C-terminal EGFP-tagged β-TM fusion gene was generated by amplifying TPM2 and cloning it into a vector while introducing XhoI and EcoRI restriction sites. All mutant constructs were formed by site-directed mutagenesis and cloning into E. coli. These constructs were sequenced to verify the correct coding sequence and introduction of the mutations. They were then introduced to human myoblast cells and mouse C2C12 cells via transfection.

      FunctionalEvidence: The expression of these TPM2 mutants in cultured cells demonstrated several morphological abnormalities reminiscent of those seen in nemaline myopathy patients. In the human myoblasts/differentiated cells, these included various types of aggregates including nuclear, cytoplasmic, endogenous, and perinuclear. Large accumulations of actin along with clouds around the nucleus and cytoplasm with unorganized structure were also present. Poor incorporation of stress fibers, what appeared to be disorganized sarcomeric structure, and rod-like structures both intranuclear and in the myotubes in particular all demonstrate clear similarities to those phenotypes seen in nemaline myopathy, namely the presence of nemaline rods, disorganized sarcomeres, and z-disc abnormalities. These two groups of pathologies also seem to share the same mechanism, specifically the TPM2 mutations destabilizing the actin-myosin structures and causing accumulation and abnormal structures to form. Similarly, the modified C2C12 myoblasts/myotubes also displayed peripheral and perinuclear aggregates in both stages of development as well as diffuse cytoplasmic labeling of stress fibers. They had difficulty differentiating, as they appeared to be fused rather than elongated and multinucleated. This further supports the connection between the gene disruption and the pathologies that are demonstrated here.

      CellVariant1: NM_003289.3:c.121G>A (p.Glu41Lys)

      ClinVar: 12464 http://www.ncbi.nlm.nih.gov/clinvar/variation/12464

      CellVariant2: NM_003289.3:c.142_144delAAG (p.Lys49del)

      ClinVar: 12466 https://www.ncbi.nlm.nih.gov/clinvar/variation/12466/

      CellVariant3: NM_003289.3:c.154_156dup (p.Gly52dup)

      ClinVar: 140485 https://www.ncbi.nlm.nih.gov/clinvar/variation/140485/

      CellVariant4: NM_003289.3:c.364G>A (p.Glu122Lys)

      CAID: CA373367963 http://reg.genome.network/redmine/projects/registry/genboree_registry/by_caid?caid=CA373367963

      CellVariant5: NM_003289.3:c.606C>G (p.Asn202Lys)

      ClinVar: 12467 https://www.ncbi.nlm.nih.gov/clinvar/variation/12467/

    2. human mononuclear myoblasts

      CellLine: Human Mononuclear Myoblast

      CellEFO: CL:0000056

      GeneFunction: GO:0007015 (Actin Filament Organization)

      GeneAlteration: A wild-type C-terminal EGFP-tagged β-TM fusion gene was generated by amplifying TPM2 and cloning it into a vector while introducing XhoI and EcoRI restriction sites. All mutant constructs were formed by site-directed mutagenesis and cloning into E. coli. These constructs were sequenced to verify the correct coding sequence and introduction of the mutations. They were then introduced to human myoblast cells and mouse C2C12 cells via transfection.

      FunctionalEvidence: The expression of these TPM2 mutants in cultured cells demonstrated several morphological abnormalities reminiscent of those seen in nemaline myopathy patients. In the human myoblasts/differentiated cells, these included various types of aggregates including nuclear, cytoplasmic, endogenous, and perinuclear. Large accumulations of actin along with clouds around the nucleus and cytoplasm with unorganized structure were also present. Poor incorporation of stress fibers, what appeared to be disorganized sarcomeric structure, and rod-like structures both intranuclear and in the myotubes in particular all demonstrate clear similarities to those phenotypes seen in nemaline myopathy, namely the presence of nemaline rods, disorganized sarcomeres, and z-disc abnormalities. These two groups of pathologies also seem to share the same mechanism, specifically the TPM2 mutations destabilizing the actin-myosin structures and causing accumulation and abnormal structures to form. Similarly, the modified C2C12 myoblasts/myotubes also displayed peripheral and perinuclear aggregates in both stages of development as well as diffuse cytoplasmic labeling of stress fibers. They had difficulty differentiating, as they appeared to be fused rather than elongated and multinucleated. This further supports the connection between the gene disruption and the pathologies that are demonstrated here.

      CellVariant1: NM_003289.3:c.121G>A (p.Glu41Lys)

      ClinVar: 12464 http://www.ncbi.nlm.nih.gov/clinvar/variation/12464

      CellVariant2: NM_003289.3:c.142_144delAAG (p.Lys49del)

      ClinVar: 12466 https://www.ncbi.nlm.nih.gov/clinvar/variation/12466/

      CellVariant3: NM_003289.3:c.154_156dup (p.Gly52dup)

      ClinVar: 140485 https://www.ncbi.nlm.nih.gov/clinvar/variation/140485/

      CellVariant4: NM_003289.3:c.364G>A (p.Glu122Lys)

      CAID: CA373367963 http://reg.genome.network/redmine/projects/registry/genboree_registry/by_caid?caid=CA373367963

      CellVariant5: NM_003289.3:c.606C>G (p.Asn202Lys)

      ClinVar: 12467 https://www.ncbi.nlm.nih.gov/clinvar/variation/12467/

    1. Figure 2

      PatientCell CL:0000057 (fibroblast)

      GeneFunction GO:0070131 (positive regulation of mitochondrial translation)

      GeneAlteration n/a

      FunctionalEvidence (Figure 2D) Labelling patient fibroblast proteins with EasyTag EXPRESS35S Protein Labeling Mix showed decreased assembly of complex I (NDUFB8) and IV (COXI) which corroborates the reduced mean enzyme activity and mitochondrial translation in Table 1.

      FAVariants NM_017819.3(TRMT10C):c.814A>G (p.Thr272Ala)

      ClinVar: 224317

      and

      NM_017819.3(TRMT10C):c.542G>T (p.Arg181Leu)

      ClinVar: 224316

    2. Figure 2

      PatientCell CL:0000057 (fibroblast)

      GeneFunction GO:0070131 (positive regulation of mitochondrial translation)

      GeneAlteration n/a

      FunctionalEvidence (Figure 2D) Labelling patient fibroblast proteins with EasyTag EXPRESS35S Protein Labeling Mix showed decreased assembly of complex I (NDUFB8) and IV (COXI) which corroborates the reduced mean enzyme activity and mitochondrial translation in Table 1.

      FAVariants NM_017819.3(TRMT10C):c.814A>G (p.Thr272Ala)

      ClinVar: 224317

      and

      NM_017819.3(TRMT10C):c.542G>T (p.Arg181Leu)

      ClinVar: 224316

  2. Sep 2026
    1. proband

      Case#: Two affected sisters/Female siblings/Progressive onset initially presenting as Stargardt disease

      DiseaseAssertion: ABCA4

      FamilyInfo: Large American family pedigree with two affected sisters. Both sisters were compound heterozygous for two novel ABCA4 variants. Unaffected relatives carried one variant or neither variant, supporting autosomal recessive inheritance.

      CasePresentingHPOs: HP:0000556, HP:0000572, HP:0007754, HP:0000648, HP:0000510, HP:0001133, HP:0000610

      CaseHPOFreeText: Proband initially showed phenotype compatible with Stargardt disease with progressive central vision loss. Over several years disease advanced into severe cone-rod dystrophy with worsening retinal degeneration, abnormal visual fields, and reduced electroretinography responses.

      CaseNotHPOs: n/a

      CaseNotHPOFreeText: Unaffected family members with only one mutation had no retinal disease phenotype.

      Genotyping Method: Genome-wide linkage analysis using 408 microsatellite markers followed by direct Sanger DNA sequencing of all ABCA4 exons and exon-intron boundaries. Segregation analysis performed in family members.

      PreviouslyPublished: No, both variants were novel at time of publication.

      Variant: ABCA4 (RefSeq: NM_000350.3): c.655A>T ; ABCA4 (RefSeq: NM_000350.3): c.5312+3A>T

      ClinVar: 632118

      CAID: n/a

      SupplementalData: Variants absent in 200 unrelated controls. Clinical testing included visual acuity, fundus examination, fluorescein angiography, visual field testing, and electroretinography. Compound heterozygous state associated with severe progressive phenotype.

  3. Apr 2026
    1. Build autonomous agents that plan, navigate apps, and complete tasks on your behalf, with native support for function calling.

      一个能在手机上离线运行的 2B 模型,原生支持 Function Calling 和多步 Agent 规划——这意味着完全本地化的 AI Agent 在消费级硬件上正式成为现实。结合 Android Studio 的 Agent Mode 支持,AI Agent 从云端走向终端的时间点,可能比所有人预计的都要早。

  4. Dec 2025
  5. Aug 2025
    1. harmonically this is pretty straightforward we're in the key of E minor right now and I've got the e natural minor scale loaded up on the accordion

      So excited to see aQWERTYon allows you to set to a key and a major/minor tonality, in this case E minor. This means the base note (bottom-left, Z) is E as the tonic of the E minor. This allows for both fixed do naming of actual notes (without needing to hear the nice music transposed) and at the same time analyze the music and chords FUNCTIONALLY (in the movable do sense). Truly the best of both worlds!

  6. Jul 2025
  7. Jun 2025
  8. May 2025
    1. The metaphors in the passage above are also familiar: RAIN IS AKNIFE that pierces drought. Although the content words that comprise themetaphors have changed a bit, the function words (italicized)—i.e., articles,prepositions, and conjunctions—have not changed through the centuries.184Function words establish the infrastructure of a sentence inside of which themain content words

      for - language - function and content words

  9. Feb 2025
    1. static void ondemand_readahead(struct readahead_control *ractl, struct folio *folio, unsigned long req_size) {

      Function uses heuristics to allocate readahead size when assumed/predicted to be sequential reads. However, mostly in trivial cases so may not be worth changing.

  10. Nov 2024
    1. Disease: Platelet-type Von-willebrand Disorder (PT-VWD)

      Patient: 17 yo, male, adopted

      Variant: GP1BA NM_000173.7: c:580C>T p.(P.Leu194Phe), Heterozygous, gain-of-function

      Phenotypes: moderate bleeding phenotype, ISTH-BAT bleeding score of 3, recurrent epistaxis, easy bruising, mild thrombocytopenia

      Family: Adopted, no other family history mentioned, segregation studies not performed.

      Genetic analysis performed: found variant in GP1BA, results obtained by sanger sequencing.

      Variant present in gnomAD(rs368111193): low allele frequency, contradictory classifications

      Variant is not present in ClinVar, LOVD, or HGMD databases

      According to this paper, ACMG guidelines classified this variant as a VUS.

      This paper entered it into Clinvar (var ID 1693270)

    1. #if defined(CONFIG_ARCH_HAS_PTE_DEVMAP) && defined(CONFIG_TRANSPARENT_HUGEPAGE) static int __gup_device_huge(unsigned long pfn, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { int nr_start = *nr; struct dev_pagemap *pgmap = NULL; do { struct page *page = pfn_to_page(pfn); pgmap = get_dev_pagemap(pfn, pgmap); if (unlikely(!pgmap)) { undo_dev_pagemap(nr, nr_start, flags, pages); break; } if (!(flags & FOLL_PCI_P2PDMA) && is_pci_p2pdma_page(page)) { undo_dev_pagemap(nr, nr_start, flags, pages); break; } SetPageReferenced(page); pages[*nr] = page; if (unlikely(try_grab_page(page, flags))) { undo_dev_pagemap(nr, nr_start, flags, pages); break; } (*nr)++; pfn++; } while (addr += PAGE_SIZE, addr != end); put_dev_pagemap(pgmap); return addr == end; } static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long fault_pfn; int nr_start = *nr; fault_pfn = pmd_pfn(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); if (!__gup_device_huge(fault_pfn, addr, end, flags, pages, nr)) return 0; if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) { undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } return 1; } static int __gup_device_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long fault_pfn; int nr_start = *nr; fault_pfn = pud_pfn(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); if (!__gup_device_huge(fault_pfn, addr, end, flags, pages, nr)) return 0; if (unlikely(pud_val(orig) != pud_val(*pudp))) { undo_dev_pagemap(nr, nr_start, flags, pages); return 0; } return 1; } #else static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { BUILD_BUG(); return 0; } static int __gup_device_huge_pud(pud_t pud, pud_t *pudp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { BUILD_BUG(); return 0; } #endif

      seems like a check to see if pages can be grabbed. A quick skim maybe hints possible checks if huge pages can be grabbed?

    2. #ifdef CONFIG_ARCH_HAS_HUGEPD static unsigned long hugepte_addr_end(unsigned long addr, unsigned long end, unsigned long sz) { unsigned long __boundary = (addr + sz) & ~(sz-1); return (__boundary - 1 < end - 1) ? __boundary : end; } static int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long pte_end; struct page *page; struct folio *folio; pte_t pte; int refs; pte_end = (addr + sz) & ~(sz-1); if (pte_end < end) end = pte_end; pte = huge_ptep_get(ptep); if (!pte_access_permitted(pte, flags & FOLL_WRITE)) return 0; /* hugepages are never "special" */ VM_BUG_ON(!pfn_valid(pte_pfn(pte))); page = nth_page(pte_page(pte), (addr & (sz - 1)) >> PAGE_SHIFT); refs = record_subpages(page, addr, end, pages + *nr); folio = try_grab_folio(page, refs, flags); if (!folio) return 0; if (unlikely(pte_val(pte) != pte_val(ptep_get(ptep)))) { gup_put_folio(folio, refs, flags); return 0; } if (!folio_fast_pin_allowed(folio, flags)) { gup_put_folio(folio, refs, flags); return 0; } if (!pte_write(pte) && gup_must_unshare(NULL, flags, &folio->page)) { gup_put_folio(folio, refs, flags); return 0; } *nr += refs; folio_set_referenced(folio); return 1; } static int gup_huge_pd(hugepd_t hugepd, unsigned long addr, unsigned int pdshift, unsigned long end, unsigned int flags, struct page **pages, int *nr) { pte_t *ptep; unsigned long sz = 1UL << hugepd_shift(hugepd); unsigned long next; ptep = hugepte_offset(hugepd, addr, pdshift); do { next = hugepte_addr_end(addr, end, sz); if (!gup_hugepte(ptep, sz, addr, end, flags, pages, nr)) return 0; } while (ptep++, addr = next, addr != end); return 1; } #else static inline int gup_huge_pd(hugepd_t hugepd, unsigned long addr, unsigned int pdshift, unsigned long end, unsigned int flags, struct page **pages, int *nr) { return 0; } #endif /* CONFIG_ARCH_HAS_HUGEPD */ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { struct page *page; struct folio *folio; int refs; if (!pmd_access_permitted(orig, flags & FOLL_WRITE)) return 0; if (pmd_devmap(orig)) { if (unlikely(flags & FOLL_LONGTERM)) return 0; return __gup_device_huge_pmd(orig, pmdp, addr, end, flags, pages, nr); } page = nth_page(pmd_page(orig), (addr & ~PMD_MASK) >> PAGE_SHIFT); refs = record_subpages(page, addr, end, pages + *nr); folio = try_grab_folio(page, refs, flags); if (!folio) return 0; if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) { gup_put_folio(folio, refs, flags); return 0; } if (!folio_fast_pin_allowed(folio, flags)) { gup_put_folio(folio, refs, flags); return 0; } if (!pmd_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) { gup_put_folio(folio, refs, flags); return 0; } *nr += refs; folio_set_referenced(folio); return 1; } static int gup_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { struct page *page; struct folio *folio; int refs; if (!pud_access_permitted(orig, flags & FOLL_WRITE)) return 0; if (pud_devmap(orig)) { if (unlikely(flags & FOLL_LONGTERM)) return 0; return __gup_device_huge_pud(orig, pudp, addr, end, flags, pages, nr); } page = nth_page(pud_page(orig), (addr & ~PUD_MASK) >> PAGE_SHIFT); refs = record_subpages(page, addr, end, pages + *nr); folio = try_grab_folio(page, refs, flags); if (!folio) return 0; if (unlikely(pud_val(orig) != pud_val(*pudp))) { gup_put_folio(folio, refs, flags); return 0; } if (!folio_fast_pin_allowed(folio, flags)) { gup_put_folio(folio, refs, flags); return 0; } if (!pud_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) { gup_put_folio(folio, refs, flags); return 0; } *nr += refs; folio_set_referenced(folio); return 1; } static int gup_huge_pgd(pgd_t orig, pgd_t *pgdp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { int refs; struct page *page; struct folio *folio; if (!pgd_access_permitted(orig, flags & FOLL_WRITE)) return 0; BUILD_BUG_ON(pgd_devmap(orig)); page = nth_page(pgd_page(orig), (addr & ~PGDIR_MASK) >> PAGE_SHIFT); refs = record_subpages(page, addr, end, pages + *nr); folio = try_grab_folio(page, refs, flags); if (!folio) return 0; if (unlikely(pgd_val(orig) != pgd_val(*pgdp))) { gup_put_folio(folio, refs, flags); return 0; } if (!pgd_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) { gup_put_folio(folio, refs, flags); return 0; } if (!folio_fast_pin_allowed(folio, flags)) { gup_put_folio(folio, refs, flags); return 0; } *nr += refs; folio_set_referenced(folio); return 1; } static int gup_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long next; pmd_t *pmdp; pmdp = pmd_offset_lockless(pudp, pud, addr); do { pmd_t pmd = pmdp_get_lockless(pmdp); next = pmd_addr_end(addr, end); if (!pmd_present(pmd)) return 0; if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd) || pmd_devmap(pmd))) { /* See gup_pte_range() */ if (pmd_protnone(pmd)) return 0; if (!gup_huge_pmd(pmd, pmdp, addr, next, flags, pages, nr)) return 0; } else if (unlikely(is_hugepd(__hugepd(pmd_val(pmd))))) { /* * architecture have different format for hugetlbfs * pmd format and THP pmd format */ if (!gup_huge_pd(__hugepd(pmd_val(pmd)), addr, PMD_SHIFT, next, flags, pages, nr)) return 0; } else if (!gup_pte_range(pmd, pmdp, addr, next, flags, pages, nr)) return 0; } while (pmdp++, addr = next, addr != end); return 1; } static int gup_pud_range(p4d_t *p4dp, p4d_t p4d, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long next; pud_t *pudp; pudp = pud_offset_lockless(p4dp, p4d, addr); do { pud_t pud = READ_ONCE(*pudp); next = pud_addr_end(addr, end); if (unlikely(!pud_present(pud))) return 0; if (unlikely(pud_huge(pud) || pud_devmap(pud))) { if (!gup_huge_pud(pud, pudp, addr, next, flags, pages, nr)) return 0; } else if (unlikely(is_hugepd(__hugepd(pud_val(pud))))) { if (!gup_huge_pd(__hugepd(pud_val(pud)), addr, PUD_SHIFT, next, flags, pages, nr)) return 0; } else if (!gup_pmd_range(pudp, pud, addr, next, flags, pages, nr)) return 0; } while (pudp++, addr = next, addr != end); return 1; } static int gup_p4d_range(pgd_t *pgdp, pgd_t pgd, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long next; p4d_t *p4dp; p4dp = p4d_offset_lockless(pgdp, pgd, addr); do { p4d_t p4d = READ_ONCE(*p4dp); next = p4d_addr_end(addr, end); if (p4d_none(p4d)) return 0; BUILD_BUG_ON(p4d_huge(p4d)); if (unlikely(is_hugepd(__hugepd(p4d_val(p4d))))) { if (!gup_huge_pd(__hugepd(p4d_val(p4d)), addr, P4D_SHIFT, next, flags, pages, nr)) return 0; } else if (!gup_pud_range(p4dp, p4d, addr, next, flags, pages, nr)) return 0; } while (p4dp++, addr = next, addr != end); return 1; } static void gup_pgd_range(unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { unsigned long next; pgd_t *pgdp; pgdp = pgd_offset(current->mm, addr); do { pgd_t pgd = READ_ONCE(*pgdp); next = pgd_addr_end(addr, end); if (pgd_none(pgd)) return; if (unlikely(pgd_huge(pgd))) { if (!gup_huge_pgd(pgd, pgdp, addr, next, flags, pages, nr)) return; } else if (unlikely(is_hugepd(__hugepd(pgd_val(pgd))))) { if (!gup_huge_pd(__hugepd(pgd_val(pgd)), addr, PGDIR_SHIFT, next, flags, pages, nr)) return; } else if (!gup_p4d_range(pgdp, pgd, addr, next, flags, pages, nr)) return; } while (pgdp++, addr = next, addr != end); } #else static inline void gup_pgd_range(unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { }

      policy use functions for gup_huge pte policy code function above (not right above, gotta scroll probably to find it)

    3. static int internal_get_user_pages_fast(unsigned long start, unsigned long nr_pages, unsigned int gup_flags, struct page **pages) { unsigned long len, end; unsigned long nr_pinned; int locked = 0; int ret; if (WARN_ON_ONCE(gup_flags & ~(FOLL_WRITE | FOLL_LONGTERM | FOLL_FORCE | FOLL_PIN | FOLL_GET | FOLL_FAST_ONLY | FOLL_NOFAULT | FOLL_PCI_P2PDMA | FOLL_HONOR_NUMA_FAULT))) return -EINVAL; if (gup_flags & FOLL_PIN) mm_set_has_pinned_flag(&current->mm->flags); if (!(gup_flags & FOLL_FAST_ONLY)) might_lock_read(&current->mm->mmap_lock); start = untagged_addr(start) & PAGE_MASK; len = nr_pages << PAGE_SHIFT; if (check_add_overflow(start, len, &end)) return -EOVERFLOW; if (end > TASK_SIZE_MAX) return -EFAULT; if (unlikely(!access_ok((void __user *)start, len))) return -EFAULT; nr_pinned = lockless_pages_from_mm(start, end, gup_flags, pages); if (nr_pinned == nr_pages || gup_flags & FOLL_FAST_ONLY) return nr_pinned; /* Slow path: try to get the remaining pages with get_user_pages */ start += nr_pinned << PAGE_SHIFT; pages += nr_pinned; ret = __gup_longterm_locked(current->mm, start, nr_pages - nr_pinned, pages, &locked, gup_flags | FOLL_TOUCH | FOLL_UNLOCKABLE); if (ret < 0) { /* * The caller has to unpin the pages we already pinned so * returning -errno is not an option */ if (nr_pinned) return nr_pinned; return ret; } return ret + nr_pinned; } /** * get_user_pages_fast_only() - pin user pages in memory * @start: starting user address * @nr_pages: number of pages from start to pin * @gup_flags: flags modifying pin behaviour * @pages: array that receives pointers to the pages pinned. * Should be at least nr_pages long. * * Like get_user_pages_fast() except it's IRQ-safe in that it won't fall back to * the regular GUP. * * If the architecture does not support this function, simply return with no * pages pinned. * * Careful, careful! COW breaking can go either way, so a non-write * access can get ambiguous page results. If you call this function without * 'write' set, you'd better be sure that you're ok with that ambiguity. */ int get_user_pages_fast_only(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages) { /* * Internally (within mm/gup.c), gup fast variants must set FOLL_GET, * because gup fast is always a "pin with a +1 page refcount" request. * * FOLL_FAST_ONLY is required in order to match the API description of * this routine: no fall back to regular ("slow") GUP. */ if (!is_valid_gup_args(pages, NULL, &gup_flags, FOLL_GET | FOLL_FAST_ONLY)) return -EINVAL; return internal_get_user_pages_fast(start, nr_pages, gup_flags, pages); } EXPORT_SYMBOL_GPL(get_user_pages_fast_only); /** * get_user_pages_fast() - pin user pages in memory * @start: starting user address * @nr_pages: number of pages from start to pin * @gup_flags: flags modifying pin behaviour * @pages: array that receives pointers to the pages pinned. * Should be at least nr_pages long. * * Attempt to pin user pages in memory without taking mm->mmap_lock. * If not successful, it will fall back to taking the lock and * calling get_user_pages(). * * Returns number of pages pinned. This may be fewer than the number requested. * If nr_pages is 0 or negative, returns 0. If no pages were pinned, returns * -errno. */ int get_user_pages_fast(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages) { /* * The caller may or may not have explicitly set FOLL_GET; either way is * OK. However, internally (within mm/gup.c), gup fast variants must set * FOLL_GET, because gup fast is always a "pin with a +1 page refcount" * request. */ if (!is_valid_gup_args(pages, NULL, &gup_flags, FOLL_GET)) return -EINVAL; return internal_get_user_pages_fast(start, nr_pages, gup_flags, pages); } EXPORT_SYMBOL_GPL(get_user_pages_fast); /** * pin_user_pages_fast() - pin user pages in memory without taking locks * * @start: starting user address * @nr_pages: number of pages from start to pin * @gup_flags: flags modifying pin behaviour * @pages: array that receives pointers to the pages pinned. * Should be at least nr_pages long. * * Nearly the same as get_user_pages_fast(), except that FOLL_PIN is set. See * get_user_pages_fast() for documentation on the function arguments, because * the arguments here are identical. * * FOLL_PIN means that the pages must be released via unpin_user_page(). Please * see Documentation/core-api/pin_user_pages.rst for further details. * * Note that if a zero_page is amongst the returned pages, it will not have * pins in it and unpin_user_page() will not remove pins from it. */ int pin_user_pages_fast(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages) { if (!is_valid_gup_args(pages, NULL, &gup_flags, FOLL_PIN)) return -EINVAL; return internal_get_user_pages_fast(start, nr_pages, gup_flags, pages); } EXPORT_SYMBOL_GPL(pin_user_pages_fast); /** * pin_user_pages_remote() - pin pages of a remote process * * @mm: mm_struct of target mm * @start: starting user address * @nr_pages: number of pages from start to pin * @gup_flags: flags modifying lookup behaviour * @pages: array that receives pointers to the pages pinned. * Should be at least nr_pages long. * @locked: pointer to lock flag indicating whether lock is held and * subsequently whether VM_FAULT_RETRY functionality can be * utilised. Lock must initially be held. * * Nearly the same as get_user_pages_remote(), except that FOLL_PIN is set. See * get_user_pages_remote() for documentation on the function arguments, because * the arguments here are identical. * * FOLL_PIN means that the pages must be released via unpin_user_page(). Please * see Documentation/core-api/pin_user_pages.rst for details. * * Note that if a zero_page is amongst the returned pages, it will not have * pins in it and unpin_user_page*() will not remove pins from it. */ long pin_user_pages_remote(struct mm_struct *mm, unsigned long start, unsigned long nr_pages, unsigned int gup_flags, struct page **pages, int *locked) { int local_locked = 1; if (!is_valid_gup_args(pages, locked, &gup_flags, FOLL_PIN | FOLL_TOUCH | FOLL_REMOTE)) return 0; return __gup_longterm_locked(mm, start, nr_pages, pages, locked ? locked : &local_locked, gup_flags); } EXPORT_SYMBOL(pin_user_pages_remote); /** * pin_user_pages() - pin user pages in memory for use by other devices * * @start: starting user address * @nr_pages: number of pages from start to pin * @gup_flags: flags modifying lookup behaviour * @pages: array that receives pointers to the pages pinned. * Should be at least nr_pages long. * * Nearly the same as get_user_pages(), except that FOLL_TOUCH is not set, and * FOLL_PIN is set. * * FOLL_PIN means that the pages must be released via unpin_user_page(). Please * see Documentation/core-api/pin_user_pages.rst for details. * * Note that if a zero_page is amongst the returned pages, it will not have * pins in it and unpin_user_page*() will not remove pins from it. */ long pin_user_pages(unsigned long start, unsigned long nr_pages, unsigned int gup_flags, struct page **pages) { int locked = 1; if (!is_valid_gup_args(pages, NULL, &gup_flags, FOLL_PIN)) return 0; return __gup_longterm_locked(current->mm, start, nr_pages, pages, &locked, gup_flags); } EXPORT_SYMBOL(pin_user_pages); /* * pin_user_pages_unlocked() is the FOLL_PIN variant of * get_user_pages_unlocked(). Behavior is the same, except that this one sets * FOLL_PIN and rejects FOLL_GET. * * Note that if a zero_page is amongst the returned pages, it will not have * pins in it and unpin_user_page*() will not remove pins from it. */ long pin_user_pages_unlocked(unsigned long start, unsigned long nr_pages, struct page **pages, unsigned int gup_flags) { int locked = 0; if (!is_valid_gup_args(pages, NULL, &gup_flags, FOLL_PIN | FOLL_TOUCH | FOLL_UNLOCKABLE)) return 0; return __gup_longterm_locked(current->mm, start, nr_pages, pages, &locked, gup_flags); }

      fast gup functions

    4. /** * unpin_user_pages() - release an array of gup-pinned pages. * @pages: array of pages to be marked dirty and released. * @npages: number of pages in the @pages array. * * For each page in the @pages array, release the page using unpin_user_page(). * * Please see the unpin_user_page() documentation for details. */ void unpin_user_pages(struct page **pages, unsigned long npages) { unsigned long i; struct folio *folio; unsigned int nr; /* * If this WARN_ON() fires, then the system *might* be leaking pages (by * leaving them pinned), but probably not. More likely, gup/pup returned * a hard -ERRNO error to the caller, who erroneously passed it here. */ if (WARN_ON(IS_ERR_VALUE(npages))) return; sanity_check_pinned_pages(pages, npages); for (i = 0; i < npages; i += nr) { folio = gup_folio_next(pages, npages, i, &nr); gup_put_folio(folio, nr, FOLL_PIN); } }

      gup unpin function, not actual logic

    5. void unpin_user_page_range_dirty_lock(struct page *page, unsigned long npages, bool make_dirty) { unsigned long i; struct folio *folio; unsigned int nr; for (i = 0; i < npages; i += nr) { folio = gup_folio_range_next(page, npages, i, &nr); if (make_dirty && !folio_test_dirty(folio)) { folio_lock(folio); folio_mark_dirty(folio); folio_unlock(folio); } gup_put_folio(folio, nr, FOLL_PIN); } }

      unpin logic but for dirty pages

    6. #ifdef CONFIG_ARCH_HAS_PTE_SPECIAL /* * Fast-gup relies on pte change detection to avoid concurrent pgtable * operations. * * To pin the page, fast-gup needs to do below in order: * (1) pin the page (by prefetching pte), then (2) check pte not changed. * * For the rest of pgtable operations where pgtable updates can be racy * with fast-gup, we need to do (1) clear pte, then (2) check whether page * is pinned. * * Above will work for all pte-level operations, including THP split. * * For THP collapse, it's a bit more complicated because fast-gup may be * walking a pgtable page that is being freed (pte is still valid but pmd * can be cleared already). To avoid race in such condition, we need to * also check pmd here to make sure pmd doesn't change (corresponds to * pmdp_collapse_flush() in the THP collapse code path). */ static int gup_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { struct dev_pagemap *pgmap = NULL; int nr_start = *nr, ret = 0; pte_t *ptep, *ptem; ptem = ptep = pte_offset_map(&pmd, addr); if (!ptep) return 0; do { pte_t pte = ptep_get_lockless(ptep); struct page *page; struct folio *folio; /* * Always fallback to ordinary GUP on PROT_NONE-mapped pages: * pte_access_permitted() better should reject these pages * either way: otherwise, GUP-fast might succeed in * cases where ordinary GUP would fail due to VMA access * permissions. */ if (pte_protnone(pte)) goto pte_unmap; if (!pte_access_permitted(pte, flags & FOLL_WRITE)) goto pte_unmap; if (pte_devmap(pte)) { if (unlikely(flags & FOLL_LONGTERM)) goto pte_unmap; pgmap = get_dev_pagemap(pte_pfn(pte), pgmap); if (unlikely(!pgmap)) { undo_dev_pagemap(nr, nr_start, flags, pages); goto pte_unmap; } } else if (pte_special(pte)) goto pte_unmap; VM_BUG_ON(!pfn_valid(pte_pfn(pte))); page = pte_page(pte); folio = try_grab_folio(page, 1, flags); if (!folio) goto pte_unmap; if (unlikely(folio_is_secretmem(folio))) { gup_put_folio(folio, 1, flags); goto pte_unmap; } if (unlikely(pmd_val(pmd) != pmd_val(*pmdp)) || unlikely(pte_val(pte) != pte_val(ptep_get(ptep)))) { gup_put_folio(folio, 1, flags); goto pte_unmap; } if (!folio_fast_pin_allowed(folio, flags)) { gup_put_folio(folio, 1, flags); goto pte_unmap; } if (!pte_write(pte) && gup_must_unshare(NULL, flags, page)) { gup_put_folio(folio, 1, flags); goto pte_unmap; } /* * We need to make the page accessible if and only if we are * going to access its content (the FOLL_PIN case). Please * see Documentation/core-api/pin_user_pages.rst for * details. */ if (flags & FOLL_PIN) { ret = arch_make_page_accessible(page); if (ret) { gup_put_folio(folio, 1, flags); goto pte_unmap; } } folio_set_referenced(folio); pages[*nr] = page; (*nr)++; } while (ptep++, addr += PAGE_SIZE, addr != end); ret = 1; pte_unmap: if (pgmap) put_dev_pagemap(pgmap); pte_unmap(ptem); return ret; } #else /* * If we can't determine whether or not a pte is special, then fail immediately * for ptes. Note, we can still pin HugeTLB and THP as these are guaranteed not * to be special. * * For a futex to be placed on a THP tail page, get_futex_key requires a * get_user_pages_fast_only implementation that can pin pages. Thus it's still * useful to have gup_huge_pmd even if we can't operate on ptes. */ static int gup_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr, unsigned long end, unsigned int flags, struct page **pages, int *nr) { return 0; } #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */

      non concurrent fast gup approach that checks for pinned page and unmaps pte or clears it

    7. #ifdef CONFIG_HAVE_FAST_GUP /* * Used in the GUP-fast path to determine whether a pin is permitted for a * specific folio. * * This call assumes the caller has pinned the folio, that the lowest page table * level still points to this folio, and that interrupts have been disabled. * * Writing to pinned file-backed dirty tracked folios is inherently problematic * (see comment describing the writable_file_mapping_allowed() function). We * therefore try to avoid the most egregious case of a long-term mapping doing * so. * * This function cannot be as thorough as that one as the VMA is not available * in the fast path, so instead we whitelist known good cases and if in doubt, * fall back to the slow path. */ static bool folio_fast_pin_allowed(struct folio *folio, unsigned int flags) { struct address_space *mapping; unsigned long mapping_flags; /* * If we aren't pinning then no problematic write can occur. A long term * pin is the most egregious case so this is the one we disallow. */ if ((flags & (FOLL_PIN | FOLL_LONGTERM | FOLL_WRITE)) != (FOLL_PIN | FOLL_LONGTERM | FOLL_WRITE)) return true; /* The folio is pinned, so we can safely access folio fields. */ if (WARN_ON_ONCE(folio_test_slab(folio))) return false; /* hugetlb mappings do not require dirty-tracking. */ if (folio_test_hugetlb(folio)) return true; /* * GUP-fast disables IRQs. When IRQS are disabled, RCU grace periods * cannot proceed, which means no actions performed under RCU can * proceed either. * * inodes and thus their mappings are freed under RCU, which means the * mapping cannot be freed beneath us and thus we can safely dereference * it. */ lockdep_assert_irqs_disabled(); /* * However, there may be operations which _alter_ the mapping, so ensure * we read it once and only once. */ mapping = READ_ONCE(folio->mapping); /* * The mapping may have been truncated, in any case we cannot determine * if this mapping is safe - fall back to slow path to determine how to * proceed. */ if (!mapping) return false; /* Anonymous folios pose no problem. */ mapping_flags = (unsigned long)mapping & PAGE_MAPPING_FLAGS; if (mapping_flags) return mapping_flags & PAGE_MAPPING_ANON; /* * At this point, we know the mapping is non-null and points to an * address_space object. The only remaining whitelisted file system is * shmem. */ return shmem_mapping(mapping); }

      policy logic. avoids locks unlike get user pages unlocked/locked which seems risky so its not supposed to be used on concurrent gup logic

    8. #ifdef CONFIG_MIGRATION /* * Returns the number of collected pages. Return value is always >= 0. */ static unsigned long collect_longterm_unpinnable_pages( struct list_head *movable_page_list, unsigned long nr_pages, struct page **pages) { unsigned long i, collected = 0; struct folio *prev_folio = NULL; bool drain_allow = true; for (i = 0; i < nr_pages; i++) { struct folio *folio = page_folio(pages[i]); if (folio == prev_folio) continue; prev_folio = folio; if (folio_is_longterm_pinnable(folio)) continue; collected++; if (folio_is_device_coherent(folio)) continue; if (folio_test_hugetlb(folio)) { isolate_hugetlb(folio, movable_page_list); continue; } if (!folio_test_lru(folio) && drain_allow) { lru_add_drain_all(); drain_allow = false; } if (!folio_isolate_lru(folio)) continue; list_add_tail(&folio->lru, movable_page_list); node_stat_mod_folio(folio, NR_ISOLATED_ANON + folio_is_file_lru(folio), folio_nr_pages(folio)); } return collected; }
    9. int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) { struct mm_struct *mm = current->mm; unsigned long end, nstart, nend; struct vm_area_struct *vma = NULL; int locked = 0; long ret = 0; end = start + len; for (nstart = start; nstart < end; nstart = nend) { /* * We want to fault in pages for [nstart; end) address range. * Find first corresponding VMA. */ if (!locked) { locked = 1; mmap_read_lock(mm); vma = find_vma_intersection(mm, nstart, end); } else if (nstart >= vma->vm_end) vma = find_vma_intersection(mm, vma->vm_end, end); if (!vma) break; /* * Set [nstart; nend) to intersection of desired address * range with the first VMA. Also, skip undesirable VMA types. */ nend = min(end, vma->vm_end); if (vma->vm_flags & (VM_IO | VM_PFNMAP)) continue; if (nstart < vma->vm_start) nstart = vma->vm_start; /* * Now fault in a range of pages. populate_vma_page_range() * double checks the vma flags, so that it won't mlock pages * if the vma was already munlocked. */ ret = populate_vma_page_range(vma, nstart, nend, &locked); if (ret < 0) { if (ignore_errors) { ret = 0; continue; /* continue at next VMA */ } break; } nend = nstart + ret * PAGE_SIZE; ret = 0; } if (locked) mmap_read_unlock(mm); return ret; /* 0 or negative error code */ }

      policy use function that populates pages like the func before this.

    10. long populate_vma_page_range(struct vm_area_struct *vma, unsigned long start, unsigned long end, int *locked) { struct mm_struct *mm = vma->vm_mm; unsigned long nr_pages = (end - start) / PAGE_SIZE; int local_locked = 1; int gup_flags; long ret; VM_BUG_ON(!PAGE_ALIGNED(start)); VM_BUG_ON(!PAGE_ALIGNED(end)); VM_BUG_ON_VMA(start < vma->vm_start, vma); VM_BUG_ON_VMA(end > vma->vm_end, vma); mmap_assert_locked(mm); /* * Rightly or wrongly, the VM_LOCKONFAULT case has never used * faultin_page() to break COW, so it has no work to do here. */ if (vma->vm_flags & VM_LOCKONFAULT) return nr_pages; gup_flags = FOLL_TOUCH; /* * We want to touch writable mappings with a write fault in order * to break COW, except for shared mappings because these don't COW * and we would not want to dirty them for nothing. */ if ((vma->vm_flags & (VM_WRITE | VM_SHARED)) == VM_WRITE) gup_flags |= FOLL_WRITE; /* * We want mlock to succeed for regions that have any permissions * other than PROT_NONE. */ if (vma_is_accessible(vma)) gup_flags |= FOLL_FORCE; if (locked) gup_flags |= FOLL_UNLOCKABLE; /* * We made sure addr is within a VMA, so the following will * not result in a stack expansion that recurses back here. */ ret = __get_user_pages(mm, start, nr_pages, gup_flags, NULL, locked ? locked : &local_locked); lru_add_drain(); return ret; }

      policy use code.

    11. long get_user_pages_remote(struct mm_struct *mm, unsigned long start, unsigned long nr_pages, unsigned int gup_flags, struct page **pages, int *locked) { int local_locked = 1; if (!is_valid_gup_args(pages, locked, &gup_flags, FOLL_TOUCH | FOLL_REMOTE)) return -EINVAL; return __get_user_pages_locked(mm, start, nr_pages, pages, locked ? locked : &local_locked, gup_flags); }

      policy logic

    12. static __always_inline long __get_user_pages_locked(struct mm_struct *mm, unsigned long start, unsigned long nr_pages, struct page **pages, int *locked, unsigned int flags) { long ret, pages_done; bool must_unlock = false; /* * The internal caller expects GUP to manage the lock internally and the * lock must be released when this returns. */ if (!*locked) { if (mmap_read_lock_killable(mm)) return -EAGAIN; must_unlock = true; *locked = 1; } else mmap_assert_locked(mm); if (flags & FOLL_PIN) mm_set_has_pinned_flag(&mm->flags); /* * FOLL_PIN and FOLL_GET are mutually exclusive. Traditional behavior * is to set FOLL_GET if the caller wants pages[] filled in (but has * carelessly failed to specify FOLL_GET), so keep doing that, but only * for FOLL_GET, not for the newer FOLL_PIN. * * FOLL_PIN always expects pages to be non-null, but no need to assert * that here, as any failures will be obvious enough. */ if (pages && !(flags & FOLL_PIN)) flags |= FOLL_GET; pages_done = 0; for (;;) { ret = __get_user_pages(mm, start, nr_pages, flags, pages, locked); if (!(flags & FOLL_UNLOCKABLE)) { /* VM_FAULT_RETRY couldn't trigger, bypass */ pages_done = ret; break; } /* VM_FAULT_RETRY or VM_FAULT_COMPLETED cannot return errors */ if (!*locked) { BUG_ON(ret < 0); BUG_ON(ret >= nr_pages); } if (ret > 0) { nr_pages -= ret; pages_done += ret; if (!nr_pages) break; } if (*locked) { /* * VM_FAULT_RETRY didn't trigger or it was a * FOLL_NOWAIT. */ if (!pages_done) pages_done = ret; break; } /* * VM_FAULT_RETRY triggered, so seek to the faulting offset. * For the prefault case (!pages) we only update counts. */ if (likely(pages)) pages += ret; start += ret << PAGE_SHIFT; /* The lock was temporarily dropped, so we must unlock later */ must_unlock = true; retry: /* * Repeat on the address that fired VM_FAULT_RETRY * with both FAULT_FLAG_ALLOW_RETRY and * FAULT_FLAG_TRIED. Note that GUP can be interrupted * by fatal signals of even common signals, depending on * the caller's request. So we need to check it before we * start trying again otherwise it can loop forever. */ if (gup_signal_pending(flags)) { if (!pages_done) pages_done = -EINTR; break; } ret = mmap_read_lock_killable(mm); if (ret) { BUG_ON(ret > 0); if (!pages_done) pages_done = ret; break; } *locked = 1; ret = __get_user_pages(mm, start, 1, flags | FOLL_TRIED, pages, locked); if (!*locked) { /* Continue to retry until we succeeded */ BUG_ON(ret != 0); goto retry; } if (ret != 1) { BUG_ON(ret > 1); if (!pages_done) pages_done = ret; break; } nr_pages--; pages_done++; if (!nr_pages) break; if (likely(pages)) pages++; start += PAGE_SIZE; } if (must_unlock && *locked) { /* * We either temporarily dropped the lock, or the caller * requested that we both acquire and drop the lock. Either way, * we must now unlock, and notify the caller of that state. */ mmap_read_unlock(mm); *locked = 0; } return pages_done; }

      same as gup but sets/unsets mmap_lock

    13. int fixup_user_fault(struct mm_struct *mm, unsigned long address, unsigned int fault_flags, bool *unlocked) { struct vm_area_struct *vma; vm_fault_t ret; address = untagged_addr_remote(mm, address); if (unlocked) fault_flags |= FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; retry: vma = gup_vma_lookup(mm, address); if (!vma) return -EFAULT; if (!vma_permits_fault(vma, fault_flags)) return -EFAULT; if ((fault_flags & FAULT_FLAG_KILLABLE) && fatal_signal_pending(current)) return -EINTR; ret = handle_mm_fault(vma, address, fault_flags, NULL); if (ret & VM_FAULT_COMPLETED) { /* * NOTE: it's a pity that we need to retake the lock here * to pair with the unlock() in the callers. Ideally we * could tell the callers so they do not need to unlock. */ mmap_read_lock(mm); *unlocked = true; return 0; } if (ret & VM_FAULT_ERROR) { int err = vm_fault_to_errno(ret, 0); if (err) return err; BUG(); } if (ret & VM_FAULT_RETRY) { mmap_read_lock(mm); *unlocked = true; fault_flags |= FAULT_FLAG_TRIED; goto retry; } return 0; }

      resolves user page fault. policy logic

    14. static long __get_user_pages(struct mm_struct *mm, unsigned long start, unsigned long nr_pages, unsigned int gup_flags, struct page **pages, int *locked) { long ret = 0, i = 0; struct vm_area_struct *vma = NULL; struct follow_page_context ctx = { NULL }; if (!nr_pages) return 0; start = untagged_addr_remote(mm, start); VM_BUG_ON(!!pages != !!(gup_flags & (FOLL_GET | FOLL_PIN))); do { struct page *page; unsigned int foll_flags = gup_flags; unsigned int page_increm; /* first iteration or cross vma bound */ if (!vma || start >= vma->vm_end) { /* * MADV_POPULATE_(READ|WRITE) wants to handle VMA * lookups+error reporting differently. */ if (gup_flags & FOLL_MADV_POPULATE) { vma = vma_lookup(mm, start); if (!vma) { ret = -ENOMEM; goto out; } if (check_vma_flags(vma, gup_flags)) { ret = -EINVAL; goto out; } goto retry; } vma = gup_vma_lookup(mm, start); if (!vma && in_gate_area(mm, start)) { ret = get_gate_page(mm, start & PAGE_MASK, gup_flags, &vma, pages ? &page : NULL); if (ret) goto out; ctx.page_mask = 0; goto next_page; } if (!vma) { ret = -EFAULT; goto out; } ret = check_vma_flags(vma, gup_flags); if (ret) goto out; } retry: /* * If we have a pending SIGKILL, don't keep faulting pages and * potentially allocating memory. */ if (fatal_signal_pending(current)) { ret = -EINTR; goto out; } cond_resched(); page = follow_page_mask(vma, start, foll_flags, &ctx); if (!page || PTR_ERR(page) == -EMLINK) { ret = faultin_page(vma, start, &foll_flags, PTR_ERR(page) == -EMLINK, locked); switch (ret) { case 0: goto retry; case -EBUSY: case -EAGAIN: ret = 0; fallthrough; case -EFAULT: case -ENOMEM: case -EHWPOISON: goto out; } BUG(); } else if (PTR_ERR(page) == -EEXIST) { /* * Proper page table entry exists, but no corresponding * struct page. If the caller expects **pages to be * filled in, bail out now, because that can't be done * for this page. */ if (pages) { ret = PTR_ERR(page); goto out; } } else if (IS_ERR(page)) { ret = PTR_ERR(page); goto out; } next_page: page_increm = 1 + (~(start >> PAGE_SHIFT) & ctx.page_mask); if (page_increm > nr_pages) page_increm = nr_pages; if (pages) { struct page *subpage; unsigned int j; /* * This must be a large folio (and doesn't need to * be the whole folio; it can be part of it), do * the refcount work for all the subpages too. * * NOTE: here the page may not be the head page * e.g. when start addr is not thp-size aligned. * try_grab_folio() should have taken care of tail * pages. */ if (page_increm > 1) { struct folio *folio; /* * Since we already hold refcount on the * large folio, this should never fail. */ folio = try_grab_folio(page, page_increm - 1, foll_flags); if (WARN_ON_ONCE(!folio)) { /* * Release the 1st page ref if the * folio is problematic, fail hard. */ gup_put_folio(page_folio(page), 1, foll_flags); ret = -EFAULT; goto out; } } for (j = 0; j < page_increm; j++) { subpage = nth_page(page, j); pages[i + j] = subpage; flush_anon_page(vma, subpage, start + j * PAGE_SIZE); flush_dcache_page(subpage); } } i += page_increm; start += page_increm * PAGE_SIZE; nr_pages -= page_increm; } while (nr_pages); out: if (ctx.pgmap) put_dev_pagemap(ctx.pgmap); return i ? i : ret; }

      Literally the actual policy logic of gup. Most important piece of code right here for gup

    15. #ifdef CONFIG_STACK_GROWSUP return vma_lookup(mm, addr); #else static volatile unsigned long next_warn; struct vm_area_struct *vma; unsigned long now, next; vma = find_vma(mm, addr); if (!vma || (addr >= vma->vm_start)) return vma; /* Only warn for half-way relevant accesses */ if (!(vma->vm_flags & VM_GROWSDOWN)) return NULL; if (vma->vm_start - addr > 65536) return NULL; /* Let's not warn more than once an hour.. */ now = jiffies; next = next_warn; if (next && time_before(now, next)) return NULL; next_warn = now + 60*60*HZ; /* Let people know things may have changed. */ pr_warn("GUP no longer grows the stack in %s (%d): %lx-%lx (%lx)\n", current->comm, task_pid_nr(current), vma->vm_start, vma->vm_end, addr); dump_stack(); return NULL;

      helper func to lookup vma(virtual mem area) that warns per hour about half way relevant acc and changes in stack

    16. static bool writable_file_mapping_allowed(struct vm_area_struct *vma, unsigned long gup_flags) { /* * If we aren't pinning then no problematic write can occur. A long term * pin is the most egregious case so this is the case we disallow. */ if ((gup_flags & (FOLL_PIN | FOLL_LONGTERM)) != (FOLL_PIN | FOLL_LONGTERM)) return true; /* * If the VMA does not require dirty tracking then no problematic write * can occur either. */ return !vma_needs_dirty_tracking(vma); }

      Def policy code. checks if we can write to a map

    17. if (*flags & FOLL_NOFAULT) return -EFAULT; if (*flags & FOLL_WRITE) fault_flags |= FAULT_FLAG_WRITE; if (*flags & FOLL_REMOTE) fault_flags |= FAULT_FLAG_REMOTE; if (*flags & FOLL_UNLOCKABLE) { fault_flags |= FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; /* * FAULT_FLAG_INTERRUPTIBLE is opt-in. GUP callers must set * FOLL_INTERRUPTIBLE to enable FAULT_FLAG_INTERRUPTIBLE. * That's because some callers may not be prepared to * handle early exits caused by non-fatal signals. */ if (*flags & FOLL_INTERRUPTIBLE) fault_flags |= FAULT_FLAG_INTERRUPTIBLE; } if (*flags & FOLL_NOWAIT) fault_flags |= FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_RETRY_NOWAIT; if (*flags & FOLL_TRIED) { /* * Note: FAULT_FLAG_ALLOW_RETRY and FAULT_FLAG_TRIED * can co-exist */ fault_flags |= FAULT_FLAG_TRIED; } if (unshare) { fault_flags |= FAULT_FLAG_UNSHARE; /* FAULT_FLAG_WRITE and FAULT_FLAG_UNSHARE are incompatible */ VM_BUG_ON(fault_flags & FAULT_FLAG_WRITE); } ret = handle_mm_fault(vma, address, fault_flags, NULL); if (ret & VM_FAULT_COMPLETED) { /* * With FAULT_FLAG_RETRY_NOWAIT we'll never release the * mmap lock in the page fault handler. Sanity check this. */ WARN_ON_ONCE(fault_flags & FAULT_FLAG_RETRY_NOWAIT); *locked = 0; /* * We should do the same as VM_FAULT_RETRY, but let's not * return -EBUSY since that's not reflecting the reality of * what has happened - we've just fully completed a page * fault, with the mmap lock released. Use -EAGAIN to show * that we want to take the mmap lock _again_. */ return -EAGAIN; } if (ret & VM_FAULT_ERROR) { int err = vm_fault_to_errno(ret, *flags); if (err) return err; BUG(); } if (ret & VM_FAULT_RETRY) { if (!(fault_flags & FAULT_FLAG_RETRY_NOWAIT)) *locked = 0; return -EBUSY; }

      Seems it's just setting flags for page faults based on flags param

    18. /* user gate pages are read-only */ if (gup_flags & FOLL_WRITE) return -EFAULT; if (address > TASK_SIZE) pgd = pgd_offset_k(address); else pgd = pgd_offset_gate(mm, address); if (pgd_none(*pgd)) return -EFAULT; p4d = p4d_offset(pgd, address); if (p4d_none(*p4d)) return -EFAULT; pud = pud_offset(p4d, address); if (pud_none(*pud)) return -EFAULT; pmd = pmd_offset(pud, address); if (!pmd_present(*pmd)) return -EFAULT; pte = pte_offset_map(pmd, address); if (!pte) return -EFAULT; entry = ptep_get(pte); if (pte_none(entry)) goto unmap; *vma = get_gate_vma(mm); if (!page) goto out; *page = vm_normal_page(*vma, address, entry); if (!*page) { if ((gup_flags & FOLL_DUMP) || !is_zero_pfn(pte_pfn(entry))) goto unmap; *page = pte_page(entry); } ret = try_grab_page(*page, gup_flags); if (unlikely(ret)) goto unmap;

      Most of these seem like sanity checks right up until line 897 i.e, 'if(!page)'* after which we seem to unmap the page.

    19. static struct page *follow_page_mask(struct vm_area_struct *vma, unsigned long address, unsigned int flags, struct follow_page_context *ctx) { pgd_t *pgd; struct mm_struct *mm = vma->vm_mm; ctx->page_mask = 0; /* * Call hugetlb_follow_page_mask for hugetlb vmas as it will use * special hugetlb page table walking code. This eliminates the * need to check for hugetlb entries in the general walking code. */ if (is_vm_hugetlb_page(vma)) return hugetlb_follow_page_mask(vma, address, flags, &ctx->page_mask); pgd = pgd_offset(mm, address); if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) return no_page_table(vma, flags); return follow_p4d_mask(vma, address, pgd, flags, ctx); }

      places mask after following page into pte

    20. struct page *follow_page(struct vm_area_struct *vma, unsigned long address, unsigned int foll_flags) { struct follow_page_context ctx = { NULL }; struct page *page; if (vma_is_secretmem(vma)) return NULL; if (WARN_ON_ONCE(foll_flags & FOLL_PIN)) return NULL; /* * We never set FOLL_HONOR_NUMA_FAULT because callers don't expect * to fail on PROT_NONE-mapped pages. */ page = follow_page_mask(vma, address, foll_flags, &ctx); if (ctx.pgmap) put_dev_pagemap(ctx.pgmap); return page; }

      finds page

    21. if (flags & FOLL_SPLIT_PMD) { spin_unlock(ptl); split_huge_pmd(vma, pmd, address); /* If pmd was left empty, stuff a page table in there quickly */ return pte_alloc(mm, pmd) ? ERR_PTR(-ENOMEM) : follow_page_pte(vma, address, pmd, flags, &ctx->pgmap); } page = follow_trans_huge_pmd(vma, address, pmd, flags); spin_unlock(ptl); ctx->page_mask = HPAGE_PMD_NR - 1; return page;

      we're finding the page again but storing page mask in ctx

    22. if (likely(!pmd_trans_huge(pmdval))) return follow_page_pte(vma, address, pmd, flags, &ctx->pgmap); if (pmd_protnone(pmdval) && !gup_can_follow_protnone(vma, flags)) return no_page_table(vma, flags); ptl = pmd_lock(mm, pmd); if (unlikely(!pmd_present(*pmd))) { spin_unlock(ptl); return no_page_table(vma, flags); } if (unlikely(!pmd_trans_huge(*pmd))) { spin_unlock(ptl); return follow_page_pte(vma, address, pmd, flags, &ctx->pgmap); }

      branch prediction to check if pmd is there and if it's big

    23. if (pmd_none(pmdval)) return no_page_table(vma, flags); if (!pmd_present(pmdval)) return no_page_table(vma, flags); if (pmd_devmap(pmdval)) { ptl = pmd_lock(mm, pmd); page = follow_devmap_pmd(vma, address, pmd, flags, &ctx->pgmap); spin_unlock(ptl); if (page) return page; }

      checks if pmd is there. im assuming it's page middle dir.

    24. /* FOLL_GET and FOLL_PIN are mutually exclusive. */ if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) == (FOLL_PIN | FOLL_GET))) return ERR_PTR(-EINVAL); ptep = pte_offset_map_lock(mm, pmd, address, &ptl); if (!ptep) return no_page_table(vma, flags); pte = ptep_get(ptep); if (!pte_present(pte)) goto no_page; if (pte_protnone(pte) && !gup_can_follow_protnone(vma, flags)) goto no_page; page = vm_normal_page(vma, address, pte); /* * We only care about anon pages in can_follow_write_pte() and don't * have to worry about pte_devmap() because they are never anon. */ if ((flags & FOLL_WRITE) && !can_follow_write_pte(pte, page, vma, flags)) { page = NULL; goto out; } if (!page && pte_devmap(pte) && (flags & (FOLL_GET | FOLL_PIN))) { /* * Only return device mapping pages in the FOLL_GET or FOLL_PIN * case since they are only valid while holding the pgmap * reference. */ *pgmap = get_dev_pagemap(pte_pfn(pte), *pgmap); if (*pgmap) page = pte_page(pte); else goto no_page; } else if (unlikely(!page)) { if (flags & FOLL_DUMP) { /* Avoid special (like zero) pages in core dumps */ page = ERR_PTR(-EFAULT); goto out; } if (is_zero_pfn(pte_pfn(pte))) { page = pte_page(pte); } else { ret = follow_pfn_pte(vma, address, ptep, flags); page = ERR_PTR(ret); goto out; } } if (!pte_write(pte) && gup_must_unshare(vma, flags, page)) { page = ERR_PTR(-EMLINK); goto out; } VM_BUG_ON_PAGE((flags & FOLL_PIN) && PageAnon(page) && !PageAnonExclusive(page), page); /* try_grab_page() does nothing unless FOLL_GET or FOLL_PIN is set. */ ret = try_grab_page(page, flags); if (unlikely(ret)) { page = ERR_PTR(ret); goto out; } /* * We need to make the page accessible if and only if we are going * to access its content (the FOLL_PIN case). Please see * Documentation/core-api/pin_user_pages.rst for details. */ if (flags & FOLL_PIN) { ret = arch_make_page_accessible(page); if (ret) { unpin_user_page(page); page = ERR_PTR(ret); goto out; } } if (flags & FOLL_TOUCH) { if ((flags & FOLL_WRITE) && !pte_dirty(pte) && !PageDirty(page)) set_page_dirty(page); /* * pte_mkyoung() would be more correct here, but atomic care * is needed to avoid losing the dirty bit: it is easier to use * mark_page_accessed(). */ mark_page_accessed(page); }

      finds page in pte. Judging by the complexity of the logic this is most likely policy code because we're literally getting user page

    25. void unpin_user_pages_dirty_lock(struct page **pages, unsigned long npages, bool make_dirty) { unsigned long i; struct folio *folio; unsigned int nr; if (!make_dirty) { unpin_user_pages(pages, npages); return; } sanity_check_pinned_pages(pages, npages); for (i = 0; i < npages; i += nr) { folio = gup_folio_next(pages, npages, i, &nr); /* * Checking PageDirty at this point may race with * clear_page_dirty_for_io(), but that's OK. Two key * cases: * * 1) This code sees the page as already dirty, so it * skips the call to set_page_dirty(). That could happen * because clear_page_dirty_for_io() called * page_mkclean(), followed by set_page_dirty(). * However, now the page is going to get written back, * which meets the original intention of setting it * dirty, so all is well: clear_page_dirty_for_io() goes * on to call TestClearPageDirty(), and write the page * back. * * 2) This code sees the page as clean, so it calls * set_page_dirty(). The page stays dirty, despite being * written back, so it gets written back again in the * next writeback cycle. This is harmless. */ if (!folio_test_dirty(folio)) { folio_lock(folio); folio_mark_dirty(folio); folio_unlock(folio); } gup_put_folio(folio, nr, FOLL_PIN); } }

      unpins and dirties page

    26. static inline struct folio *gup_folio_range_next(struct page *start, unsigned long npages, unsigned long i, unsigned int *ntails) { struct page *next = nth_page(start, i); struct folio *folio = page_folio(next); unsigned int nr = 1; if (folio_test_large(folio)) nr = min_t(unsigned int, npages - i, folio_nr_pages(folio) - folio_page_idx(folio, next)); *ntails = nr; return folio; }

      gets the folio of the next page from start to 'i' range. also gets the tail folio/reference

    27. else if (flags & FOLL_PIN) { /* * Don't take a pin on the zero page - it's not going anywhere * and it is used in a *lot* of places. */ if (is_zero_page(page)) return 0; /* * Similar to try_grab_folio(): be sure to *also* * increment the normal page refcount field at least once, * so that the page really is pinned. */ if (folio_test_large(folio)) { folio_ref_add(folio, 1); atomic_add(1, &folio->_pincount); } else { folio_ref_add(folio, GUP_PIN_COUNTING_BIAS); } node_stat_mod_folio(folio, NR_FOLL_PIN_ACQUIRED, 1); }

      Logic that actually tries to grab the folio. Also policy use code and not actual policy

    28. if (is_zero_page(page) || !folio_test_anon(folio)) continue; if (!folio_test_large(folio) || folio_test_hugetlb(folio))

      Sanity checks for pinned pages wouldn't classify as policy logic but common sense pre-checks for the actual policy. But I think it's worth tagging this to gain a sense of what is not policy code

  11. Sep 2024
    1. heterozygous c.G380A variant in GP1BA (NM_000173.7) (Figure 1B), resulting in a missense substitution of an arginine with a glutamine at position 127

      Disease: platelet-type von Willebrand disease (PT-VWD)

      Patient: 14 yo, Male

      Variant: GP1BA NM_000173.7:c.389G>A p.(Arg127Gln), Heterozygous, Gain-of-Function (GOF)

      Located in LRR5 domain of GP1BA

      Family: Mother did not refer any bleeding symptoms (variant absent in mother) Father not available for collection of clinical history or platelet function testing

  12. Jul 2024
  13. Mar 2024
  14. Feb 2024
  15. Jan 2024
    1. So organized, initiatives can collectively co-evolve and co-emerge into a purposeful transformation system oriented towards whole system change

      for - quote - whole system change - bottom up whole system change - open function SRG/ Deep Humanity/ Indyweb / Indranet / TPF framework - definition - transformation catalyst

      quote - (see below) - A transformation catalyst is an actor who - brings together numerous initiatives and actors around a shared and co-defined set of interests - with an action agenda in mind. - The TC stewards these actors through a set of three general (dialogue- and action-based) processes that can be adapted - to the unique context, needs, and interests - of each system and its players. - So organized, initiatives can collectively co-evolve and co-emerge - into a purposeful transformation system - oriented towards whole system change in a given context (which could happen - locally, - regionally, - bioregionally, or even more broadly - depending on the actors and orientations involved

    1. Instance methods Instances of Models are documents. Documents have many of their own built-in instance methods. We may also define our own custom document instance methods. // define a schema const animalSchema = new Schema({ name: String, type: String }, { // Assign a function to the "methods" object of our animalSchema through schema options. // By following this approach, there is no need to create a separate TS type to define the type of the instance functions. methods: { findSimilarTypes(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); } } }); // Or, assign a function to the "methods" object of our animalSchema animalSchema.methods.findSimilarTypes = function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); }; Now all of our animal instances have a findSimilarTypes method available to them. const Animal = mongoose.model('Animal', animalSchema); const dog = new Animal({ type: 'dog' }); dog.findSimilarTypes((err, dogs) => { console.log(dogs); // woof }); Overwriting a default mongoose document method may lead to unpredictable results. See this for more details. The example above uses the Schema.methods object directly to save an instance method. You can also use the Schema.method() helper as described here. Do not declare methods using ES6 arrow functions (=>). Arrow functions explicitly prevent binding this, so your method will not have access to the document and the above examples will not work.

      Certainly! Let's break down the provided code snippets:

      1. What is it and why is it used?

      In Mongoose, a schema is a blueprint for defining the structure of documents within a collection. When you define a schema, you can also attach methods to it. These methods become instance methods, meaning they are available on the individual documents (instances) created from that schema.

      Instance methods are useful for encapsulating functionality related to a specific document or model instance. They allow you to define custom behavior that can be executed on a specific document. In the given example, the findSimilarTypes method is added to instances of the Animal model, making it easy to find other animals of the same type.

      2. Syntax:

      Using methods object directly in the schema options:

      javascript const animalSchema = new Schema( { name: String, type: String }, { methods: { findSimilarTypes(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); } } } );

      Using methods object directly in the schema:

      javascript animalSchema.methods.findSimilarTypes = function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); };

      Using Schema.method() helper:

      javascript animalSchema.method('findSimilarTypes', function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); });

      3. Explanation in Simple Words with Examples:

      Why it's Used:

      Imagine you have a collection of animals in your database, and you want to find other animals of the same type. Instead of writing the same logic repeatedly, you can define a method that can be called on each animal instance to find similar types. This helps in keeping your code DRY (Don't Repeat Yourself) and makes it easier to maintain.

      Example:

      ```javascript const mongoose = require('mongoose'); const { Schema } = mongoose;

      // Define a schema with a custom instance method const animalSchema = new Schema({ name: String, type: String });

      // Add a custom instance method to find similar types animalSchema.methods.findSimilarTypes = function(cb) { return mongoose.model('Animal').find({ type: this.type }, cb); };

      // Create the Animal model using the schema const Animal = mongoose.model('Animal', animalSchema);

      // Create an instance of Animal const dog = new Animal({ type: 'dog', name: 'Buddy' });

      // Use the custom method to find similar types dog.findSimilarTypes((err, similarAnimals) => { console.log(similarAnimals); }); ```

      In this example, findSimilarTypes is a custom instance method added to the Animal schema. When you create an instance of the Animal model (e.g., a dog), you can then call findSimilarTypes on that instance to find other animals with the same type. The method uses the this.type property, which refers to the type of the current animal instance. This allows you to easily reuse the logic for finding similar types across different instances of the Animal model.

      Certainly! Let's go through each part and explain it in simple terms: ### 1. `this` in Mongoose: - **What is `this`?** In JavaScript, `this` refers to the current context or object. In Mongoose, particularly within methods and middleware functions, `this` represents the instance (document) the function is currently operating on. - **Why is it used?** `this` is used to access and modify the properties of the current document. For example, in a Mongoose method, `this` allows you to refer to the fields of the specific document the method is called on. ### 2. Example: Let's use the `userSchema.pre("save", ...)`, which is a Mongoose middleware, as an example: ```javascript userSchema.pre("save", async function (next) { if (!this.isModified("password")) { next(); } else { this.password = await bcrypt.hash(this.password, 10); next(); } }); ``` - **Explanation in Simple Words:** - Imagine you have a system where users can sign up and set their password. - Before saving a new user to the database, you want to ensure that the password is securely encrypted (hashed) using a library like `bcrypt`. - The `userSchema.pre("save", ...)` is a special function that runs automatically before saving a user to the database. - In this function: - `this.isModified("password")`: Checks if the password field of the current user has been changed. - If the password is not modified, it means the user is not updating their password, so it just moves on to the next operation (saving the user). - If the password is modified, it means a new password is set or the existing one is changed. In this case, it uses `bcrypt.hash` to encrypt (hash) the password before saving it to the database. - The use of `this` here is crucial because it allows you to refer to the specific user document that's being saved. It ensures that the correct password is hashed for the current user being processed. In summary, `this` in Mongoose is a way to refer to the current document or instance, and it's commonly used to access and modify the properties of that document, especially in middleware functions like the one demonstrated here for password encryption before saving to the database.

    Tags

    Annotators

    URL

  16. Dec 2023
    1. Measure Execution Time With time.thread_time()

      The time.thread_time() reports the time that the current thread has been executing.

      The time begins or is zero when the current thread is first created.

      Return the value (in fractional seconds) of the sum of the system and user CPU time of the current thread.

      It is an equivalent value to the time.process_time(), except calculated at the scope of the current thread, not the current process.

      This value is calculated as the sum of the system time and the user time.

      thread time = user time + system time

      The reported time does not include sleep time.

      This means if the thread is blocked by a call to time.sleep() or perhaps is suspended by the operating system, then this time is not included in the reported time. This is called a “thread-wide” or “thread-specific” time.

    2. Measure Execution Time With time.process_time()

      The time.process_time() reports the time that the current process has been executed.

      The time begins or is zero when the current process is first created.

      Calculated as the sum of the system time and the user time:

      process time = user time + system time

      System time is time that the CPU is spent executing system calls for the kernel (e.g. the operating system)

      User time is time spent by the CPU executing calls in the program (e.g. your code).

      When a program loops through an array, it is accumulating user CPU time. Conversely, when a program executes a system call such as exec or fork, it is accumulating system CPU time.

      The reported time does not include sleep time.

      This means if the process is blocked by a call to time.sleep() or perhaps is suspended by the operating system, then this time is not included in the reported time. This is called a “process-wide” time.

      As such, it only reports the time that the current process was executed since it was created by the operating system.

    3. Measure Execution Time With time.perf_counter()

      The time.perf_counter() function reports the value of a performance counter on the system.

      It does not report the time since epoch like time.time().

      Return the value (in fractional seconds) of a performance counter, i.e. a clock with the highest available resolution to measure a short duration. It does include time elapsed during sleep and is system-wide.

      The returned value in seconds with fractional components (e.g. milliseconds and nanoseconds), provides a high-resolution timestamp.

      Calculating the difference between two timestamps from the time.perf_counter() allows high-resolution execution time benchmarking, e.g. in the millisecond and nanosecond range.

      The timestamp from the time.perf_counter() function is consistent, meaning that two durations can be compared relative to each other in a meaningful way.

      The time.perf_counter() function was introduced in Python version 3.3 with the intended use for short-duration benchmarking.

      The perf_counter() function was specifically designed to overcome the limitations of other time functions to ensure that the result is consistent across platforms and monotonic (always increasing).

      For accuracy, the timeit module uses the time.perf_counter() internally.

    4. Measure Execution Time With time.time()

      The time.time() function reports the number of seconds since the epoch (epoch is January 1st 1970, which is used on Unix systems and beyond as an arbitrary fixed time in the past) as a floating point number.

      The result is a floating point value, potentially offering fractions of a seconds (e.g. milliseconds), if the platforms support it.

      The time.time() function is not perfect.

      It is possible for a subsequent call to time.time() to return a value in seconds less than the previous value, due to rounding.

      Note: even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a lower value than a previous call if the system clock has been set back between the two calls.

    1. because the value isn't there yet. A promise is just a marker that it will be available at some point in the future. You cannot convert asynchronous code to synchronous, though. If you order a pizza, you get a receipt that tells you that you will have a pizza at some point in the future. You cannot treat that receipt as the pizza itself, though. When you get your number called you can "resolve" that receipt to a pizza. But what you're describing is trying to eat the receipt.
  17. Nov 2023
    1. Grabe, Mark. “Student and Professional Note-Taking.” Substack newsletter. Mark’s Substack (blog), November 10, 2023. https://markgrabe.substack.com/p/student-and-professional-note-taking?publication_id=1857743&utm_campaign=email-post-title&r=77i35.

      Educator Mark Grabe looks at some different forms of note taking with respect to learning compared lightly with note taking for productivity or knowledge management purposes.

      Note taking for: - learning / sensemaking - personal knowledge management - productivity / projects - thesis creation/writing/other creative output (music, dance, etc.)

      Not taken into account here is the diversity of cognitive abilities, extent of practice (those who've practiced at note taking for longer are likely to be better at it), or even neurodiversity, which becomes an additional layer (potentially noise) on top of the research methodologies.

  18. Sep 2023
    1. I don't know why I can't do Evergreen and Atomic Notes.. .t3_16r8k0b._2FCtq-QzlfuN-SwVMUZMM3 { --postTitle-VisitedLinkColor: #9b9b9b; --postTitleLink-VisitedLinkColor: #9b9b9b; --postBodyLink-VisitedLinkColor: #989898; }

      reply to u/SouthernEremite at https://www.reddit.com/r/Zettelkasten/comments/16r8k0b/i_dont_know_why_i_cant_do_evergreen_and_atomic/

      If you're not using your notes to create or write material and only using them as a form of sensemaking, then perhaps you don't need to put as much work or effort into the permanent notes portion of the work? Ask yourself: "Why are you taking notes? What purpose do they serve?" Is the form and level you're making them in serving those purposes? If not, work toward practicing to make those two align so that your notes are serving an actual purpose for you. Anything beyond this is make-work and you could spend your time more profitably somewhere else.

  19. Jun 2023
    1. The function symbol notation is the least used notational system in jazz. As the namesuggests, this notation specifies the harmonic function of individual chords and evencomplete chord progressions. It has the potential of being useful to notate specificbehaviors of chords that may not—at least, not on the surface level—indicate that theybelong to a particular functional family of chords. As such, function symbols enable theperception of harmonic progressions from a more structural perspective. Function symbolsindicate neither the architecture nor the specific scale degrees of chords. This style ofnotation is more conceptual than it is representative of a specific surface event. The termssurface level and structural level are used to describe musical events and the degree oftheir importance. “Structural” events occur beneath the musical “surface” and areresponsible for the overall tonal, harmonic, and melodic forces controlling the piece.Function symbols use three labels: T for tonic-type chords, PD for predominant-typechords, and D for dominant-type chords.
    2. harmonic functioncan be defined as a contextual feature that can be attributed to a chord, a family of chords,harmonic progressions, or even to complete melodic phrases. These features are uniquefor each of the following functions: the tonic, the predominant, and the dominant. Theinteraction between these three creates a system of functional tonality, which undergirdsthe structure of tonal jazz and common-practice music
  20. Apr 2023
    1. Daniel Schmachtenberger has spoken at length about the ‘generator functions’ of existential risk, in essence the deeper driving causes.

      Definition - generator function of existential risk - the deeper driving cause of existential risk - two examples of deep causes - rivalrous dynamics - complicated systems consuming their complex substrate

      Claim - Alexander Beiner claims that - the generator function of these generator functions is physicalism

  21. Mar 2023
  22. Dec 2022
    1. His note taking technique has a high distraction potential and is time consuming.

      highlight from https://www.reddit.com/user/ManuelRodriguez331/ <br /> https://www.reddit.com/r/Zettelkasten/comments/zigwo3

      Anecdotal evidence of how some might view zettelkasten note-taking practices, particularly when they have no end goal or needs in mind.

      Form follows function

      /comment/izs0u3b/?utm_source=reddit&utm_medium=web2x&context=3

  23. Nov 2022
    1. phytoncides, antibacterial and antimicrobial substances that trees and other plants release into the air to help them fight diseases and harmful organisms. When humans breathe in these substances—typically by spending time in nature—their health can improve. Across several studies, phytoncides have been shown to boost immune function, increase anticancer protein production, reduce stress hormones, improve mood, and help people relax. 

      I always feel better during and after a forest walk.

  24. Sep 2022
    1. IntertextsAs Jonathan Culler writes: “Liter-ary works are not to be consideredautonomous entities, ‘organicwholes,’ but as intertextual con-structs: sequences which havemeaning in relation to other textswhich they take up, cite, parody,refute, or generally transform.” ThePursuit of Signs (Ithaca, NY: CornelUniversity Press, 1981), 38.

      Throughout Rewriting: How To Do Things With Texts (Utah State University Press, 2006) Joseph Harris presents highlighted sidebar presentations he labels "Intertexts".

      They simultaneously serve the functions of footnotes, references, (pseudo-)pull quotes, and conversation with his own text. It's not frequently seen this way, but these intertexts serve the function of presenting his annotations of his own text to model these sorts of annotations and intertextuality which he hopes the reader (student) to be able to perform themselves. He explicitly places them in a visually forward position within the text rather than hiding them in the pages' footnotes or end notes where the audience he is addressing can't possibly miss them. In fact, the reader will be drawn to them above other parts of the text when doing a cursory flip through the book upon picking it up, a fact that underlines their importance in his book's thesis.


      This really is a fantastic example of the marriage of form and function as well as modelling behavior.


      cc: @remikalir

  25. Aug 2022
  26. Jul 2022
  27. Jun 2022
    1. <?php$base = array("orange", "banana", "apple", "raspberry");$replacements = array(0 => "pineapple", 4 => "cherry");$replacements2 = array(0 => "grape");$basket = array_replace($base, $replacements, $replacements2);print_r($basket);?> The above example will output: Array ( [0] => grape [1] => banana [2] => apple [3] => raspberry [4] => cherry )

      array_replace() replaces the values of array with values having the same keys in each of the following arrays.

  28. May 2022
  29. www-ncbi-nlm-nih-gov.proxy-bloomu.klnpa.org www-ncbi-nlm-nih-gov.proxy-bloomu.klnpa.org
    1. DICER1 variants cause a hereditary cancer predisposition

      -Gene: DICER1 -PMID: 29343557 -Inheritance Pattern: DICER1 is inherited as an autosomal dominant condition with decreased penetrance -Disease Entity: earlier onset disease, multisite disease, 0-2 site disease, cystic lung disease, familial disease, bilateral disease, stage IA/IB, bilateral disease -mutation: germline loss-of-function mutation, missense mutation, Intronic mutations, hotspot mutation, second somatic mutation, truncating mutations, biallelic mutation -zygosity: heterozygosity -Family History: -testing should be considered for those with a family history of DICER1-associated conditions so that appropriate surveillance can be undertaken. -Individuals at 50% risk of a germline pathogenic variant based on family history who do not pursue genetic testing should follow surveillance guidelines as -if they have a DICER1 mutation unless/until genetic testing confirms that they did not inherit the familial mutation When a pulmonary cyst is identified in a young child with a pathogenic germline -DICER1 variant or family history of a DICER1-associated condition, it should be assumed to be Type I PPB until proven otherwise

      Other Information: -Case: Risk for most DICER1-associated neoplasms is highest in early childhood and decreases in adulthood -affected phenotype may simply result from probabilities of generating the characteristic “loss-of-function plus hotspot” two hit typical of a DICER1 syndrome neoplasm. -Caseprevioustesting: presymptomatic testing of a minor child, should be discussed and factored into the decision process, as some individuals may choose, and have the right to choose, not to know their/their child’s genetic status. -gnomAD: n/a

  30. Apr 2022
    1. All of the major books that were to follow – Sade /Fourier / Loyola (1997), The Pleasure of the Text (1975), RolandBarthes by Roland Barthes (1977), A Lover’s Discourse (1990), andCamera Lucida (1993) – are texts that are ‘plural’ and ‘broken’, andwhich are ‘constructed from non-totalizable fragments and fromexuberantly proliferating “details”’ (Bensmaïa, 1987: xxvii-xxxviii).In all of the above cases the fragment becomes the key unit ofcomposition, with each text structured around the arrangement ofmultiple (but non-totalisable) textual fragments.

      Does the fact that Barthes uses a card index in his composition and organization influence the overall theme of his final works which could be described as "non-totalizable fragments"?

  31. Mar 2022
  32. Feb 2022
  33. Jan 2022
    1. My gut told me calling an async function from the setTimeout callback was a bad thing. Since the setTimeout machinery ignores the return value of the function, there is no way it was awaiting on it. This means that there will be an unhandled promise. An unhandled promise could mean problems if the function called in the callback takes a long time to complete or throws an error.
    1. const originalUnhandledRejection = window.onunhandledrejection; window.onunhandledrejection = (e) => { console.log('we got exception, but the app has crashed', e); // or do Sentry.captureException(e); originalUnhandledRejection(e); }
  34. www.npmjs.com www.npmjs.com
  35. Nov 2021
  36. Oct 2021
  37. Jul 2021
    1. Keerthivasan, S., Şenbabaoğlu, Y., Martinez-Martin, N., Husain, B., Verschueren, E., Wong, A., Yang, Y. A., Sun, Y., Pham, V., Hinkle, T., Oei, Y., Madireddi, S., Corpuz, R., Tam, L., Carlisle, S., Roose-Girma, M., Modrusan, Z., Ye, Z., Koerber, J. T., & Turley, S. J. (2021). Homeostatic functions of monocytes and interstitial lung macrophages are regulated via collagen domain-binding receptor LAIR1. Immunity, 54(7), 1511-1526.e8. https://doi.org/10.1016/j.immuni.2021.06.012

  38. Jun 2021
    1. The problem is, algorithms were never designed to handle such tough choices. They are built to pursue a single mathematical goal, such as maximizing the number of soldiers’ lives saved or minimizing the number of civilian deaths. When you start dealing with multiple, often competing, objectives or try to account for intangibles like “freedom” and “well-being,” a satisfactory mathematical solution doesn’t always exist.

      We do better with algorithms where the utility function can be expressed mathematically. When we try to design for utility/goals that include human values, it's much more difficult.

  39. May 2021
  40. Apr 2021
    1. Other physicists and mathematicians at the turn of the century came close to arriving at what is currently known as spacetime. Einstein himself noted, that with so many people unraveling separate pieces of the puzzle, "the special theory of relativity, if we regard its development in retrospect, was ripe for discovery in 1905."

      Interesting. This acts as evidence for the hypothesis that environments/conditions are powerful forcing functions.

      It also acts as evidence against the argument of the "lone genius".

  41. Mar 2021